【Excel VBA】イベントでエラーが出るときの原因と対処法まとめ|SelectionChangeとChangeの違いも解説

「ExcelでVBAのイベントを使って、操作を自動化したい!」
そう思って Worksheet_SelectionChangeWorksheet_Change を使ってみたものの…

  • 「実行時エラー’13’:型が一致しません」と表示されて動かない

  • 貼り付けや選択操作のたびにマクロが勝手に動いて困る

  • どのイベントを使えばいいのかわからない

そんな経験はありませんか?

VBAのイベントはとても強力な機能ですが、正しく使わないと予期しないタイミングで発動したり、実行時エラーが発生してしまうこともよくあります。
特に初心者の方にとっては、「何がきっかけで動くのか」「なぜエラーになるのか」が分かりづらいものです。

本記事では、よく使われる SelectionChangeChange イベントの違いや使い分け、
実行時エラーを回避するための条件設定、イベントの発動を一時的に止める方法など、イベント処理を安全・安定に動かすためのポイントをわかりやすく解説します。

「なんとなくコピペで使っていたけど、よくエラーが出る…」という方にも、すぐに役立つ内容です。
VBAをもっと安心して使いたい方は、ぜひ参考にしてみてください。

VBAイベントって何?SelectionChangeやChangeの役割とは

まずは「VBAのイベントってそもそも何?」というところから、基本を押さえておきましょう。

VBAのイベントとは?

Excelでの「イベント」とは、ユーザーの操作やワークシート上で起こる動作に反応して自動で実行されるVBAコードのことです。

たとえば、以下のような「動作」がイベントのきっかけになります:

  • セルをクリック・選択した(SelectionChange)

  • セルの値が変更された(Change)

  • シートを切り替えた(Activate/Deactivate)

  • ワークブックを開いた、保存した(Workbook_Open/Workbook_BeforeSave)など

イベントをうまく活用すれば、「決まった操作を自動で処理する」便利な仕組みが作れるようになります。


広告

よく使われるイベント:SelectionChangeとChangeの違い

Excel VBAでよく使われるのが、次の2つのイベントです。

◆ Worksheet_SelectionChange(ByVal Target As Range)

広告

◆ Worksheet_Change(ByVal Target As Range)

  • セルの内容が変更されたときに実行されるイベント

  • 数式やデータの入力、削除などで反応

  • 例:セルの値を変えたら背景色を変える など


違いをひとことで言うと?

イベント名 きっかけ 主な用途例
SelectionChange セルを選んだとき クリックで✓マークを切り替える など
Change セルの中身が変わったとき 入力された値によって書式や処理を変更する など

この2つはとても便利ですが、処理の中で値を書き換えたり、別のセルを選択したりすると再びイベントが発動してしまうという注意点があります。

そのため、次の章では「よくあるエラーの原因と対策」について詳しく解説していきます。

第2章:よくあるエラーとその原因

VBAのイベントを使っていると、突然「実行時エラー ’13’:型が一致しません」や「オブジェクトが設定されていません」といったメッセージが表示されることがあります。

特に SelectionChangeChange イベントを使っているときは、思わぬ操作でイベントが発動し、想定していない値や型のデータを扱ってしまうことで、エラーが起こりやすくなります。


実行時エラー ’13’(型が一致しません)の原因とは?

このエラーは、「文字列を想定していたのに数値が入っていた」「空白セルを比較しようとした」など、データの型が一致していないときに発生します。

たとえばこんなケースで起こります:

If Target.Value = "○" Then

この1行でも、以下のような状態だとエラーが出る可能性があります。

  • 複数のセルを選択していた(Rangeが複数)

  • 対象セルが空白や数式セルだった

  • 対象が図形やオブジェクトなど、セル以外だった


その他によくあるエラー・予期しない動作の例

状況 原因と対策
セルをコピー&ペーストしたらイベントが大量に動いた 値の変更や選択が一度に多数発生するため。If Target.CountLarge > 1 Then Exit Sub で防止
何もしていないのにエラーになる 結合セル・非表示セル・図形をクリックしている可能性あり。イベントの条件を限定することで回避
Target.Value を読み込もうとしてエラー 数式エラーセル(#DIV/0!など)やエラー型のデータが原因。If IsError(Target.Value) を挟むと安全

エラーを防ぐために最低限入れておきたい安全装置

'複数セル選択を無視
If Target.CountLarge > 1 Then 
   Exit Sub 
Else
     'イベント処理
End if

'エラー値がある場合は無視
If IsError(Target.Value) Then 
   Exit Sub 
Else
     'イベント処理
End if

'範囲外(セル"B2:B10"以外)を無視 
If Intersect(Target, Range("B2:B10")) Is Nothing Then 
   Exit Sub 
Else
     'イベント処理
End if

これらをイベントの最初に書いておくことで、予期せぬ動作やエラーを大きく減らすことができます。

エラー回避例のサンプルコードはこちら
対象のセルをクリックするとチェックボックスのようにチェックマークが表示・非表示されるコードです。
複数セルを選択した際に、エラー回避するコードを設定しています。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

  'エラー回避:複数セル選択を無視
 If Target.CountLarge > 1 Then
    Exit Sub '複数セル選択を無視
  Else

  'セルB2:B11を選択したら処理実行
  If Not Intersect(Target, Range("B2:B11")) Is Nothing Then
    '選択した場所の値が?マークだったら空欄に、空欄だったら?マークに変更
    If Target.Value = ChrW(10003) Then
      Target.Value = ""
    Else
      Target.Value = ChrW(10003)
    End If
  End If
End If

End Sub

補足:他のマクロと干渉して無限ループになることも?

イベントの中でセルの値を変更したり、他のマクロと連携させて動かしている場合、
**意図せずイベントが繰り返し発動してしまい、処理が止まらなくなる(=無限ループ)**ことがあります。

特に Worksheet_ChangeSelectionChange では、処理の中でセルの内容を変更すると、それが再びイベントのきっかけになってしまうため注意が必要です。


※こうした「イベントの暴発」を防ぐには、Application.EnableEvents を使って発動を一時的に止める方法が有効です。
詳しくは次章でご紹介します。

イベントの暴発を防ぐには?安全にコントロールする方法

VBAイベントは便利ですが、うっかりすると何度も勝手に発動してしまい、想定外の動作やエラーにつながることがあります。
特に、イベントの中でセルの値を変更したり、シートの内容を書き換える処理を行うと、それが再びイベントのトリガーになってしまい、暴発(連続実行)状態になってしまうのです。


EnableEventsでイベント発動を一時的に止める

そんなときに活躍するのが、Application.EnableEvents という設定です。
これは「イベントの自動実行を一時的に無効化する」という命令で、マクロの中で次のように使います。

Application.EnableEvents = False 
 ' イベントの中で実行したい処理(セルの値の変更など)
Application.EnableEvents = True

このように一時的に無効にすることで、イベント内で発生するイベントの再発動を防ぐことができます。


注意点:EnableEventsは「戻し忘れ」が危険!

EnableEvents = False を設定したあと、何らかの理由で True に戻す処理が実行されないと、以降のイベントが一切動かなくなってしまいます。

たとえば以下のような状況です:

  • エラーで途中終了した

  • 途中で Exit SubExit Function などで処理が終わった

  • True に戻すコードを記述し忘れた

これを防ぐためには、On Error ステートメントと組み合わせることが大切です。


 安全なイベント無効化の書き方(おすすめ)

Private Sub Worksheet_Change(ByVal Target As Range)
 On Error GoTo ExitHandler
 Application.EnableEvents = False

 ' ここに処理を記述(セルの変更など) 
 ExitHandler: 
Application.EnableEvents = True 
End Sub

このように「最後に必ず True に戻す」構成を徹底することで、イベントが停止したままになるリスクを防ぐことができます。


どんなときに使うと効果的?

  • セルの値をマクロで書き換える処理をイベント内に含めるとき

  • 条件によって別のイベントを間接的に呼び出すことがあるとき

  • 他のマクロやフォーム操作と組み合わせるとき


イベントは強力な機能ですが、**「条件をしっかり制限して発動させること」と、「EnableEventsで再発動を制御すること」**が安全運用のコツです。
次の章では、これまでの内容をまとめつつ、使いやすいイベント設計の考え方をご紹介します。

まとめ:イベントは便利だけど慎重に使うのがポイント!

Excel VBAのイベント機能は、使いこなせると非常に便利です。
セルを選択したときや値を変更したときに自動で処理を実行できるため、手間を省いたり、操作ミスを防いだりすることができます。

しかしその反面、

  • 何もしていないのに勝手に動く

  • 予期せぬタイミングでエラーが出る

  • 他のマクロと干渉して無限ループになる

といったトラブルに繋がりやすいのも事実です。


この記事では、特に使用頻度の高い SelectionChangeChange イベントに注目し、

  • それぞれの動作の違い

  • よくあるエラーの原因と対策

  • 安全に運用するためのコードの書き方(条件制御・EnableEvents)

  • 他のマクロとの干渉によるループ対策

について、初心者の方にもわかりやすく解説してきました。


イベント処理は少し難しそうに見えるかもしれませんが、**「条件を明確に絞る」「安全装置を入れる」「動作をテストしながら調整する」**ことで、安心して使えるようになります。

まずは小さな処理からイベントを取り入れて、徐々に活用範囲を広げていくのがおすすめです。


今後は WorkbookイベントEnableEventsの詳しい活用法 など、より深い使い方についても別記事でご紹介していく予定です。
ぜひそちらもあわせてチェックしてみてください!

NO IMAGE