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