プロが教える店舗&オフィスのセキュリティ対策術

A列のセルに数字(数字かどうかの判断は無くて良い)が入ったらその隣のセルを青で塗りつぶす、
といったマクロを組んでいます。

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 1 Then
Target.Offset(0, 1).Interior.ColorIndex = 5
End if

End sub

以上をシートに直接(←呼び方がわかりません。「標準モジュール」ではない所)書込んだら動作しました。
このコードだと、行を削除した時に、
「アプリケーション定義またはオブジェクト定義のエラーです」というエラーで止まってしまいます。
A列のセルに変更があったけど塗るセルが無いから、とかそれっぽい理由は思いつくのですが、
どのように書けばエラーを回避(セルが無い場合は***、みたいな記述でしょうか)できるでしょうか。
なるべく
On Error Resume Next
は使いたくないです。
(勝手な印象ですが、なんかエラーを無視してるみたいで落ち着かない…)

A 回答 (4件)

> 「アプリケーション定義またはオブジェクト定義のエラーです」という


> エラーで止まってしまいます。

行全体を削除すると、Target は行全体になりますよね。Excel2003 まで
なら 256列分全てです。

その Target を Offset でひとつ横にずらそうとしても、257列目は
存在しないので、エラーになります。

このような場合は、Intersect メソッドを使います。

Private Sub Worksheet_Change(ByVal Target As Range)
  
  Dim rTmp As Range
  Dim r  As Range
  
  ' // Target と A列 で重なる部分(Range)を Intersect メソッドで
  ' // 参照してみます
  Set rTmp = Intersect(Target, Columns("A"))
  If Not rTmp Is Nothing Then
    ' // 参照できる部分があった場合
    Application.ScreenUpdating = False
    ' // 複数セルに対応するためには、「セル単位」または「セルの選択
    ' // ブロック単位」でループ処理させる必要があります
    ' // 今回は Areas を使って「セルの選択ブロック単位」で処理します
    For Each r In rTmp.Areas
      r.Offset(0, 1).Interior.ColorIndex = 5
    Next
    ' // オブジェクト変数は使い終わったらクリアします
    Set rTmp = Nothing
  End If

End Sub

以下は余談です。

> 勝手な印象ですが、なんかエラーを無視してるみたいで落ち着かない…

それで良いと思います。ロジックで対応できるものを安易に On Error
Resume Next していては、エラーをコントロールするプログラム力が
身につきません。On Error Resume Next は「使わざるを得ない」と思う
場所以外では使うべきではありません。私見でした。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
エラーの原因もわかりました。
(わかってもそのまま解決のコードまで導けはしないですが)

Intersectは以前質問した時にも教えていただきましたが、
いまいち理解できてないようで巧く使えていません。
#3のコードの方がわかりやすくて助かります。

On Error Resume Next は、問答無用で止まらなくなるから、
技術無い今は特に楽なんですけどねぇ。

お礼日時:2007/07/03 20:25

#3 ですが、



Target.Count は Target.Columns.Count に置き換えてください。
お騒がせしました。
    • good
    • 1

ごめんなさい。

#1 を試してみたら Excel がフリーズしますね。。

こんな感じではどうですか?

Private Sub Worksheet_Change(ByVal Target As Range)

  If Target.Column = 1 And Target.Count < Columns.Count Then
    Target.Offset(0, 1).Interior.ColorIndex = 5
  End If

End Sub
    • good
    • 0

If Target.Columns.Count = 1 Then


  If Target.Column = 1 Then
    Target.Offset(0, 1).Interior.ColorIndex = 5
  End If
End If
でいかがでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

正常に動作しました。
実際に作りたいコードでは判断するのはA列だけではないのですが、
If Target.Columns.Count = 1 Thenを弄ることによって、こちらも動作を確認しました。

ありがとうございました。

お礼日時:2007/07/03 20:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A