Excelのユーザーフォームを表示するときに実行される、Initializeイベントについてご説明します。
Initializeイベントは、ユーザーフォームが表示されるときに実行されるため、コンボボックスのリスト登録や、リストボックスのリスト登録、その他フォームの準備処理に使用します。
そのため非常に使用頻度の高い処理となります。
似たようなイベントにActivateイベントがあります。
Activateイベントとの違いについても、簡単にですがご説明します。
その他のイベントの使い方については、下記記事をご覧下さい。
1.Initializeイベントの使い方
Initializeイベントとは
ユーザーフォームが読み込まれて、表示される際に実行されるイベントです。
Initializeイベントは「Initialize」を使用し、「イニシャライズ」と読みます。
対象となるユーザーフォームが表示される時に発生し、表示するユーザーフォームでリスト生成などの準備をするイベントです。
ユーザーフォームが開く前に実行されるため、組み込まれた処理が実行されてからユーザーフォームが表示されます。
Initializeイベントの生成方法
イベントを組み込みたいユーザーフォームを選択して、フォームモジュールを開きます。
右クリックしてコードの表示を選択するか、ユーザーフォームをWクリックすると開きます。
開いた直後は他のイベントが記述されていない場合は、「Clickイベント」が自動で生成されます。
今回はClickイベントは使用しないので、そのまま、もしくは削除して構いません。
図の右側の「Click」をリストから「Initialize」を変更します。
「Initialize」を選択すると自動的にイベントプロシージャの「Private Sub UserForm_Initialize()」が生成されます。
生成されたイベントプロシージャ内に実行したい処理を組み込むと、ユーザーフォームが表示される際に「Initialize」イベントが実行されます。
2.ActivateとInitializeの違い
Initializeイベントと同じくらい使用頻度の高いActivateイベントがあり、混同されやすいイベントです。
違いについて、簡単にご説明します。
Initializeイベントは「初期化する」という意味ですが、基本的には読み込まれた瞬間に実行されます。
そのため、ユーザーフォームが開いた後ではなく、開く前に実行されます。
そしてActivateイベントより前に実行されます。
Activateはユーザーフォームがアクティブになった時に実行されます。
何が違うかと言いますと、Initializeイベントは表示→削除→表示→削除と表示したり消したりを繰り返すことで何度も実行されます。
ですが、ActivateイベントはUserForm1とUserForm2を同時に開いている場合に、UserForm1と2を交互に選択することで、アクティブになるたびに実行されます。
似ていますが、トリガーとなるタイミングが違いますので使い分けが必要になります。
Activateイベントについては「ユーザーフォームがアクティブになった時に実行されるイベント」をご覧下さい。
3.Initializeイベントを実行する
それでは実際にInitializeイベントを実行するサンプルコードを作ってみます。
ユーザーフォームをUserForm1を準備して、表示したユーザーフォームのオブジェクト名をメッセージボックスに表示したいと思います。
標準モジュール
まずは標準モジュールに記述するコードです。
フォームを開く
とりあえずユーザーフォームを開くコードです。
Sub FormShow()
UserForm1.Show vbModeless
End Sub
開いた時にフォームの名前を表示する
次にユーザーフォームを開いた時にフォームの名前を取得するコードです。
「Public変数」でユーザーフォーム開いた時に対象となったユーザーフォームのオブジェクト名を変数に格納する事で、UserForm1を固定で指定しなくても処理が可能になります。
変数に格納しておくことで、以後の処理が非常に楽になります。
※もし「Public変数」を使用したくない場合は最後に、使用しない方法でサンプルコードを記述しています。
Public ActForm As Object
Sub FormNameGet()
MsgBox ActForm.Name
End Sub
フォームモジュール
次に各UserForm1のフォームモジュールにInitializeイベントを生成して、以下のコードを記述します。
Private Sub UserForm_Initialize()
Set ActForm = Me
Call FormNameGet
End Sub
実行する
まずは上記のフォームを開くための「Sub FormShow()」実行します。
ユーザーフォームを開こうとしたら、「Initializeイベント」が実行されてオブジェクト名が取得出来ます。
開いた後ではなく開こうとしたら実行されるため、先にメッセージボックスが表示されます。
メッセージボックスを「OK」するとユーザーフォームが表示されます。
Public変数を使わない場合
表示部分は変数を使用していませんので、「Sub FormNameGet()」と「Private Sub UserForm_Activate()」を書き換えています。
標準モジュール
Sub FormNameGet(ActForm As Object)
MsgBox ActForm.Name
End Sub
フォームモジュール
Private Sub UserForm_Activate()
Call FormNameGet(Me)
End Sub
今回は単純にユーザーフォームのオブジェクト名を表示しただけですが、実務としてはコンボボックスのリスト生成やリストボックスのリスト生成、その他にもオプションボタンやチェックボックスなどに予めチェックするなどの処理があります。