(32) イベント発生順の複雑な事例を紹介!
1. イベント発生が、予測どおりにいかない場合もある
2. MsgBox関数 や Debug.Print ステートメントを利用して、不明点を確認する
「広告」
(32) イベント発生順の複雑な事例を紹介!
Excel メニューバーの [ヘルプ] - [更新プログラムのチェック] にて、適用されていないアップデートがあれば行ってください。
Excel 2016 for Mac 環境での説明となりますので、 Mac版 Excel 2011 では( VBA が利用できますが )同じ結果にならない場合があるかもしれません。
現状、 VBE 内で日本語を記述すると(貼り付けのみ可能な場合あり)乱れたり、保存時にクラッシュすることが多いため、 VBAコード は「未変換の英数字のみ」で記述してください。(テキストエディタからの貼り付けは可能)
まず、( ユーザー定義関数 のVBAコードを含んだ)前回使用した XLSM ファイルを、「マクロを有効」にして開きます。
次に、何でも良いので、Excelブックをもう1つ開きます。
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回行われ、上記画面のように 意図しない余分なイベントが発生していることがわかる。
Workbook の Activate / Deactivate イベントは3種類ずつあって、ちょっとややこしい。
ポジティブに捉えれば、どのようにイベントが発生するのか良い学習となる。
実際に操作して、発生するイベントの順番を確認して欲しい。
この連載を始めてからも、(微妙だが)Windows版Excel のイベント発生と異なる点が幾つかあった。
Workbook の Activate / Deactivate イベントは3種類ずつあって、ちょっとややこしい。
ポジティブに捉えれば、どのようにイベントが発生するのか良い学習となる。
実際に操作して、発生するイベントの順番を確認して欲しい。
この連載を始めてからも、(微妙だが)Windows版Excel のイベント発生と異なる点が幾つかあった。
2. MsgBox関数 や Debug.Print ステートメントを利用して、不明点を確認する
不明な点があったら、 MsgBox関数 や Debug.Print ステートメントを利用して確認するのが一番だ。
今回のようにウィンドウ表示関連のイベントの場合、 MsgBox関数だと余分なイベントが更に発生する場合もあるので、 Debug.Print ステートメント 利用がオススメ!
VBAコードから Debug.Print ステートメント を利用しても、 VBE のイミディエイト・ウィンドウに表示が可能。
イミディエイト・ウィンドウをクリアするには、同ウィンドウ内にマウスポインタを移した後に [command] + [A] で全選択して [delete] キーを押せば良い。
今回のようにウィンドウ表示関連のイベントの場合、 MsgBox関数だと余分なイベントが更に発生する場合もあるので、 Debug.Print ステートメント 利用がオススメ!
VBAコードから Debug.Print ステートメント を利用しても、 VBE のイミディエイト・ウィンドウに表示が可能。
イミディエイト・ウィンドウをクリアするには、同ウィンドウ内にマウスポインタを移した後に [command] + [A] で全選択して [delete] キーを押せば良い。
どうやら、Excelブックの「ウィンドウ最小化」を行うには、再度 そのウィンドウをアクティブにしないと ダメなようだ。
試しに、以下画面のように 「ウィンドウ最小化」を行っている行をRemステートメントにてコメント行にしたら、余分なイベント発生が無くなった。
イベント発生順は複雑なので、考えるよりも Debug.Print 等を利用して確認したほうが速いだろう。
てっきり、 Workbook_Deactivate イベントの方が先かと…
次回も、 Excelブックの まだ説明していないイベント です!
お疲れ様でした!
[command] + [Q] にてExcel を終了時、「作業中のブック」を保存するか確認のダイアログ画面が表示されるため 「保存」しましょう。
現状、 VBE 内で日本語を記述すると(貼り付けのみ可能な場合あり)乱れたり、保存時にクラッシュすることが多いため、 VBAコード は「未変換の英数字のみ」で記述してください。(テキストエディタからの貼り付けは可能)
「広告」amazon WINTER SALE
最後まで読んでいただき、ありがとうございます。ぜひ、右側の「人気ブログランキング」投票に ご協力ください。
また、お越しくださいませ。
// アタル
「広告」
コメント