VBA イベントを処理する

はじめに

Excel VBA マクロでイベントを処理する方法や一覧を紹介します。

イベントとは、シートやセルに変更があったときに処理するタイミングです。対応したイベントの関数が呼び出されます。

ボタンのクリックイベントを処理するには、エクセルに ActiveX コントロールのボタンを追加してそれをダブルクリックします。

シートやボタンのイベントを発生させるには、その処理を入力した関数を呼び出します。クラスのイベントなら RaiseEvent イベント名(引数) のように入力して、イベントを発生させられます。

Application.EnableEvents = True を入力して、イベントを無効にできます。

  • 目次
    • イベントとは
    • イベントを処理する
    • イベント一覧
    • イベントを無効にする
    • イベントを発生させる
    • クラスにイベントを作成する

イベントとは

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

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

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

イベントを処理する

プロジェクトウィンドウからイベントを処理したい [シート] や [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 コントロールを追加しているときは、そのイベントも処理できます。

ボタンのクリックイベントを処理するには、[開発] タブから [挿入] をクリックして ActiveX コントロールの [コマンドボタン] をクリックします。

91

[シート] にドラッグしてボタンを貼り付けます。その [ボタン] をダブルクリックします。

41

ボタンのクリックイベントが作成されます。

85

[デザイン モード] をクリックしてオフの状態にします。

92

ボタンをクリックすると、クリックイベントが発生します。

44

ActiveX コントロールを追加しているシートから同じようにして、他のイベントを処理できます。

9

イベント一覧

各イベントの詳細については Microsoft 公式サイトの「Worksheet オブジェクト」をご覧ください。

シート

名前 発生条件
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 を入力して、イベントを有効にするのを忘れないようにします。

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

イベントを発生させる

シートやボタンのイベントを発生させることはできません。エクセルや VBA の操作により自動で発生します。

イベントを発生させたいときは、その処理をする関数を作成して、その関数を呼び出します。

Sub 実行()
    Call SelectionChangeCore(Range("A1")) ' イベントの処理をする関数を呼び出し
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Call SelectionChangeCore(Target) ' イベントの処理をする関数を呼び出し
End Sub

Private Sub SelectionChangeCore(ByVal Target As Range)
    ' ここでイベントの処理をする
End Sub

クラスに作成したイベントなら発生させられます。詳しくは次の「クラスにイベントを作成する」をご覧ください。

クラスにイベントを作成する

シートのイベントのように、クラスに新しいイベントを作成できます。

クラスについて詳しくは「クラス」をご覧ください。

イベントを作成

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