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 | ||

