■ イベントプロシージャを活用しよう!
Excelではユーザーフォーム以外でも、ブックやワークシートなどでイベントプロシージャを利用することができます。イベントプロシージャとは、ブックやワークシートなど、Excelのオブジェクトに対して特定の動作を行ったとき、OSがそれを検知して実行させることができるプロシージャのことを指します。
イベントプロシージャは標準モジュールではなく、ブックやワークシートなど、イベントの対象となるオブジェクトモジュール(ブックモジュール、シートモジュール)に記述する必要があります。オブジェクトモジュールは、VBEのプロジェクトエクスプローラから、対象となるオブジェクトを選択することで、そのコードウィンドウを表示させることができます。
イベントプロシージャの名前は、標準モジュールに記述する標準プロシージャとは異なり、自由に命名することはできません。イベントプロシージャ名の構文は次の通りです。
[構文]
Private Sub オブジェクト名_イベント名(引数)
イベントプロシージャは、必ずPrivateプロシージャになります。またプロシージャ名や引数を、ユーザーが勝手に変更してはいけません。これはユーザーフォームに記述するイベントプロシージャも同様です。
※ コードウィンドウ上部にあるオブジェクトボックス、プロシージャボックスを利用することでイベントプロシージャを正確かつ簡単に記述することが可能です。オブジェクトボックス、プロシージャボックスについては、
VBE(Visual Basic Editor)を使いこなそう!
にて解説しています。
■オブジェクトに対するイベントの種類
イベントの種類は、対象となるオブジェクトによって異なります。主なイベントの種類について解説していきます。
・ブックの主なイベント
イベントの種類 |
発生するタイミング |
Activate |
ブックがアクティブになったとき |
AddinInstall |
ブックがアドインとして組み込まれたとき |
AddinUninstall |
ブックがアドインから削除されたとき |
BeforeClose |
ブックを閉じるとき |
BeforePrint |
ブックを印刷するとき |
BeforeSave |
ブックを保存するとき |
Deactivate |
ブックがアクティブでなくなったとき |
NewSheet |
ブックに新しいシートを作成したとき |
Open |
ブックを開いたとき |
SheetActivate |
ブック内のシートがアクティブになったとき |
SheetBeforeDoubleClick |
ブック内のシートがダブルクリックされたとき |
SheetBeforeRightClick |
ブック内のシートが右クリックされたとき |
SheetCalculate |
ブック内のシートが再計算されたとき |
SheetChange |
ブック内のシートが変更されたとき |
SheetDeactivate |
ブック内のシートがアクティブでなくなったとき |
SheetFollowHyperlink |
ブック内のハイパーリンクをクリックしたとき |
SheetSelectionChange |
ブック内のシートの選択範囲を変更したとき |
WindowActivate |
ブックウィンドウがアクティブになったとき |
WindowDeactivate |
ブックウィンドウがアクティブでなくなったとき |
WindowResize |
ブックウィンドウの大きさを変更したとき |
・ワークシートの主なイベント
イベントの種類 |
発生するタイミング |
Activate |
ワークシートがアクティブになったとき |
BeforeDoubleClick |
ワークシートをダブルクリックしたとき |
BeforeRightClick |
ワークシートを右クリックしたとき |
Calculate |
ワークシートが再計算されたとき |
Change |
ワークシートのセルが変更されたとき |
Deactivate |
ワークシートがアクティブでなくなったとき |
FollowHyperlink |
ワークシートのハイパーリンクをクリックしたとき |
SelectionChange |
ワークシートの選択範囲を変更したとき |
※ ブックとワークシートで共通のイベントは、ブックの場合はブック内の全シートを対象に、ワークシートの場合は個々のワークシートを対象としています。
■イベントプロシージャの引数
イベントプロシージャの種類によっては、引数を持つものがあります。これらの引数はイベントプロシージャ内で利用することができます。主なイベントプロシージャの引数について解説していきます。
・イベントプロシージャの引数
引数 |
内容 |
Sh |
SheetActivateイベントなどで対象となるシートオブジェクトが格納されます |
Source |
SheetChangeイベントなどで対象となるセル範囲が格納されます |
Wb |
WindowActivateイベントなどで対象となるブックオブジェクトが格納されます |
Wn |
WindowActivateイベントなどで対象となるウィンドウオブジェクトが格納されます |
Target |
SelectionChangeイベントなどで対象となるセル範囲が格納されます |
Cancel |
イベントで操作をCancelするときはTrueを指定します。既定値はFalseです |
■イベントプロシージャの応用
イベントプロシージャを利用することで、ワークシートなどをより効率的に活用できるようになります。
(例)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Debug.Print Target.Row & ":" & Target.Column
End Sub
この例では、ワークシートのセルを選択するたびにイミディエイトウィンドウに選択されたセルの行番号と列番号が出力されます。例えば「A1」「B5」「D2」とセルを選択した場合、
とイミディエイトウィンドウに出力されます。 |
(例)
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
Cells(Target.Row, 5) = Time
End If
End Sub
この例では、ワークシートのA列のセルの値を変更したとき、同じ行のE列に変更した時間が記録されます。 |
(例)
'### Sheet1のシートモジュールに記述
Private Sub Worksheet_Calculate()
Application.EnableEvents = False
Me.Name = "Sheet1"
Application.EnableEvents = True
End Sub
'### 標準モジュールに記述
Function Worksheet_NameChange()
Application.Volatile
End Function
次のユーザー定義関数をSheet1のA1セルに記述
=Worksheet_NameChange()
この例では、「Sheet1」ワークシートの名前を変更しても、自動的に"Sheet1"に戻されます。
※ [ツール]>[オプション]>[計算方法]を[自動]に設定します。
※ ユーザー定義関数を記述するセルは、A1セルでなくてもかまいません。 |
■自動実行マクロ
「Workbook_Open」と「Workbook_BeforeClose」イベントプロシージャには、ブックを開くときと閉じるときに実行したいプロシージャを記述します。これと似た働きをするマクロに「Auto_Open」と「Auto_Close」マクロがあります。どちらを使用してもブックを開くときと閉じるときに、プロシージャを自動実行することができますが、以下の違いがあります。
マクロの種類 |
手動でブックを開く |
VBAからブックを開く |
Workbook_Open |
実行される |
実行される |
Auto_Open |
実行される |
実行されない |
マクロの種類 |
手動でブックを開く |
VBAからブックを開く |
Workbook_BeforeClose |
実行される |
実行される |
Auto_Close |
実行される |
実行されない |
VBAのコードからブックを開いたり閉じたりするときに、自動実行させたくないプロシージャは「Auto_Open」と「Auto_Close」マクロを使用して記述します。この場合、手動でブックを開いたり閉じたりしたときに自動実行されます。
■イベントを発生させないようにする
次のコードを実行することで、イベントの発生を抑制することができます。
[構文]
Application.EnableEvents = True または False
Trueを指定した場合、イベントが発生します。Falseを指定するとイベントの発生が抑制されます。
※ コードの中で、一時的にイベントの発生を停止した場合、あとのコードでTrueを指定して元に戻すのを忘れないようにしてください。イベントの発生停止を解除しない限り、そのあとのイベントがすべて停止されるので注意が必要です。
※ 「Workbook_Open」イベントを無効にするには、[Shift]キーを押しながらブックを開きます。
以上、ブックやワークシートに関するイベントプロシージャを解説してきました。これらのテクニックを効率的に活用することで、使用しているブックやワークシートがさらに便利に活用できるようになります。ぜひ、マスターしてほしいテクニックです。
|