VBAエキスパート対策
イベント

Excel VBAエキスパート対策です
公開日:2018-03-08 最終更新日:2019-08-26

イベント


・イベントとは
・ブックのイベント
・シートのイベント


2019/05/15からの「VBAエキスパート」リニューアルに伴い出題範囲から削除されました。
マクロVBAを初心者向けの基本から上級者向けの高度な内容までサンプルコードを掲載し解説しています。エクセル関数・機能・基本操作の入門解説からマクロVBAまでエクセル全般を網羅しています。

しかし、VBAをやっていくうえで、イベントは必ず覚えなければならないものです。
試験は別として、必ず学習することをお勧めいたします。

【ここでのポイント】

ブックとシートのイベントは多数あります。
どれが出題されるかはわかりません。
それでは、これらを全て個別に覚える必要があるのでしょうか・・・

そんな必要はありません。
イベントの仕組みと決まりを理解すれば、どのイベントが出題されても困ることはありません。

ここでは、イベントの仕組みと、VBAコードの読み方を覚えて下さい。
良く使われるイベントはある程度決まっていますので、そのサンプルコードを通して、
イベント全体を理解するようにして下さい。

イベントとは

VBAにおけるイベントとは、エクセル上で特定の操作(アクション)が行われた時に、
その操作に対応したVBAのプロシージャーが起動される仕組みです。
この時に起動されるプロシージャはイベントプロシージャと呼ばれます。

特定の操作(アクション)でプロシージャが起動されることを、イベントが発生するという言い方もします。

このイベントを使う事で、Excel上での特定操作でマクロを自動実行することが出来ます。

Excelで特定の操作を行う

イベントが発生する

対応するイベントプロシージャが起動される


イベントが発生する操作は、主にキーボードが押される、マウスがクリックされる、などがあります。
イベントの発生は、手動でもVBAでも、どちらで操作が行われても発生します。

イベントプロシージャは、
決められたモジュールに、決められたプロシージャ(引数も決められている)に記述しなければなりません。

イベントプロシージャの作成方法
ワークブックを開いたときに発生するイベント、
Workbook_Openを例に、イベントプロシージャの作成手順を説明します。

VBEの「Microsoft Excel Objects」内の「ThisWorkbook」に記述します。

以下では、VBEの操作手順を説明します。

コード表示
VBE画面で、
ThisWorkbookを右クリックからコードの表示
または、
ThisWorkbookをダブルクリックでコード表示します。

プロシージャーの作成
コードウインドウの上部のオブジェクトのコンボより、Workbookを選択する。

MOS VBA 画像

Private Sub Workbook_Open()

End Sub

Workbookの規定のイベントとして、自動でWorkbook_Openが追加されます。

オブジェクトにより、規定のイベントが違いますので、
目的のイベント以外が挿入された場合は、
オブジェクトの右側コンボの、プロシージャーのコンボより目的のイベントを選択します。

MOS VBA 画像

イベントを選択すると、対応するイベントプロシージャが追加されますので、
不要なイベントプロシージャが追加されたときは、プロシージャを作治しておきます。

ブックのイベント

Workbookのイベントプロシージャーは、ブックに対し特定の操作が行われた時に実行されます。

VBEの「Microsoft Excel Objects」内の「ThisWorkbook」に記述します。

Workbookのイベントには以下があります。

Workbookのイベント一覧
イベント 発生条件等
Activate ブック、ワークシート、グラフ シート、または埋め込みグラフがアクティブになったときに発生します。
AddinInstall ブックがアドインとして組み込まれたときに発生します。
AddinUninstall ブックのアドインとして組み込みを解除したときに発生します。
AfterSave ブックが保存された後に発生します。
AfterXmlExport Microsoft Office Excel がデータを保存するか、指定されたワークブックから XML データをエクスポートした後で発生します。
AfterXmlImport 既存の XML データ接続が更新されたか、または開いている Microsoft Excel ブックに新しい XML データがインポートされた後に発生します。
BeforeClose ブックを閉じる前に発生します。ブックが変更された場合、ユーザーに変更内容の保存を要求する前に、このイベントが発生します。
BeforePrint ブックまたはその中に含まれる内容を印刷する前に発生します。
BeforeSave ブックを保存する前に発生します。
BeforeXmlExport Microsoft Office Excel がデータを保存するか、指定されたワークブックから XML データをエクスポートする前に発生します。
BeforeXmlImport 既存の XML データ接続が更新されるか、または開いている Microsoft Excel ブックに新しい XML データがインポートされる前に発生します。
Deactivate グラフ、ワークシート、またはブックが非アクティブになったときに発生します。
NewChart 新しいグラフをブックに作成したときに発生します。
NewSheet 新しいシートをブックに作成したときに発生します。
Open ブックを開いたときに発生します。
PivotTableCloseConnection ピボットテーブル レポート接続が閉じた後に発生します。
PivotTableOpenConnection ピボットテーブル レポート接続が開いた後に発生します。
RowsetComplete ユーザーが OLAP ピボットテーブルで行セット アクションを起動するか、レコードセットを詳細表示するとイベントが発生します。
SheetActivate シートがアクティブになったときに発生します。
SheetBeforeDoubleClick 既定のダブルクリックの操作の前に、ワークシートをダブルクリックしたときに発生します。
SheetBeforeRightClick 既定の右クリックの操作の前に、ワークシートを右クリックしたときに発生します。
SheetCalculate ワークシートを再計算したり、グラフでデータをプロットして変更した後に発生します。
SheetChange ユーザーまたは外部リンクにより、ワークシートのセルが変更されるときに発生します。
SheetDeactivate シートが非アクティブになったときに発生します。
SheetFollowHyperlink Excel のハイパーリンクをクリックすると発生します。ワークシート レベルでのイベントについては、FollowHyperlink イベントのヘルプ トピックを参照してください。
SheetPivotTableAfterValueChange ピボットテーブル内のセルまたはセル範囲が編集または再計算された後に発生します (数式を含むセルの場合)。
SheetPivotTableBeforeAllocateChanges ピボットテーブルに変更が適用される前に発生します。
SheetPivotTableBeforeCommitChanges ピボットテーブルの OLAP データ ソースに対する変更が適用される前に発生します。
SheetPivotTableBeforeDiscardChanges ピボットテーブルに対する変更が破棄される前に発生します。
SheetPivotTableChangeSync ピボットテーブルが変更された後に発生します。
SheetPivotTableUpdate ピボットテーブル レポートのシートが更新された後に発生します。
SheetSelectionChange いずれかのワークシートで選択範囲を変更したときに発生します。
選択範囲がグラフ シート上にある場合は発生しません。
Sync ドキュメント ワークスペースに含まれているブックのローカル コピーがサーバー上のコピーと同期されたときに発生します。
WindowActivate ブックのウィンドウがアクティブになったときに発生します。
WindowDeactivate ブックのウィンドウが非アクティブになったときに発生します。
WindowResize ブックのウィンドウ サイズを変更したときに発生します。


上記の太字については、何の操作のイベントか分かるようにしておいてください。


イベントプロシージャ名は、
Workbook_イベント
になります。

イベントがActivateなら、
Workbook_Activate
となります。

Sheet○○
シートに対する操作で発生するイベントですが、
ブックのイベントなので、全てのシートで共通のイベントになります。

シートのイベントに対応するイベントが存在します。

特定のシートのイベントは、シートモジュールに記述しますが、
ブックモジュールに記述することで、全てのシートに共通のイベントを作成できるという事です。


使用例.

ブックを開いた時、先頭シートのA1セルに移動します。

Private Sub Workbook_Open()
  Sheets(1).Select
  Application.Goto Range("A1"), True
End Sub


ブックが未保存の場合、無条件でブックを保存する

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  If ActiveWorkbook.Saved = False Then
    ActiveWorkbook.Save
  End If
End Sub


ブックが未保存の場合は、Closeをキャンセルする。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  If ActiveWorkbook.Saved = False Then
    Cancel = True
  End If
End Sub

CancelにTrueを入れる事で、発生したイベントを取り消すことが出来ます。

シートのイベント

ワークシートまたはそのセルに対し特定の操作が行われた時に実行されます。
イベントは、手動でもVBAでも、どちらで操作が行われても発生します。


VBEの「Microsoft Excel Objects」内のイベント処理するシートモジュールに記述します。

Worksheetのイベントプロシージャーには以下があります。

Worksheetのイベント

イベント 発生条件等
Activate ブック、ワークシート、グラフ シート、または埋め込みグラフがアクティブになったときに発生します。
BeforeDoubleClick 既定のダブルクリックの操作の前に、ワークシートをダブルクリックしたときに発生します。
BeforeRightClick 既定の右クリックの操作の前に、ワークシートを右クリックしたときに発生します。
Calculate ワークシートを再計算した後に Worksheet オブジェクトで発生します。
Change ワークシートのセルがユーザーまたは外部リンクにより変更されたときに発生します。
Deactivate グラフ、ワークシート、またはブックが非アクティブになったときに発生します。
FollowHyperlink ワークシートのハイパーリンクをクリックすると発生します。アプリケーション レベルおよびブック レベルでのイベントについては、SheetFollowHyperlink イベントおよび SheetFollowHyperlink Event イベントのヘルプ トピックを参照してください。
PivotTableAfterValueChange ピボットテーブル内のセルまたはセル範囲が編集または再計算された後に発生します (数式を含むセルの場合)。
PivotTableBeforeAllocateChanges ピボットテーブルに変更が適用される前に発生します。
PivotTableBeforeCommitChanges ピボットテーブルの OLAP データ ソースに対する変更が適用される前に発生します。
PivotTableBeforeDiscardChanges ピボットテーブルに対する変更が破棄される前に発生します。
PivotTableChangeSync ピボットテーブルが変更された後に発生します。
PivotTableUpdate ピボットテーブル レポートがワークシート上で更新された後で発生します。
SelectionChange ワークシートで選択範囲を変更したときに発生します。


上記の太字については、何の操作のイベントか分かるようにしておいてください。


イベントプロシージャ名は、
Worksheet_イベント
になります。

イベントがActivateなら、
Worksheet_Activate
となります。

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

Private Sub Worksheet_Activate()
  Application.Goto ActiveSheet.Range("A1"), True
End Sub


セルをダブルクリックした時、当該セルで、列幅・行高を自動調整します。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  With Target
    .Columns.AutoFit
    .Rows.AutoFit
  End With
End Sub

上記の例では、ダブルクリックによって、列幅・行高が調整された後、
通常のダブルクリックであるセル編集状態となります。
セル編集状態にしたくない場合は、
Cancel = True
この記述を入れます。


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
これで、新たなイベント発生が発生するようにしています。
これを入れ忘れると、プロシージャー終了後も、新たなイベントが発生しなくなります。

※EnableEventsは、試験として出しやすいのでしっかり覚えて下さい。


特定範囲内(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

イベントプロシージャの規則を理解する

イベントの名称
イベントの名称を見ていくと、英単語をつなげたものだという事がわかると思います。
右クリックの操作の前に発生するイベントは、

BeforeRightClick

大文字になっている所で単語を区切って読んでください。

Before Right Click

これをそのまま直訳すれば、何の操作で発生するイベントかが分かります。

前 右 クリック

難しく考える必要はありません、そのまま読めば大丈夫です。

引数
引数の種類は、以下のように限られています。

引数 説明
Cancel As Boolean 初期値はFalseで受け取ります。
Trueを入れる事で、発生したイベントをキャンセルします。
これ以降の操作に伴う動作が行われなくなります。
ByVal Sh As Object イベントの発生源のシートが入っています。
ByVal Target As Range イベントの発生源のセル(Rangeオブジェクト)が入っています。
ByVal Target As Hyperlink イベントの発生源のハイパーリンクのオブジェクトが入っています。
ByVal Wn As Window イベントの発生源のWindowが入っています。

※ピボットテーブルに関する引数は省略しています。
  試験には出ないと思います。
※HyperlinkとWindowも試験には出ないと思いますが、
  念の為、記載しています。

上記の引数は、全てのイベントに共通しています。

Cancel
ByValが指定されていないので、値の設定が有効だという事です。

他の引数は、ByValなので値の設定は無意味です。

ByVal Target As Range
Rangeオブジェクトなので、1つのセルの場合もあれば、複数のセル範囲もあり得ます。

Ctrl+Enterで入力することで、複数セル範囲に一度に値を入れられます。
Worksheet_Changeでは、
この場合は、値を入れた複数セル範囲がTargetに入っています。
この場合に、Target内の全セルに対して何らかの処理をする場合は、
後の章でやる、For Eachステートメントを使用します。

【業務改善の実務】

業務のマクロ作成時には、なるべく自動化しようとすると、どうしてもイベントが必要になります。
しかし、その利用は慎重に検討すべきものです。

イベントの利点は、使用者が意識することなくマクロを動かせることですが、
本当にそれが良いかどうかは、よくよく考えるべき事です。

ボタンを配置して、使用者がクリックすることでマクロを動作すれば良い事を、
わざわざイベントで自動化する必要があるのかどうかを考えましょうという事です。
ボタンクリックなら、その直前にブックを保存することもできるので、
場合によっては、マクロ処理をなかったことにすることも可能です。
シートに入力した内容を良く確認してから、ボタンをクリックするという事の良さと比較検討しましょうという事です。

また、イベントを使ったマクロは、実装が難しいことも多くあります。
確実に正しく処理できるようにVBAを書くことは、それなりの技術力が必要になってきます。

ただし、イベントでなければ実現できないことも多々あります。
例えば、
ブックを開いた時
ブックを閉じる時
シートを選択した時
このような時に自動実行することは、ブックの操作性を大きく向上させるものです。

適切な場面でイベントを使えるように、しっかりと覚えて下さい。

【本サイト内の関連ページ】

第124回.Workbookのイベントプロシージャー
・Workbookのイベント一覧 ・イベントプロシージャー追加のVBE操作 ・Workbook_Open:Workbookのイベント ・Workbook_BeforeClose:Workbookのイベント ・Workbook_SheetChange:Workbookのイベント
第125回.Worksheetのイベントプロシージャー
・Worksheetのイベント ・イベントプロシージャー追加のVBE操作 ・Activate:Worksheetのイベント ・BeforeDoubleClick:Worksheetのイベント ・BeforeRightClick:Worksheetのイベント ・Change:Worksheetのイベント ・SelectionChange:Worksheetのイベント ・全てのシートまたは複数のシートに対するイベント

イベント処理について
・ワークブックのイベント ・ワークシートのイベント ・標準モジュールとの使い分け
ブックが開いた時に自動実行(Workbook_OpenとAuto_Open)
・Workbook_Open ・Auto_Open ・Workbook_OpenとAuto_Openの実行順序 ・Workbook_OpenとAuto_Openの違い
ブックを閉じる時に自動実行(Workbook_BeforeCloseとAuo_Close)
・Workbook_BeforeClose ・Auto_Close ・Workbook_BeforeCloseとAuto_Closeの実行順序 ・Workbook_BeforeCloseとAuto_Closeの違い

ブックを開いた時に指定シートを表示(Workbook_Open)
ブックを開いたときに自動的にマクロVBAを実行するにはWorkbook_Openを使います。Workbook_Openは、ブックを開いた時に自動的に実行されるイベントです、ブックを開いたときに自動的にマクロVBAを起動する方法としてはAuto_Openもあります。
ブックが閉じられる直前に保存済を確認(Workbook_BeforeClose)
Workbook_BeforeCloseは、ブックを閉じる直前に起動されるイベントです、手動で閉じる場合も、VBAで閉じる場合でも起動されます。ブックが未保存の場合、無条件でブックを保存する ブックが未保存の場合は、Closeをキャンセルする。
シートが選択された時に指定セルに移動(Worksheet_Activate)
Worksheet_Activateは、シートが選択された時に実行されるイベントです、VBEの「MicrosoftExcelObjects」内の各シートに記述します。上記では、シートが選択されたとき、A1セルに移動しています。Application.GotoRange("A1"),
ダブルクリックで行高・列幅調整(Worksheet_BeforeDoubleClick)
・Worksheet_BeforeDoubleClick ・行高・列幅自動調整のサンプルVBAコード
英小文字が入力されたら大文字に変換(Worksheet_Change)
・Worksheet_Changeイベント ・英小文字が入力されたら大文字に変換するVBA ・英小文字が入力されたら大文字に変換するVBAの解説
セル選択で選択行の色を変更(Worksheet_SelectionChange)
Worksheet_SelectionChangeは、セルの選択範囲を変更した時に起動されます。PrivateSubWorksheet_SelectionChange(ByValTargetAsRange) Target 選択されたセルが、Rangeオブジェクトとして渡されます。
方眼紙Excelが楽に入力できるVBA
・方眼紙Excel(神エクセル)のサンプル ・方眼紙Excel(神エクセル)に対応するVBAコード ・方眼紙Excel(神エクセル)に対応するVBAの規則と使い方 ・方眼紙Excel(神エクセル)に対応するVBAの最後に

VBAエキスパート公式テキスト

2019/5/30発売リニューアル版


2019/7/26発売リニューアル版

こちらは必須として購入した方が良いでしょう。
ちょっと高いなーとは思いますが、
書籍を購入することで、学習用データが提供されています。
・サンプルブック
・VBAエキスパート模擬問題
これらが使えるようになります。
このシリーズでは、テキストを読みながら学習していることを前提とします。



同じテーマ「VBAエキスパート対策」の記事

マクロの実行
VBAベーシック試験対策まとめ
プロシージャ
イベント
ステートメント(スタンダード)
関数
エラーへの対処
APIとOLEオートメーション
変数と配列
レジストリの操作
ファイルの操作


新着記事NEW ・・・新着記事一覧を見る

TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




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


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


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