教えて!ExcelVBA!

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

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

     f:id:m_kbou:20210125101746p:plain

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

 

【目次】

 

構文

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

=======================================================

Private Sub [オブジェクト名]_Deactivate()

   [実行する処理内容]

End Sub

=======================================================

[説明]:

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

[記述例]:

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

[サンプル画面]: 

今回は以下2つの画面(サンプル画面)を使用して処理を実行する方法について説明します。
※サンプル画面の作成方法については、こちらを参考にして下さい。

f:id:m_kbou:20210120090051p:plain

f:id:m_kbou:20210120090105p:plain

各サンプル画面のフォーム名は以下の内容となります。

f:id:m_kbou:20210120090154p:plain

f:id:m_kbou:20210120090207p:plain

 

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

(1)VBE(VBA記述画面)を開き、フォームにあるUserForm1をダブルクリックします。

f:id:m_kbou:20210125101844p:plain

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

f:id:m_kbou:20210125101901p:plain

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

f:id:m_kbou:20210125101927p:plain

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

f:id:m_kbou:20210125101945p:plain

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

f:id:m_kbou:20210125101959p:plain

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

f:id:m_kbou:20210125102016p:plain

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

f:id:m_kbou:20210125102030p:plain

(7)「UserForm_Deactivate」イベントプロシージャが表示されます。

※このUserForm_Deactivateイベントプロシージャの中に実行する処理内容を記述する事で、フォームが非アクティブになった時に処理を実行する事ができます。

f:id:m_kbou:20210125102049p:plain

(8)UserForm_Deactivateイベントプロシージャに実行する処理を記述します。今回はフォームが非アクティブになった時に「UserForm1が非アクティブになりました。」を表示させる方法について紹介します。

記述は以下の通りとなります。

[記述例]:

-------------------------------------------------

Private Sub UserForm_Deactivate()

    MsgBox "UserForm1が非アクティブになりました。"

End Sub

-------------------------------------------------

内容を説明すると、

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

との意味になります。

f:id:m_kbou:20210125102107p:plain

(9)次にUserForm2フォームに対しても上記(2)~(7)で説明した内容と同じ内容を設定しますので、UserForm2をダブルクリックします。

f:id:m_kbou:20210120090703p:plain

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

f:id:m_kbou:20210120090719p:plain

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

f:id:m_kbou:20210125102242p:plain

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

f:id:m_kbou:20210125102302p:plain

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

f:id:m_kbou:20210125102319p:plain

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

f:id:m_kbou:20210125102333p:plain

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

f:id:m_kbou:20210125102358p:plain

(15)「UserForm_Deactivate」イベントプロシージャが表示されます。

※このUserForm_Deactivateイベントプロシージャの中に実行する処理内容を記述する事で、フォームが非アクティブになった時に処理を実行する事ができます。

f:id:m_kbou:20210125102440p:plain

(16)UserForm_Deactivateイベントプロシージャに実行する処理を記述します。今回はフォームが非アクティブになった時に「UserForm2が非アクティブになりました。」を表示させる方法について紹介します。

記述は以下の通りとなります。

[記述例]:

-------------------------------------------------

Private Sub UserForm_Deactivate()

    MsgBox "UserForm2が非アクティブになりました。"

End Sub

-------------------------------------------------

内容を説明すると、

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

との意味になります。

f:id:m_kbou:20210125102416p:plain

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

f:id:m_kbou:20210125102608p:plain

(18)画面左のプロジェクト内に標準モジュールが追加され、画面右にプログラム記述エリア(空白エリア)が表示されます。この空白エリアにプログラムを記述します。

f:id:m_kbou:20210125102623p:plain

(19)記述するプログラムは以下の内容となります。

[記述例]:

----------------------------------------------------

Sub サンプル()

    UserForm1.Show vbModeless
    UserForm2.Show vbModeless

End Sub

----------------------------------------------------

内容を説明すると、

「UserForm1及びUserForm2フォームを表示して下さい。」

との意味になります。

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

f:id:m_kbou:20210125102639p:plain

(20)プログラムを実行します。

※実行するにはメニューにある実行ボタン▶をクリックします。

f:id:m_kbou:20210125102656p:plain

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

f:id:m_kbou:20210125102711p:plain

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

f:id:m_kbou:20210125102729p:plain

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

f:id:m_kbou:20210125102743p:plain

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

 

サンプル

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

drive.google.com

 

おわりに

今回はフォームが非アクティブになった時に処理を実行する方法について説明しました。Deactivateイベントに類似したイベントとしてActiveイベントがあります。Activeイベントはフォームがアクティブになった時に処理が実行されるイベントとなります。こちらも是非覚えておいて下さい。