記事キャッチ画像
 (32) イベント発生順の複雑な事例を紹介! 

 1. イベント発生が、予測どおりにいかない場合もある 

 2. MsgBox関数 や Debug.Print ステートメントを利用して、不明点を確認する 

  「広告」  
 


 (32) イベント発生順の複雑な事例を紹介! 


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

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

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

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

次に、何でも良いので、Excelブックをもう1つ開きます。

29

ThisWorkbook モジュールの末尾に、以下のコードを入力するかそのままコピーして貼り付ける。(緑色の部分はコメントのため、省略可)
なお、Workbook_SheetActivate() 、 Woekbook_SheetDeactivate() は変更となる。


'--------------------------------
'    Event: Workbook_SheetActivate()
'--------------------------------
Private Sub Workbook_SheetActivate(ByVal sh As Object)
    Debug.Print "Workbook's Event(Activate) " & sh.Name
End Sub
'--------------------------------
'    Event: Workbook_SheetDeactivate()
'--------------------------------
Private Sub Workbook_SheetDeactivate(ByVal sh As Object)
    Debug.Print "Workbook's Event(Deactivate) " & sh.Name
End Sub
'--------------------------------
'    Event: Workbook_Activate()
'--------------------------------
Private Sub Workbook_Activate()
    Debug.Print ""
    Debug.Print "Event: Workbook_Activate"
End Sub
'--------------------------------
'    Event: Workbook_Deactivate()
'--------------------------------
Private Sub Workbook_Deactivate()
    Debug.Print "Event: Workbook_Deactivate"
End Sub
'--------------------------------
'    Event: WindowActivate()
'--------------------------------
Private Sub Workbook_WindowActivate(ByVal Wn As Excel.Window)
    Debug.Print "Event: Workbook_WindowActivate"
    Wn.WindowState = xlNormal    ' xlMaximized (最大化)
End Sub
'--------------------------------
'    Event: WindowDeactivate()
'--------------------------------
Private Sub Workbook_WindowDeactivate(ByVal Wn As Excel.Window)
    Debug.Print ""
    Debug.Print "Event: Workbook_WindowDeactivate"
    Wn.WindowState = xlMinimized
End Sub

(注) Excel.Window 型は、 Window 型を用いても良い。


 1. イベント発生が、予測どおりに行かない場合もある 

VBAコードを記述した「ブック1」から別のExcelブックを選択すると、「ブック1」の最小化が2回行われ、上記画面のように 意図しない余分なイベントが発生していることがわかる。

36

Workbook の Activate / Deactivate イベントは3種類ずつ
あって、ちょっとややこしい。
ポジティブに捉えれば、どのようにイベントが発生するのか良い学習となる。
実際に操作して、発生するイベントの順番を確認して欲しい。
この連載を始めてからも、(微妙だが)Windows版Excel のイベント発生と異なる点が幾つかあった。 


 2. MsgBox関数 や Debug.Print ステートメントを利用して、不明点を確認する 

不明な点があったら、 MsgBox関数 や Debug.Print ステートメントを利用して確認するのが一番だ。
今回のようにウィンドウ表示関連のイベントの場合、 MsgBox関数だと余分なイベントが更に発生する場合もあるので、 Debug.Print ステートメント 利用がオススメ!

VBAコードから Debug.Print ステートメント を利用しても、 VBE のイミディエイト・ウィンドウに表示が可能。
イミディエイト・ウィンドウをクリアするには、同ウィンドウ内にマウスポインタを移した後に [command] + [A] で全選択して [delete] キーを押せば良い。 

どうやら、Excelブックの「ウィンドウ最小化」を行うには、再度 そのウィンドウをアクティブにしないと ダメなようだ

試しに、以下画面のように 「ウィンドウ最小化」を行っている行をRemステートメントにてコメント行にしたら、余分なイベント発生が無くなった。

35
 
イベント発生順は複雑なので、考えるよりも Debug.Print 等を利用して確認したほうが速いだろう。
 
Workbook_Activate の後に Workbook_WindowActivate イベントが発生するのは普通だが、 Workbook_WindowDeactivate の後に Workbook_Deactivate イベントが発生するのは知らなかった。
てっきり、 Workbook_Deactivate イベントの方が先かと…


次回も、 Excelブックの まだ説明していないイベント です!


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


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

  「広告」