山崎はるかのメモ
会社情報 | サイトマップ・検索
RSS

VB6/VBAフォームのイベント順序

Order of Events in Visual Basic 6.0 (VB6/VBA) Windows Forms

△メモ一覧にもどる


VB6/VBAのメンテナンスで

久しぶりにVB6.0/VBAを使うと、イベントの名前や発生順序を忘れていて戸惑う。

「まぁ頻繁じゃないから…」と、テストコードを毎回書いてきたが、数も重なってきたので、さすがにまとめておくことにした。

ほんとうにネットにないんだよね、イベント順序。

VBは発売から20年を超えてるはずなのに.

 

ユーザーによる操作

Loadされているフォームに対するユーザーの操作

Form 操作
最小化 最小から通常 最大化 最大から通常 ×で閉じる
イベント Initialize          
Load          
Resize ・1 ・1 ・1 ・1  
Activate   *2 *2 *2  
Paint   ・3 ・3    
Deactivate          
QueryUnload         ・1
Unload         ・2
Terminate          

・通常は発生する
*条件によって発生する
(数字は発生するイベントの順序)


スタートアップフォーム

プロジェクトのスタートアップに指定されたフォーム。既定(暗黙)のインスタンスを持った状態で立ち上がる。

 

Startup Form 操作
起動(Startup)Form 最小化 最大化 最大から通常 Formの×で閉じる Unload Me End
イベント Initialize ・1           発生しない
※b
Load ・2          
Resize ・3 ・1 ・1 ・1    
Activate ・4          
Paint ・5   ・2      
Deactivate            
QueryUnload         ・1 ・1
Unload         ・2 ・2
Terminate         *3 ※a *3 ※a

・通常は発生する
*条件によって発生する
※a. Loadされた他のFormが残っているとプログラムは終了しない。Terminateも発生しない。
※b. Endステートメントは、その時点でただちにプログラムの実行を終了させる。中断と解釈してもよい。
(数字は発生するイベントの順序)


子フォーム

スタートアップでないフォーム、コード上でオブジェクトとして生成されたフォーム

 

 Form 操作
Show Set obj = New Form obj.Show Visible
True
→False
Visible
False
→True
Unload * Set obj = New Form

Set obj = Nothing
イベント Initialize ・1 ・1          
Load ・2   ・1        
Resize ・3   ・2        
Activate ・4   ・3        
Paint ・5   ・4   ・1    
Deactivate              
QueryUnload           ・1  
Unload           ・2  
Terminate             *1 ※a
Form 操作
#既定フォームの
パブリック変数を
外から初めて読む
(A)
(A)の状態で
Set 既定フォーム=Nothing
(A)の状態で
スタートアップ
フォームを
Unload Me
フォームの
プロパティを
外から初めて読む
(B)
(B)の状態で
スタートアップ
フォームを
Unload Me
イベント Initialize ・1     *1 発生しない
※c
Load       ・2
Resize        
Activate        
Paint        
Deactivate        
QueryUnload        
Unload        
Terminate   ・1 ・1 ※b  

・通常は発生する *条件によって発生する (数字は発生するイベントの順序)
#既定フォームとは、VB/VBAではフォームをSet(インスタンス化)しなくてもそのまま呼び出せることを指す。次項の「既定のインスタンス・暗黙のインスタンス」を参照。
※a. obj が インスタンスになっているだけで、LoadされていないのであればTerminateが発生する
※b. スタートアップフォームのTerminate後に発生する
※c. この場合スタートアップフォームはUnloadされるが、Loadされた他のフォームは残留する。このためスタートアップフォームの終了処理は保留される。この状態から残留しているフォームをすべてUnloadしたとき、スタートアップフォームのTerminateが発生しプログラムは終了する。

既定のインスタンス・暗黙のインスタンス


「Set ~ = New」と「Dim ~As New」は、異なる


ボタン

フォーム上のコマンドボタンを押したときのイベント順

 

CommandButton 操作
ボタンを押す
イベント MouseMove ・1・5
(最初と終わりで発生する)
MouseDown ・2
Click ・3
MouseUp ・4

(数字は発生するイベントの順序)


クラス

クラスイベント(事実上のコンストラクタ/デストラクタ)
これ見るたびに、Newで引数を渡せたら可読性があがるのになぁと思う。

 

一般のClass 操作
Set obj = New Class Set obj = Nothing
イベント Initialize ・1  
Terminate   ・1
既定のインスタンスを
持ったClass
操作
クラス内の
プロパティ・
ファンクション・
パブリック変数
を使用したとき
プログラム
が終了するとき
イベント Initialize ・1  
Terminate   ・1

コラム - 既定のインスタンスを持ったClassとは


2018/11/22・山崎はるか
2021/04/01・コラム追加/修正
2021/06/02・補足事項訂正・解釈の誤り訂正・コラムの扱いを変更