第125回.Worksheetのイベントプロシージャー
Worksheetのイベントプロシージャーは、ワークシートまたはそのセルに対し特定の操作(これがイベント)が行われた時に実行されます。
イベントは、手動でもVBAでも、どちらで操作が行われても発生します。
Worksheetのイベント
| イベント | 発生条件等 |
| Activate | ブック、ワークシート、グラフ シート、または埋め込みグラフがアクティブになったときに発生します。 |
| BeforeDoubleClick | 既定のダブルクリックの操作の前に、ワークシートをダブルクリックしたときに発生します。 |
| BeforeRightClick | 既定の右クリックの操作の前に、ワークシートを右クリックしたときに発生します。 |
| Calculate | ワークシートを再計算した後に Worksheet オブジェクトで発生します。 |
| Change | ワークシートのセルがユーザーまたは外部リンクにより変更されたときに発生します。 |
| Deactivate | グラフ、ワークシート、またはブックが非アクティブになったときに発生します。 |
| FollowHyperlink | ワークシートのハイパーリンクをクリックすると発生します。アプリケーション レベルおよびブック レベルでのイベントについては、SheetFollowHyperlink イベントおよび SheetFollowHyperlink Event イベントのヘルプ トピックを参照してください。 |
| PivotTableAfterValueChange | ピボットテーブル内のセルまたはセル範囲が編集または再計算された後に発生します (数式を含むセルの場合)。 |
| PivotTableBeforeAllocateChanges | ピボットテーブルに変更が適用される前に発生します。 |
| PivotTableBeforeCommitChanges | ピボットテーブルの OLAP データ ソースに対する変更が適用される前に発生します。 |
| PivotTableBeforeDiscardChanges | ピボットテーブルに対する変更が破棄される前に発生します。 |
| PivotTableChangeSync | ピボットテーブルが変更された後に発生します。 |
| PivotTableUpdate | ピボットテーブル レポートがワークシート上で更新された後で発生します。 |
| SelectionChange | ワークシートで選択範囲を変更したときに発生します。 |
| BeforeDelete | ワークシートが削除される前に発生します。 ※Excel2013以降 |
| LensGalleryRenderComplete | 引き出し線ギャラリーのアイコン (動的および静的) の表示が完了したときに発生します。 ※Excel2013以降 |
| TableUpdate | データモデルに接続されたクエリテーブルがワークシートで更新された後に発生します。 ※Excel2013以降 |
Worksheetのイベントで代表的な、
BeforeDoubleClick
BeforeRightClick
Change
SelectionChange
以上について解説します。
イベントプロシージャー追加のVBE操作
コード表示
・右クリックから「コードの表示」
・ダブルクリック
プロシージャーの作成
左側のドロップダウンがオブジェクトの選択で、
右側のドロップダウンがイベントの選択になります。


オブジェクトにより既定のイベントは違いますので、目的のイベント以外が挿入された場合は、
右側のイベントのドロップダウンから目的のイベントを選択してください。

引数が必要な場合はその引数も含めて自動的にイベントプロシージャーが追加されます。

Activate:Worksheetのイベント
手動で開く場合でも、VBAで開く場合でも起動されます。
Private Sub Worksheet_Activate()
Application.Goto ActiveSheet.Range("A1"), True
End Sub
BeforeDoubleClick:Worksheetのイベント
手動で開く場合でも、VBAで開く場合でも起動されます。
Target
Cancel
Trueを入れると、ダブルクリックがキャンセルされます。
具体的には、Trueを入れることでダブルクリックでセルの編集状態になるのを防ぐことが出来ます。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
With Target
.Columns.AutoFit
.Rows.AutoFit
End With
End Sub
上記の例では、ダブルクリックによって、列幅・行高が調整された後、
通常のダブルクリックであるセル編集状態となります。
セル編集状態にしたくない場合は、
Cancel = True
この記述を入れます。
BeforeRightClick:Worksheetのイベント
手動で開く場合も、VBAで開く場合でも起動されます。
Target
Cancel
Trueを入れると、右クリックがキャンセルされます。
Change:Worksheetのイベント
Private Sub Worksheet_Change(ByVal Target As Range)
Target
変更されたセルが、Rangeオブジェクトとして渡されます。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myRng As Range
Application.EnableEvents = False
For Each myRng In Target
If Not Intersect(myRng, Columns("A")) Is Nothing Then
myRng.Value = UCase(myRng.Value)
End If
Next
Application.EnableEvents = True
End Sub
Application.EnableEvents = False
これで、新たなイベント発生を抑止しています。
このがないと、VBAでセル値を変更しても、新たにWorksheet_Changeが実行されてしまいます。
結果的に、イベントの連鎖が起こり、エラーとなります。
Application.EnableEvents = True
これで、新たなイベント発生が発生するようにしています。
これを入れ忘れると、プロシージャー終了後も、新たなイベントが発生しないままになります。
SelectionChange:Worksheetのイベント
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Target
選択されたセルが、Rangeオブジェクトとして渡されます。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim myRng As Range
Set myRng = Range("A2:D100")
myRng.Interior.ColorIndex = xlNone
If Not Intersect(myRng, Target(1)) Is Nothing Then
Cells(Target(1).Row, myRng(1).Column).Resize(, 5).Interior.Color = RGB(150, 200, 255)
End If
End Sub
全てのシートまたは複数のシートに対するイベント
複数シートや全てのシートでイベントを捕捉したい場合は、それぞれのシートモジュールに記載する必要が出てきます。
そのような場合は、Workbookのイベント を使用してください。
Workbookのイベントは全てのシートが対象となり、引数にイベントが発生したシートオブジェクトが入ってきます。
適宜、対象シートを判定することで、特定の複数シートの処理にも対応が可能となります。
同じテーマ「マクロVBA入門」の記事
第122回.Shell関数
第123回.APIについて(Win32API)
第124回.Workbookのイベントプロシージャー
第125回.Worksheetのイベントプロシージャー
第130回.テーブル操作の概要(ListObject)
第131回.テーブル操作のVBAコード(ListObject,DataBodyRange)
第142回.テーブル全件処理とデータ最終行(ListObject,DataBodyRange)
第127回.他のブックのマクロを実行(Runメソッド)
第128回.マクロをショートカットで起動(OnKeyメソッド)
第129回.レジストリの操作(SaveSetting,GetSetting,GetAllSettings,DeleteSetting)
第133回.引数の数を可変にできるパラメーター配列(ParamArray)
新着記事NEW ・・・新着記事一覧を見る
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)
IFS関数をVBAで入力するとスピルに関係なく「@」が付く現象について|VBA技術解説(2025-12-23)
数値を記号の積み上げでグラフ化する(■は10、□は1)|エクセル練習問題(2025-12-09)
AI時代におけるVBAシステム開発に関する提言|生成AI活用研究(2025-12-08)
GrokでVBAを作成:条件付書式を退避回復するVBA|エクセル雑感(2025-12-06)
顧客ごとの時系列データから直前の履歴を取得する|エクセル雑感(2025-11-28)
ちょっと悩むVBA厳選問題|エクセル雑感(2025-11-28)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.マクロとは?VBAとは?VBAでできること|VBA入門
10.条件分岐(Select Case)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.
