実用性はともかく、こんなこともできる…というテクニック紹介します。
まずは一般的な方法から。
あるワークシートをアクティブにしたとき、自動的にマクロを実行するにはイベントを使います。たとえば、Sheet2をアクティブにしたとき、標準モジュールにあるSample01というマクロを実行するには次のようにします。
(1)VBEを起動して、[挿入]-[標準モジュール]をクリックします。実行するとModule1が挿入されます
(2)標準モジュールModule1に次のようなマクロを作成します
Sub Sample01() MsgBox "自動実行その1" End Sub
(3)プロジェクトエクスプローラから「Sheet2」を開きます
(4)[オブジェクト]リストボックスで「Worksheet」を選択し、[プロシージャ]リストボックスで「Activate」を選択します。実行するとプロシージャ「Private Sub Worksheet_Activate()」が挿入されます
(4)プロシージャ「Private Sub Worksheet_Activate()」を次のように記述します
Private Sub Worksheet_Activate() Call Sample01 End Sub
これで完了です。Sheet2をアクティブにすると、Sample01が実行されます。
以上は一般的な方法です。解説本などにもよく載っていますね。私も書いたことがあります。さて、こうしたワークシートレベルの自動実行マクロは、特別な名前を使うことで、同じ動作を実現することが可能です。以下にその方法を紹介します。ここでは、Sheet3をアクティブにしたとき、先に作成した標準モジュールのSample01を実行するようにします。
(1)Sheet3を開きます
(2)[挿入]-[名前]-[定義]をクリックして[名前の定義]ダイアログボックスを開きます
(3)[名前]ボックスに「Sheet3!Auto_Activate_Test」と入力し、[参照範囲]ボックスに「=Sample01」と入力します
これで完了です。一度別のシートに切り替えてから、Sheet3を開くとSample01が実行されます。
名前を使ったワークシートレベルの自動実行マクロには、次の種類があります。
名前の先頭に付ける定義名 | イベント |
---|---|
Auto_Open_ | ワークシートを含むブックを開いたとき発生 |
Auto_Close_ | ワークシートを含むブックを閉じるとき発生 |
Auto_Activate_ | ワークシートをアクティブにするとき発生 |
Auto_Deactivate_ | ワークシートを非アクティブにするとき発生 |
定義名の後ろには任意の文字列を指定できます。つまり、ワークシートをアクティブにするとき実行するマクロなら「Auto_Activate_Test」でも「Auto_Activate_Sample」でも何でもいいんです。また「Auto_Activate_」で始まる自動実行マクロを複数登録することも可能です。「Auto_Activate_First」と「Auto_Activate_Second」のように複数登録した自動実行マクロは、イベントが発生すると全部実行されます。ただし、実行される順序を指定することはできません。
ワークシートレベルの自動実行マクロを名前で定義するときは、その名前をワークシートレベルの名前として登録しなければなりません。ワークシートレベルの名前を定義するには、[名前]ボックスに入力する名前の先頭にシート名と「!」を付けます。Sheet3をアクティブにしたとき実行するマクロなら「Sheet3!Auto_Activate_First」のようにします。なお、[名前の定義]ダイアログボックスを使ってワークシートレベルの名前を定義するときは、そのワークシートを開いておかなければなりません。
こうしたワークシートレベルの名前を使った自動実行マクロは、マクロから動的に定義することも可能です。次のコードは、Sheet3を非アクティブにしたときSample01を実行する自動実行マクロを定義します。
Sub Sample02() ActiveWorkbook.Names.Add Name:="Sheet3!AutoDeactive_Test", RefersToR1C1:="=sample01" End Sub
なお、上記のようにマクロから定義する場合は、アクティブシートがSheet3でなくてもかまいません。
まぁ、冒頭に書いたように普通のイベントプロシージャを使えばいいのですが、名前を使った方法ならマクロから手軽に定義できるのが魅力でしょうか。とりあえず、こんなこともできるということで。