VBA入門
第125回.Worksheetのイベントプロシージャー

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2019-11-15

第125回.Worksheetのイベントプロシージャー


Worksheetのイベントプロシージャーは、ワークシートまたはそのセルに対し特定の操作(これがイベント)が行われた時に実行されます。
イベントは、手動でもVBAでも、どちらで操作が行われても発生します。
Worksheetのイベントプロシージャーの一覧紹介と主要なイベントについて解説します。


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操作

コード表示
VBE画面のプロジェクトでイベントをさせ句亭するシートを選択肢、
・メニューの「表示」→「コード」
・右クリックから「コードの表示」
・ダブルクリック
いずれかでコードを表示します。

プロシージャーの作成
コードウインドウの上部、
左側のドロップダウンがオブジェクトの選択で、
右側のドロップダウンがイベントの選択になります。

左側のオブジェクトの選択で「Worksheet」を選択する。

VBA マクロ シーのイベント

VBA マクロ シーのイベント

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

VBA マクロ シーのイベント

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

VBA マクロ シーのイベント

自動で追加された「Worksheet_SelectionChange」が不要であれば消して構いません。

Activate:Worksheetのイベント

シートが選択された時に実行されるイベントです。
手動で開く場合も、VBAで開く場合でも起動されます。
Private Sub Worksheet_Activate()

使用例.
シートが選択されたとき、A1セルに移動する

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を入れると、右クリックがキャンセルされます。

使用例.
右クリックメニューの変更(CommandBars)

こちらで、右クリックで表示されるメニューの変更をしています。

Change:Worksheetのイベント

セルの値が変更された時に起動されます。
Private Sub Worksheet_Change(ByVal Target As Range)
Target
変更されたセルが、Rangeオブジェクトとして渡されます。

使用例.
A列に、小文字が入力された場合、直ちに大文字に変更する。

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オブジェクトとして渡されます。

使用例.
特定範囲内(A2:D100)の選択行の色を変更します。

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

全てのシートまたは複数のシートに対するイベント

Worksheetのイベントは、記載したシートモジュールに対応するシートに限定されたイベントになります。
複数シートや全てのシートでイベントを捕捉したい場合は、それぞれのシートモジュールに記載する必要が出てきます。
そのような場合は、Workbookのイベント を使用してください。
Workbookのイベントプロシージャーは、ブックに対し特定の操作(これがイベント)が行われた時に実行されます。イベントは、手動でもVBAでも、どちらで操作が行われても発生します。Workbookのイベントは多数用意されています。

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.ひらがな⇔カタカナの変換|エクセル基本操作



  • >
  • >
  • >
  • Worksheetのイベントプロシージャー

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
    掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
    本文下部へ