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

Excel VBAエキスパート対策です
最終更新日:2019-05-11

イベント


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


2019/05/15からの「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のイベントプロシージャーは、ブックに対し特定の操作(これがイベント)が行われた時に実行されます。イベントは、手動でもVBAでも、どちらで操作が行われても発生します。Workbookのイベントは多数用意されています。
第125回.Worksheetのイベントプロシージャー
Worksheetのイベントプロシージャーは、ワークシートまたはそのセルに対し特定の操作(これがイベント)が行われた時に実行されます。イベントは、手動でもVBAでも、どちらで操作が行われても発生します。Worksheetのイベントプロシージャーの一覧紹介と主要なイベントについて解説します。

イベント処理について
ワークブックのイベント VBEの画面です。上図の「プロジェクト」で「ThisWorkbook」を選択し「表示」→「コード」またはF7 ワークブックのイベントはここに記述します。「(General)」と表示されているコンボボックスで「Workbook」を選択すると自動でPrivateSubWorkbook_Open() EndSub が作成されます。
ブックが開いた時に自動実行(Workbook_OpenとAuto_Open)
Excelブックを開いた時にVBAを自動実行させる方法としてWorkbook_OpenとAuto_Open この2通りの方法があります。それぞれの簡単な説明と動作の違いを解説します。Workbook_Open Workbook_Openはブックが開かれたときに起動されるブックのイベントプロシージャーになります。
ブックを閉じる時に自動実行(Workbook_BeforeCloseとAuo_Close)
Excelブックを閉じる時にVBAを自動実行させる方法としてWorkbook_BeforeCloseとAuo_Close この2通りの方法があります。それぞれの簡単な説明と動作の違いを解説します。Workbook_BeforeClose Workbook_Closeはブックが閉じられたときに起動されるブックのイベントプロシージャーになります。

ブックを開いた時に指定シートを表示(Workbook_Open)
Workbook_Openは、ブックを開いた時に実行されるイベントです、VBEの「MicrosoftExcelObjects」内の「ThisWorkbook」に記述します。上記では、ブックが開かれると、先頭シートのA1セルに移動しています。
ブックが閉じられる直前に保存済を確認(Workbook_BeforeClose)
Workbook_BeforeCloseは、ブックを閉じる直前に起動されるイベントです、手動で閉じる場合も、VBAで閉じる場合でも起動されます。ブックが未保存の場合、無条件でブックを保存する ブックが未保存の場合は、Closeをキャンセルする。
シートが選択された時に指定セルに移動(Worksheet_Activate)
Worksheet_Activateはシートが選択された時に実行されるイベントですVBEの「MicrosoftExcelObjects」内の各シートに記述します。上記ではシートが選択されたときA1セルに移動しています。Application.GotoRange(_A1_),
ダブルクリックで行高・列幅調整(Worksheet_BeforeDoubleClick)
セルをダブルクリックすることで、そのセル値で行高および列幅を自動調整するマクロVBAになります。これは、以下の操作をマクロVBAでまとめて行うことになります。「行の高さの自動調整」「列の幅の自動調整」この二つの操作を、マクロVBAで一度にやるということです。
英小文字が入力されたら大文字に変換(Worksheet_Change)
Worksheet_Changeは、セルの値が変更された時に起動されます。PrivateSubWorksheet_Change(ByValTargetAsRange) Target 変更されたセルが、Rangeオブジェクトとして渡されます。
セル選択で選択行の色を変更(Worksheet_SelectionChange)
Worksheet_SelectionChangeは、セルの選択範囲を変更した時に起動されます。PrivateSubWorksheet_SelectionChange(ByValTargetAsRange) Target 選択されたセルが、Rangeオブジェクトとして渡されます。
方眼紙Excelが楽に入力できるVBA
もはや、「いじめ」か「いたずら」、方眼紙Excelに、1枠1文字を入れろと言われて、悪戦苦闘… マクロ書けば、こんな「いじめ」も「いたずら」も、サクッと克服できます。以下のような、セル結合の鬼と化したExcelに、罫線で囲んだ枠内に、1枠1文字で入れるという苦行を、マクロならサクッと解決できます。




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

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


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

Byte配列と文字コード関数について|VBA技術解説(8月20日)
PowerQueryの強力な機能をVBAから利用する方法|VBA技術解説(8月4日)
練習問題31(セル結合を解除して値を埋める)|VBA練習問題(7月30日)
練習問題30(マトリックス→リスト形式)|VBA練習問題(7月25日)
Applicationを省略できるApplicationのメソッド・プロパティ一覧|VBA技術解説(7月22日)
コレクション(Collection)の並べ替え(Sort)に対応するクラス|VBA技術解説(7月20日)
CSVの読み込み方法(ジャグ配列)|VBAサンプル集(7月15日)
その他のExcel機能(グループ化、重複の削除、オートフィル等)|VBA入門(7月14日)
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス|VBA技術解説(7月6日)
オートフィルタを退避回復するVBAクラス|VBA技術解説(7月6日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.ひらがな⇔カタカナの変換|エクセル基本操作
10.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説



  • >
  • >
  • >
  • イベント

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


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




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