MOS VBAエキスパート対策 | イベント | MOS Excel VBAエキスパート対策です



最終更新日:2018-03-10

イベント


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


【ここでのポイント】

ブックとシートのイベントは多数あります。
どれが出題されるかはわかりません。

それでは、これらを全て個別に覚える必要があるのでしょうか・・・

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

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


イベントとは

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

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

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

Excelで特定の操作を行う

イベントが発生する

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


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

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

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

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

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

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

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



Private Sub Workbook_Open()

End Sub

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

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



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


ブックのイベント

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を書くことは、それなりの技術力が必要になってきます。

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

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


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





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

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

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

数値範囲で表検索するVLOOKUP近似一致|エクセル関数超技(10月5日)
エクセルVBAでのシート指定方法|VBA技術解説(9月8日)
VBAのクラスとは(Class,Property,Get,Let,Set)|VBA技術解説(8月28日)
VBAこれだけは覚えておきたい必須基本例文10|VBA技術解説(8月22日)
VBAの省略可能な記述について|ExcelマクロVBA技術解説(8月11日)
複数条件判定を行う時のコツ|ExcelマクロVBA技術解説(7月11日)
For Next の使い方いろいろ|VBA技術解説(6月14日)
VBAを定型文で覚えよう|ExcelマクロVBA技術解説(3月26日)
VBAスタンダード試験対策まとめ|MOS VBAエキスパート対策(3月16日)
ユーザーフォームとメニューの操作|MOS VBAエキスパート対策(3月14日)

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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|ExcelマクロVBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数とデータ型(Dim)|ExcelマクロVBA入門
5.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
6.マクロって何?VBAって何?|ExcelマクロVBA入門
7.定数と型宣言文字(Const)|ExcelマクロVBA入門
8.繰り返し処理(For Next)|ExcelマクロVBA入門
9.とにかく書いて見よう(Sub,End Sub)|VBA入門
10.ひらがな⇔カタカナの変換|エクセル基本操作




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


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





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

本文下部へ

↑ PAGE TOP