第125回.Worksheetのイベントプロシージャー
Worksheetのイベントプロシージャーは、ワークシートまたはそのセルに対し特定の操作(これがイベント)が行われた時に実行されます。
イベントは、手動でもVBAでも、どちらで操作が行われても発生します。
Worksheetのイベントプロシージャーの一覧紹介と主要なイベントについて解説します。
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のイベントで代表的な、
Activate
BeforeDoubleClick
BeforeRightClick
Change
SelectionChange
以上について解説します。
イベントプロシージャー追加のVBE操作
・メニューの「表示」→「コード」
・右クリックから「コードの表示」
・ダブルクリック
いずれかでコードを表示します。
左側のドロップダウンがオブジェクトの選択で、
右側のドロップダウンがイベントの選択になります。


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

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

Activate:Worksheetのイベント
手動で開く場合も、VBAで開く場合でも起動されます。
Private Sub Worksheet_Activate()
Private Sub Worksheet_Activate()
Application.Goto ActiveSheet.Range("A1"), True
End Sub
BeforeDoubleClick:Worksheetのイベント
手動で開く場合も、VBAで開く場合でも起動されます。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Target
ダブルクリックされたセルが、Rangeオブジェクトとして渡されます。
Cancel
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で開く場合でも起動されます。
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Target
右クリックされたセルが、Rangeオブジェクトとして渡されます。
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
これで、新たなイベント発生を抑止しています。
このがないと、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のイベント を使用してください。
適宜、対象シートを判定することで、特定の複数シートの処理にも対応が可能となります。
同じテーマ「VBA入門」の記事
第122回.Shell関数
第123回.APIについて(Win32API)
第124回.Workbookのイベントプロシージャー
第125回.Worksheetのイベントプロシージャー
第126回.入力規則(Validation)
第127回.他のブックのマクロを実行(Runメソッド)
第128回.マクロをショートカットで起動(OnKeyメソッド)
第129回.レジストリの操作(SaveSetting,GetSetting,GetAllSettings,DeleteSetting)
第130回.テーブル操作の概要(ListObject)
第131回.テーブル操作のVBAコード(ListObject)
第132回.その他のExcel機能(グループ化、重複の削除、オートフィル等)
新着記事NEW ・・・新着記事一覧を見る
トランザクション処理|SQL入門(12月11日)
インデックスを作成して高速化(CREATE INDEX)|SQL入門(12月9日)
他のテーブルのデータで追加/更新/削除|SQL入門(12月8日)
データの削除(DELETE)|SQL入門(12月7日)
データの更新(UPDATE)|SQL入門(12月6日)
複数のSELECT結果を統合(UNION,UNION ALL)|SQL入門(12月5日)
テーブルを結合して取得(INNER JOIN,OUTER JOIN)|SQL入門(12月4日)
データベースの正規化とマスタの作成|SQL入門(12月3日)
データベースにおけるNULLの扱い方|SQL入門(12月2日)
オブジェクト変数とは何か|VBA技術解説(12月2日)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.マクロって何?VBAって何?|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.ひらがな⇔カタカナの変換|エクセル基本操作
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。