教えて!ExcelVBA!

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

【ExcelVBA フォーム&コントロール】フォームを閉じる直前に処理を実行する方法を教えて!

f:id:m_kbou:20210126111330p:plain

フォームを閉じる直前に処理を実行するには、フォームのQueryCloseイベントプロシージャを使用します。その使い方について紹介します。

 

 

構文

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

Private Sub[オブジェクト名]_QueryClose(Cancel As Integer, CloseMode As Integer)
  [実行する処理内容]
End Sub

[説明]:

フォームを閉じる時に処理を実行させるイベントプロシージャはQueryCloseプロシージャを使用します。[オブジェクト名]にはフォームのオブジェクト名を記述します。また、[実行する処理内容]にはフォームを閉じる直前に実行する処理内容を記述します。CancelとCloseModeは引数となり、Cancelに「True」をセットするとイベントを中止し、「False」をセットするとイベントを実行します。初期値では「False」がセットされています。また、CloseModeにはフォームを閉じようとした時の動作値がセットされます。動作値の詳細については、以下に纏めておきます。内容を纏めると、「[オブジェクト名]で指定したフォームを閉じる直前に[実行する処理内容]を実行して下さい。」との意味になります。

【動作値内容】
0・・・[×]ボタンでフォームを閉じようとした。
1・・・Unloadステートメント等のコードで閉じようとした。
2・・・Windowsが終了した。
3・・・タクマネージャによって閉じられた。

[記述例]:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  MsgBox "画面を閉じます。"
End Sub

[サンプル画面]: 

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

f:id:m_kbou:20210121112143p:plain

 

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

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

f:id:m_kbou:20210630144102p:plain

(2)UserForm1フォームをダブルクリックします。
f:id:m_kbou:20210630144123p:plain

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

f:id:m_kbou:20210630144150p:plain

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

f:id:m_kbou:20210630144205p:plain

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

f:id:m_kbou:20210630144239p:plain

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

f:id:m_kbou:20210630144307p:plain

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

f:id:m_kbou:20210630144332p:plain

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

f:id:m_kbou:20210630144401p:plain

(8)「UserForm_QueryClose」イベントプロシージャが表示されます。(※このUserForm_QueryCloseイベントプロシージャの中に実行する処理内容を記述する事で、フォームを閉じる直前に処理を実行する事ができます。これ以降は実行する処理例について紹介します。)

f:id:m_kbou:20210630144424p:plain

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

(例①)フォームを閉じる時にメッセージを表示する方法

フォームを閉じる時にメッセージを表示する方法について紹介します。

[プログラミング例①]:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  MsgBox "画面を閉じます。"
End Sub

内容を説明すると、

「UserForm1フォームを閉じる直前に”画面を閉じます。”のメッセージを表示して下さい。」

との意味になります。

f:id:m_kbou:20210630144620p:plain

[実行例①]:

(実行前)

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

f:id:m_kbou:20210630144651p:plain

UserForm1画面が表示されるので、画面右上の[×]をクリックします。 

f:id:m_kbou:20210630144802p:plain

(実行後)

画面が閉じられると同時に「画面を閉じます。」のメッセージが表示されます。(※QueryCloseイベントプロシージャが有効に実行された事がわかります。)

f:id:m_kbou:20210630144903p:plain

[サンプル①]:

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

drive.google.com

(例②)フォームの[×]ボタンをクリックした時はフォームを閉じられない様に設定する方法

フォームの[×]ボタンをクリックした時はフォームを閉じられない様に設定する方法について紹介します。

[プログラミング例②]:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  If CloseMode = 0 Then
    MsgBox "[×]ボタンでは閉じられません。"
    Cancel = True
  End If
End Sub

内容を説明すると、

「UserForm1フォームの[×]ボタンをクリックした場合は、”[×]ボタンでは閉じられません。”のメッセージを表示して下さい。」

との意味になります。

f:id:m_kbou:20210630152104p:plain

[実行例②]:

(実行前)

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

f:id:m_kbou:20210630152118p:plain

UserForm1画面が表示されるので、画面右上の[×]をクリックします。 

f:id:m_kbou:20210630152132p:plain

(実行後)

「[×]ボタンでは閉じられません。」のメッセージが表示され、フォームと閉じる事ができません。(※QueryCloseイベントプロシージャが有効に実行された事がわかります。)

f:id:m_kbou:20210630152144p:plain

[サンプル②]:

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

drive.google.com

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

 

 

おわりに

今回はフォームを閉じる直前に処理を実行する方法について説明しました。似たようなイベントプロシージャにInitializeイベントがあります。Initializeイベントはフォームを表示する直前に実行するイベントとなります。こちらも一緒に覚えておいて下さい。