第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 ・・・新着記事一覧を見る
シートコピー後のアクティブシートは何か|ツイッター出題回答 (2023-09-19)
Excel関数の引数を省略した場合について|ツイッター出題回答 (2023-09-14)
セル個数を返すRange.CountLargeプロパティとは|VBA技術解説(2023-09-08)
記号を繰り返してグラフ作成(10単位で折り返す)|ツイッター出題回答 (2023-08-28)
シートを削除:不定数のシート名に対応|VBAサンプル集(2023-08-24)
ランクによりボイントを付ける(同順位はポイントを分割)|ツイッター出題回答 (2023-08-22)
OneDrive使用時のThisWorkbook.Pathの扱い方|VBA技術解説(2023-07-26)
列幅不足による###表示や指数表示を判定する|VBA技術解説(2023-07-12)
シートを削除:不定数のシート名に対応|VBAサンプル集(2023-07-04)
シート関数のCOUNTIFS,SUMIFS,MAXIFSと同じ処理|Power Query(M言語)入門(2023-02-28)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.マクロとは?VBAとは?VBAでできること|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.条件分岐(IF)|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。