記事キャッチ画像
 (28) Excelワークシートの Activate 、 Deactivate イベント! 

 1. ワークシート切替時に発生するイベントのため、切替元で Deactivate 後に 切替先で Activate イベントが発生 

 2. SheetN モジュールの Me オブジェクトと、ActiveSheet プロパティの関係 

  「広告」  
 

 (28) Excelワークシートの Activate 、 Deactivate イベント! 

Excel メニューバーの [ヘルプ] - [更新プログラムのチェック] にて、適用されていないアップデートがあれば行ってください。 

Excel 2016 for Mac 環境での説明となりますので、 Mac版 Excel 2011 では( VBA が利用できますが )同じ結果にならない場合があるかもしれません。

現状、 VBE 内で日本語を記述すると(貼り付けのみ可能な場合あり)乱れたり、保存時にクラッシュすることが多いため、 VBAコード は「未変換の英数字のみ」で記述してください。(テキストエディタからの貼り付けは可能)

( ユーザー定義関数 のVBAコードを含んだ)前回使用した XLSM ファイルを、「マクロを有効」にして開きます。

58

現在ワークシートが3つ存在するはず。


09

VBE にて Module1 の末尾に、以下のコードを入力するかそのままコピーして貼り付ける。(緑色の部分はコメントのため、省略可)

'----------------------------------------
'    My_ActivateDeactivate()
'----------------------------------------
Public Sub My_ActivateDeactivate(ws As Worksheet)

    MsgBox "[" & ws.Name & "] Event Activate / Deactivate "
    MsgBox "[" & ActiveSheet.Name & "] " & Selection.Address(False, False)

End Sub


53

続いて、SheetN モジュール全て の末尾に、以下のコードを入力するかそのままコピーして貼り付ける。
筆者の場合だと Sheet1 , Sheet2 , Sheet3 の3モジュール。(緑色の部分はコメントのため、省略可)

'----------------------------------------
'    Event: Worksheet_Activate()
'----------------------------------------
Private Sub Worksheet_Activate()

    Call My_ActivateDeactivate(Me)

End Sub
'----------------------------------------
'    Event: Worksheet_Deactivate()
'----------------------------------------
Private Sub Worksheet_Deactivate()

    Call My_ActivateDeactivate(Me)

End Sub


 1. ワークシート切替時に発生するイベントのため、切替元で Deactivate 後に 切替先で Activate イベントが発生 

別のワークシートを選択すると DeactivateActivate の順でイベントが発生する。
Deactivate イベントが発生するのは、「切替元」ワークシートであることに注目して欲しい。
つまり、このイベントは ワークシートが「非選択」となる直前に発行される。

新たなキーワード「 Me 」は、 SheetN モジュールにおいて 自らの Excelワークシートオブジェクトを示す!
よって、「切替先」ワークシートで発生する Activate イベントのみでなく、「切替元」ワークシートで発生する Deactivate イベントでも 正しくシート名を表示する。

このキーワード「 Me 」を利用することにより、全ワークシート(今回だと、3モジュール・6プロシージャ)の VBAコードの共通化が可能だ。
具体的な処理自体は、ユーザーモジュール(今回だと、 Module1 )の独自プロシージャに記述すれば良い。


 2. SheetN モジュールの Me オブジェクトと、ActiveSheet プロパティの関係 

SheetN (Excelワークシート)モジュールの「 Me 」キーワードは正しく自オブジェクトを示すが、今までよく利用していた ActiveSheetActiveCellSelection プロパティ は実は常に「切替先」ワークシート のものを示す!

上記3つのプロパティは、(修飾しない場合)作業中のワークブック、つまり ThisWorkbook オブジェクトのプロパティだからだ。

1つのExcelワークブック(オブジェクト)において「 アクティブな Sheet ・ Cell ・ Selection オブジェクトは1つだけで、同時には複数存在しない 」事を覚えておいて欲しい。

同様に、Excel自体を示す Application オブジェクトは ActiveWorkbook プロパティを持ちますが、常に実行されているコードのあるブックを返すために「 ThisWorkbook 」プロパティも用意されています。
アドインブックから ActiveWorkbook を参照した場合、アドインブックではなく「アドインを呼び出したブック」が返されるため、アドインブック自体にアクセスする唯一の手段が「 ThisWorkbook 」プロパティとなります。

ちょっと難しかったかもしれませんが、 Application オブジェクト のアクティブなブックを示すプロパティには ActiveWorkbook だけでなく ThisWorkbook もあるという事を頭の片隅にでも…


次回は、まだ説明していない 「Excelブックのイベント」に戻る前に、 Excelに用意されている「ワークシート関数」を VBAコード内で利用する方法を説明いたします!


お疲れ様でした!
[command] + [Q] にてExcel を終了時、「作業中のブック」を保存するか確認のダイアログ画面が表示されるため 「保存」しましょう。
現状、 VBE 内で日本語を記述すると(貼り付けのみ可能な場合あり)乱れたり、保存時にクラッシュすることが多いため、 VBAコード は「未変換の英数字のみ」で記述してください。(テキストエディタからの貼り付けは可能)


最後まで読んでいただき、ありがとうございます。
ぜひ、右側の「人気ブログランキング」投票に ご協力ください。
また、お越しくださいませ。
// アタル

  「広告」