GotFocus・LostFocusイベント

埋め込みコントロールのフォーカスの取得・喪失で発生するイベントです

埋め込みコントロールでの特別なイベントに「GotFocus」「LostFocus」イベントがあります
埋め込みコントロールについては以下の記事を確認してください

このイベントは名前の通り、フォーカスを取得した時(GotFocus)と失った時(LostFocus)に発生するイベントです

コード作成例

Private Sub TextBox1_GotFocus()

Range("A1") = "あなたの名前を入力してください"

End Sub

GotFocusイベントは、コントロールがフォーカスを取得したときに発生するイベントです
このイベントに、A1セルにテキストボックスの使用説明を表示します

Private Sub TextBox1_LostFocus()

Range("A1") = "テキストボックスを選択してください"

End Sub

LostFocusイベントは、コントロールがフォーカスを失った時に発生するイベントです
このイベントに、A1セルに操作手順の説明文を表示します

イベント作成時の動き
実際の動き

コードを作成して、実際の動きを確認してみます

セル選択されている間は、A1には「テキストボックスを選択してください」と表示されます
指示に従い、テキストボックスを選択すると「あなたの名前を入力してください」に表示が切り替わります

このようにコントロールを選択した時点で処理を行うことでユーザーの操作性が向上します

ただ、このLostFocusイベントで注意点があります
このイベントは「デザインモードに入ったときには発生しない」という点です

コントロールにフォーカスがある状態で、コントロールの追加や編集などでデザインモードに切り替わると、フォーカスは失っていますがイベントは発生しません

通常の操作では起こりえない話なので問題は無いと思いますが、そういった瞬間も存在していることは理解しておいたほうが良いと思います

Terminateイベント

TerminateイベントはUserFormがメモリ上から解放されると発生するイベントです

「Terminate」イベントはUserFormがメモリ上から解放されると発生します

QueryCloseイベントで終了が許可された場合、その後に発生しますのでフォームの終了処理に向いています

ただ、注意点としてフォームがメモリ上から解放されているため、UserFormの情報が取得できません
サイト記事にもある、前回と同じ場所にフォームを表示する処理で位置を取得する際にはQueryCloseイベントを使用しております
このイベントでは、その位置情報を取得が出来ないためです

なので、このイベントはフォームの情報取得が必要ない場合に使用できます

上記の通りフォームの情報が終了処理に必要な場合はQueryCloseイベントを使用してください
それ以外のブックを終了させるなどの処理なら、このイベントを利用する形で十分だとおもいます

また、リファレンスにもありますが、このイベントはUserFormがメモリ上に読み込まれた後、解放されて初めて実行されます

別記事にEndステートメントで強制的にフォームの起動をキャンセルさせる処理がありますが、その処理の場合はこのイベントはフォーム終了するタイミングであっても発生しません

あと、このイベントは解放されてしまっているので、QueryCloseイベントのように終了をキャンセルするようなことはできません

Initializeイベント

Initializeイベントはメモリ上に読み込みが完了した時点で発生するイベントです。起動時の注意点など

「Initialize」イベントは、UserFormがメモリ上に読み込まれたら発生するイベントです
表示される前に発生するイベントで、引数はありません

フォームの初期化処理で使用します

Loadステートメントを実行すると、このイベントが発生します
Showメソッドを実行した場合は、このイベントが発生後にActivateイベントが発生します

また、メモリ上に読み込みが終了しているので、UserFormの操作及び各コントロール全ての操作が可能な状態になります

表示前の処理になるので、このイベントに作成した処理が時間のかかるものであった場合は上記の各読み込みコード実行前に起動の明示をしていないとユーザーにフリーズさせているような誤解を与える可能性があります

そういった場合は、あえてActivateイベントに処理を入れてフォームを表示させておいてもいいかもしれません

フォームの起動条件の作成について

このイベント中にフォームを終了させるとエラーが発生します
フォームの起動条件の確認には、読み込みプロシージャかActivateイベントで行い終了させるようにしてください

ただ、この処理では少し問題がある場合があります
その状況と解決方法は以下の記事で解説しています

AddControlイベント

AddControlイベントはAddメソッドによりコントロールが新規作成された時に発生します

AddControlイベントは、指定のフォームでコードにより新たにコントロールが作成されたときに発生するイベントです

最初にLoadされた時にもコントロールは作成されていますが、ここでは発生しません
Addメソッドを使用してコントロールを追加した際に発生します

UserFormでのイベント

引数
AddControl(ByVal Control As MSForms.Control)
Controlは、新規作成されたコントロールです

'フォームにボタンを新規作成
Dim 新ボタン As CommandButton
Set 新ボタン = Me.Controls.Add("Forms.CommandButton.1", "新ボタン")
Set 新ボタン = Nothing

ユーザーフォームでは、フォームにコントロールを作成したときに発生します
上記のコードでコマンドボタンを新規追加作成します
この2行目のコードで、イベントが発生します

Frameでのイベント

引数
AddControl(ByVal Control As MSForms.Control)
Controlは、新規作成されたコントロールです

'フレームにボタンを新規作成
Dim 新ボタン As CommandButton
Set 新ボタン = Me.Frame1.Controls.Add("Forms.CommandButton.1", "新ボタン")
Set 新ボタン = Nothing

こちらのコードではFrameコントロールにコマンドボタンを新規作成します
フォームの方と同じで、2行目のコードでイベントが発生します

MultiPageでのイベント

引数
AddControl(ByVal Index As Long, ByVal Control As MSForms.Control)
Indexは、追加したコントロールのページのインデックス番号です
Controlは、新規作成されたコントロールです

'フレームにボタンを新規作成
Dim 新ボタン As CommandButton
Set 新ボタン = Me.MultiPage1.Pages(0).Controls.Add("Forms.CommandButton.1", "新ボタン")
Set 新ボタン = Nothing

MultiPageコントロールの1ページ目にコマンドボタンを追加するコードです
ここも2行目のコード実行時にイベントが発生します

似たようなコントロールのTabStripコントロールではコントロールの追加作成は行えませんのでイベントもありません

また、ページの追加作成ではこのイベントは発生しません

引数Controlについて

Controlには新規作成したコントロールが代入されます
引数の型は「MSForms.Control」となっていますので、コントロールの型全てを含む型になります
なので、この引数でのコーディング時には各コントロールの専用プロパティなどがインテリセンス入力されませんが、使用は出来ます

Activateイベント

Activateイベントは、初期表示後と他フォームからの切り替えで発生するイベントです

Activateイベントはアクティブ状態になったときに発生するイベントです

初期状態でいうと、フォームの表示される前に「Initialize」イベントが発生し、表示されて最初にこのイベントが発生します

このイベントは別のフォームからアクティブ状態になったときにも発生しますが、Excelや別のアプリからアクティブ状態になっても発生しません

複数のフォームを並行して使用する際に、このフォームイベントで特定のフォームがアクティブ状態になったら関連するシートやブックに切り替える、といった動きに使えます
複数のフォームを自由に切替するには「ShowModal」プロパティをFalseに設定する必要があります

他によくあるのがフォームを別のアプリ(Excel以外)よりも全面に表示する処理でも使用します
Excel以外のアプリをアクティブ状態にすれば、当然そのアプリが最前面表示されますが、その際にすべてのアプリより全面に表示させることでなんらかの情報をフォームに表示させて他のアプリを操作できます
これにはWinAPIを使用して、アクティブウィンドウとしてユーザーフォームのハンドル値を取得してそれに対して表示処理を設定します
これと同じようにWinAPIを使用して、×ボタンを使用不可にしたりする際にも使用します

このように、このイベントは大きく2通りの目的があるので、状況に合わせて使用してください