サイトについて      連絡先   検索

VBA イベント

はじめに

Excel VBA マクロでイベントを利用する方法を紹介します。

イベントとは、何か変更があったときなど操作が行われたときに実行されるコードのことです。

シートやワークブックの他にボタンなどのコントロールからも発生します。無効にする方法も紹介します。

  • 目次
    • イベントとは
    • イベントを受け取る
    • イベントの一覧
    • イベントを無効にする
    • イベントを作成する

イベントとは

イベントが発生したときに対応した処理を実行できます。

例えば、セルに入力して値が変更されたときに Worksheet の Change イベントが発生します。

毎回そのイベントが発生するので、ユーザーの操作に反応できるようになります。また、セルの内容を編集したときに自動で集計やエラーチェックをするなど、様々なことに応用できます。

イベントを受け取る

VBE のプロジェクト ウィンドウからイベントを作成したい [シート] や [ThisWorkbook] をダブルクリックします。ここでは Sheet1 のイベントを作成します。

8

コードの左上にある (General) から [Worksheet] をクリックします。

ThisWorkbook のときは Workbook をクリックします。
5

コードの右上にある (Declarations) から取得したい [イベント] を選択します。

6

関数が作成されます。これがイベントが発生したときに実行される関数です。この中に、そのイベントが発生したときの処理を書きます。

7

イベントの関数には引数がよくあります。その引数に何が変更されたのかを特定する情報が含まれています。


' Change イベントの Target は変更されたセル
Private Sub Worksheet_Change(ByVal Target As Range)
    Target.Font.Color = RGB(255, 0, 0) ' 変更されたセルの文字色を赤にする
End Sub

ActiveX コントロールを使用しているときは、それを挿入しているシートから同じようにしてイベントを作成できます。

9

イベントの一覧

各イベントの詳細については Microsoft 公式サイトの「Worksheet メンバー」または「Workbook メンバー」をご覧ください。

ワークシート

名前 発生条件
Activateシートがアクティブになったとき
BeforeDeleteシートが削除される前
BeforeDoubleClickセルをダブルクリックしたときで、既定のダブルクリックの動作が行われる前
BeforeRightClickセルを右クリックしたときで、既定の右クリックの動作が行われる前
Calculateシートで再計算が行われた後 (参照セルが変更されたなど)
Changeセルに変更があったとき (文字を入力したなど)
Deactivateシートがフォーカスを失ったとき
FollowHyperlinkシートのハイパーリンクをクリックしたとき
LensGalleryRenderComplete引き出し線ギャラリーのアイコン (動的および静的) の表示が完了したとき
PivotTableAfterValueChangeピボットテーブル内のセルまたはセル範囲が編集または再計算された後
PivotTableBeforeAllocateChangesピボットテーブルに変更が適用される前
PivotTableBeforeCommitChangesピボットテーブルの OLAP データ ソースに対する変更が適用される前
PivotTableBeforeDiscardChangesピボットテーブルに対する変更が破棄される前
PivotTableChangeSyncピボットテーブルが変更された後
PivotTableUpdateピボットテーブルが更新されたとき
SelectionChangeセルの選択範囲が変更されたとき
TableUpdateデータ モデルに接続されているクエリ テーブルがワークシートで更新された後

ワークブック

名前 発生条件
Activateワークブックがアクティブになると発生します。
AddinInstallワークブックがアドインとしてインストールされたときに発生します。
AddinUninstallワークブックがアドインとしてアンインストールされたときに発生します。
AfterSaveワークブックが保存された後に発生します。
AfterXmlExportMicrosoft Office Excel がワークブックのデータを XML データ ファイルに保存またはエクスポートした後に発生します。
AfterXmlImport既存の XML データ接続が更新された後、または新しい XML データがワークブックにインポートされた後に発生します。
BeforeCloseワークブックが閉じる前に発生します。ワークブックが変更されていると、ユーザーに変更を保存するよう求める前にこのイベントが発生します。
BeforePrintワークブックやワークブック内の要素が印刷される前に発生します。
BeforeSaveワークブックが保存されると発生します。
BeforeXmlExportMicrosoft Office Excel がワークブックのデータを XML データ ファイルに保存またはエクスポートする前に発生します。
BeforeXmlImport既存の XML データ接続が更新される前、または新しい XML データがワークブックにインポートされる前に発生します。
Deactivateワークブックが非アクティブになると発生します。
ModelChangeExcel データ モデルが変更された後に発生します。
NewChart新しいグラフをブックに作成したときに発生します。
NewSheetワークブックに新しいシートが作成されると発生します。
Openワークブックが開かれると発生します。
PivotTableCloseConnectionピボットテーブル レポートが、そのデータ ソースへの接続を終了した後に発生します。
PivotTableOpenConnectionピボットテーブル レポートが、そのデータ ソースへの接続を確立した後に発生します。
RowsetCompleteユーザーが OLAP ピボットテーブルで行セット アクションを起動するか、レコードセットを詳細表示するとイベントが発生します。
SheetActivateシートがアクティブになると発生します。
SheetBeforeDeleteシートが削除される前に発生します。
SheetBeforeDoubleClickワークシートがダブルクリックされたとき、既定のダブルクリック処理が行われる前に発生します。
SheetBeforeRightClickワークシートが右クリックされたとき、既定の右クリック処理が行われる前に発生します。
SheetCalculateワークシートが再計算された後、または変更されたデータがグラフにプロットされた後で発生します。
SheetChangeユーザー、または外部リンクによって、ワークシートのセルが変更されると発生します。
SheetDeactivateシートが非アクティブになると発生します。
SheetFollowHyperlinkワークブック内のハイパーリンクがクリックされると発生します。
SheetLensGalleryRenderCompleteワークシートの引き出し線ギャラリーのアイコン (動的および静的) の表示が完了した後に発生します。
SheetPivotTableAfterValueChangeピボットテーブル内のセルまたはセル範囲が編集または再計算された後に発生します。
SheetPivotTableBeforeAllocateChangesピボットテーブルに変更が適用される前に発生します。
SheetPivotTableBeforeCommitChangesピボットテーブルの OLAP データ ソースに対する変更が適用される前に発生します。
SheetPivotTableBeforeDiscardChangesピボットテーブルに対する変更が破棄される前に発生します。
SheetPivotTableChangeSyncピボットテーブルが変更された後に発生します。
SheetPivotTableUpdateピボットテーブル レポートのシートが更新された後で発生します。
SheetSelectionChangeワークシートで選択範囲が変更されると発生します。選択範囲がグラフ シート状にある場合は発生しません。
SheetTableUpdateシート テーブルが更新された後に発生します。
Syncドキュメント ワークスペースに含まれるワークシートのローカル コピーが、サーバー上のコピーと同期されるときに発生します。
WindowActivateワークブック ウィンドウがアクティブになると発生します。
WindowDeactivateワークブック ウィンドウが非アクティブになると発生します。
WindowResizeワークブック ウィンドウのサイズが変更されると発生します。

イベントを無効にする

イベントを無効にするには Application.EnableEvents = False のように指定します。すべてのイベントが発生しなくなります。


Application.EnableEvents = False

' この処理の間はイベントが発生しない

Application.EnableEvents = True

処理の最後に Application.EnableEvents = True にしてイベントを有効にするのを忘れないようにします。

一部のイベントだけ発生しないようにはできません。そのときはフラグを作成するなどして対応します。

イベントを作成する

Worksheet に Change があるように、クラスに新しいイベントを作成できます。

作成

Event イベント名(ByVal 引数名 As 型名)のように入力します。引数は省略できますが、通常は発生した内容を引数で渡します。


Event NameChange(beforeName As String)

この引数には、そのイベントを発生させた原因となるものを渡します。Change であればその値などです。

Change などの変化があるイベントでは、引数の型を構造体にすると変化前と変化後がわかって便利です。


Public Type NameChangeArgs
    beforeName As String
    afterName As String
End Type

発生

RaiseEvent イベント名(引数)のように入力します。Event で宣言したイベントが発生します。


RaiseEvent NameChange("値")

好きなタイミングで発生させられます。通常はプロパティの値が変更されたときや、関数を呼ばれたときに発生させます。

受け取る

WithEvents 変数名 As クラス名のように入力します。このクラスがイベントを作成したクラスです。Private か Public で宣言します。WithEvents がイベントを受け取るためのキーワードです。


Private WithEvents c1 As Class1

後は通常のイベントを受け取る方法と同じです。コードの左上にある (General) から [変数名] をクリックします。変数名は WithEvents を付けた変数です。

10

コードの右上にある (Declarations) から取得したい [イベント] を選択します

11

RaiseEvent でイベントを発生させると、そのイベントの処理が行われます。

まとめ

以上のコードをまとめると次のようになります。


' Class1 のコード (イベントを作成する)
Event NameChange(beforeName As String) ' Name プロパティが変更したときに発生するイベント

Private m_Name As String
       
Public Property Get Name() As String
    Name = m_Name
End Property

Public Property Let Name(ByVal value As String)
    If m_Name <> value Then
        RaiseEvent NameChange(value) ' 値が変更したときにイベントを発生させる
    End If
    
    m_Name = value
End Property

' 別のコード Sheet1 など (イベントを受け取る)
Private WithEvents c1 As Class1 ' Class1 で作成されたイベントを受け取る

Private Sub c1_NameChange(beforeName As String) ' NameChange イベントが発生したときの処理
    Debug.Print("NameChange")
End Sub

Sub 実行()
    Set c1 = New Class1
    c1.Name = "Tipsfound" ' Name の値を変更する
End Sub
  • 目次
    • イベントとは
    • イベントを受け取る
    • イベントの一覧
    • イベントを無効にする
    • イベントを作成する