教えて!ExcelVBA!

ExcelVBAの基礎知識・書き方について紹介します。

【ExcelVBA フォーム&コントロール】フォームがアクティブになった時に処理を実行する方法を教えて!

f:id:m_kbou:20210120085923p:plain

フォームがアクティブになった時に処理を実行するには、フォームのActivateイベントプロシージャを使用します。その使い方について紹介します。

 

 

構文

イベントプロシージャの記述方法は以下の通りです。

Private Sub[オブジェクト名]_Activate()
  [実行する処理内容]
End Sub

[説明]:

フォームがアクティブになった時に処理を実行させるイベントプロシージャはActivateプロシージャを使用します。[オブジェクト名]にはフォームのオブジェクト名(フォーム名)を記述します。また、[実行する処理内容]にはフォームがアクティブになった時に実行する処理内容を記述します。内容を纏めると、「[オブジェクト名]で指定したフォームがアクティブになった場合、[実行する処理内容]を実行して下さい。」との意味になります。

[記述例]:

Private Sub UserForm_Activate()
  MsgBox "UserForm1がアクティブになりました。"
End Sub

[サンプル画面]: 

今回は以下2つのフォームを予め作成しておきます。このフォームを使用して処理を実行する方法について説明します。(※フォームの作り方についてはこちらを参考にして下さい。)

f:id:m_kbou:20210120090154p:plain

f:id:m_kbou:20210120090207p:plain

 

Activateイベントプロシージャの記述方法

(1)VBE(VBA記述画面)を開き、予め作成してある2つのフォームがある事を確認します。(※VBEの開き方についてはこちらを参考にして下さい。)

f:id:m_kbou:20210521091234p:plain

(2)UserForm1フォームをダブルクリックします。

f:id:m_kbou:20210521091446p:plain

(3)UserForm1フォームが表示されるので、フォーム上の任意の場所で右クリックします。小窓が開くので「コードの表示」を選択します。

f:id:m_kbou:20210521091510p:plain

※この時点で「UserForm_Click」イベントプロシージャが表示されます。(これは自動的に作成される仕組みとなっている様です。)

f:id:m_kbou:20210521091527p:plain

(4)オブジェクトボックスの▼ボタンをクリックします。

f:id:m_kbou:20210521091550p:plain

(5)プルダウン一覧の中から「UserForm」を選択します。

f:id:m_kbou:20210521091617p:plain

(6)プロシージャボックスの▼ボタンをクリックします。

f:id:m_kbou:20210521091637p:plain

(7)プルダウン一覧の中から「Activate」を選択します。

f:id:m_kbou:20210521091701p:plain

(8)「UserForm_Activate」イベントプロシージャが表示されます。(※このUserForm_Activateイベントプロシージャの中に実行する処理内容を記述する事で、フォームがアクティブになった時に処理を実行する事ができます。)

f:id:m_kbou:20210521091720p:plain

(9)(8)で作成したイベントプロシージャに実行させる内容を記述します。以下で記述例を紹介します。

[プログラミング例]:

Private Sub UserForm_Activate()
  MsgBox "UserForm1がアクティブになりました。"
End Sub

内容を説明すると、

「UserForm1フォームがアクティブになった時に”UserForm1がアクティブになりました。”のメッセージを表示して下さい。」

との意味になります。

f:id:m_kbou:20210521091757p:plain

(10)次にUserForm2フォームに対しても上記の内容と同じ事をしますので、UserForm2をダブルクリックして(3)~(8)の説明内容を実施します。

f:id:m_kbou:20210521091825p:plain

(11)(10)で作成したイベントプロシージャに実行させる内容を記述します。以下で記述例を紹介します。

[プログラミング例]:

Private Sub UserForm_Activate()
  MsgBox "UserForm2がアクティブになりました。"
End Sub

内容を説明すると、

「UserForm2フォームがアクティブになった時に”UserForm2がアクティブになりました。”のメッセージを表示して下さい。」

との意味になります。

f:id:m_kbou:20210521092243p:plain

(12)次に上記で作成したUserForm1及びUserForm2フォームに記述したActivateイベントプロシージャを実行するため、両フォームを表示するプログラムを記述します。記述するにはメニューにある「挿入」をクリックし、「標準モジュール」を選択します。

f:id:m_kbou:20210521092314p:plain

(13)画面左のプロジェクト内に標準モジュール及びModule1が追加されます。

f:id:m_kbou:20210521092337p:plain

(14)このModule1に以下のプログラムを記述します。

[プログラミング例]:

Sub サンプル()
  UserForm1.Show vbModeless
  UserForm2.Show vbModeless
End Sub

内容を説明すると、

「UserForm1及びUserForm2フォームをモードレスで表示して下さい。」

との意味になります。

※通常フォームを表示するShowメソッドを使うと1つのフォームが表示されている間は他のフォームが表示できなくなりますが、フォームを「モードレス」という方法で表示させるとフォームが開いていても他のフォームを開く事が可能となります。

f:id:m_kbou:20210521092528p:plain

(15)プログラムを実行します。(※実行するにはメニューにある実行ボタン(▶)をクリックします。)

f:id:m_kbou:20210521092551p:plain

(16)UserForm1画面及びUserForm2画面が表示されます。 

f:id:m_kbou:20210624115205p:plain

(17)UserForm1画面をクリックすると、「UserForm1がアクティブになりました。」のメッセージが表示されます。(※クリックする事でUserForm1画面がアクティブになったためメッセージが表示されました。上記(9)で設定したActivateイベントプロシージャが有効に実行された事がわかります。)

f:id:m_kbou:20210521092633p:plain

(18)次に、UserForm2画面をクリックすると、「UserForm2がアクティブになりました。」のメッセージが表示されます。(※クリックする事でUserForm2画面がアクティブになったためメッセージが表示されました。上記(11)で設定したActivateイベントプロシージャが有効に実行された事がわかります。)

f:id:m_kbou:20210521092658p:plain

Activateイベントプロシージャの記述方法についての説明は以上です。

 

サンプル

上記で説明したファイルをダウンロードできます。ご自由にお使い下さい。

drive.google.com

 

おわりに

今回はフォームがアクティブになった時に処理を実行する方法について説明しました。Activateイベントと同じくらい使用頻度の高いイベントにInitializeイベントがあります。各々の違いとしてActivateイベントはユーザーフォームがアクティブになった時に実行されるイベントですが、Initializeイベントはフォームを表示する前に実行するイベントとなります。混同されやすいので注意して使用して下さい。