• ベストアンサー

エクセル:Worksheet_Changeのエラー回避

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 は使いたくないです。 (勝手な印象ですが、なんかエラーを無視してるみたいで落ち着かない…)

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

> 「アプリケーション定義またはオブジェクト定義のエラーです」という > エラーで止まってしまいます。 行全体を削除すると、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 は「使わざるを得ない」と思う 場所以外では使うべきではありません。私見でした。

tktk1228
質問者

お礼

回答ありがとうございます。 エラーの原因もわかりました。 (わかってもそのまま解決のコードまで導けはしないですが) Intersectは以前質問した時にも教えていただきましたが、 いまいち理解できてないようで巧く使えていません。 #3のコードの方がわかりやすくて助かります。 On Error Resume Next は、問答無用で止まらなくなるから、 技術無い今は特に楽なんですけどねぇ。

その他の回答 (3)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

#3 ですが、 Target.Count は Target.Columns.Count に置き換えてください。 お騒がせしました。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

ごめんなさい。#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

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.2

If Target.Columns.Count = 1 Then   If Target.Column = 1 Then     Target.Offset(0, 1).Interior.ColorIndex = 5   End If End If でいかがでしょうか?

tktk1228
質問者

お礼

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

関連するQ&A

専門家に質問してみよう