ユーザーフォームが閉じる直前に発生するイベント(QueryCloseイベント)
ユーザーフォームが閉じる直前に発生するイベントが QueryClose イベントです。このイベントに対するイベントプロシージャを作成することで、ユーザーフォームが閉じる前に何らかの確認を行うなどの処理をすることができます。ここでは Excel のユーザーフォームでユーザーフォームが閉じる直前に発生する QueryClose イベントについて解説します。
(Last modified: )
QueryCloseイベントの利用方法
イベントフォームが閉じる直前に発生するイベントが QueryClose です。ユーザーフォームオブジェクトで発生します。このイベントに対するイベントプロシージャを作成することで、ユーザーフォームが閉じる直前に行いたい処理などを実行することができます。
ユーザーフォームには右上に「×」ボタンが表示されておりクリックするとユーザーフォームが閉じます。またユーザーフォームに表示されているボタンがクリックされたときに Unload 文を実行するとユーザーフォームが閉じます。このようにユーザーフォームが閉じようとしているときに直前に QueryClose イベントが発生します。
それでは例として次のようにテキストボックスとコマンドボタンが 1 つずつ設置されたユーザーフォームで QueryClose イベントに対するイベントプロシージャを作成してみます。
ユーザーフォームの何もコントロールが設置されているところをダブルクリックしてください。
ユーザーフォームの既定のイベントに対するイベントプロシージャが表示されます。
Private Sub UserForm_Click() End Sub
Visual Basic Editor の画面右上にある次の部分をクリックし、イベントの種類として QueryClose を選択してください。
QueryClose イベントに対するイベントプロシージャが表示されました。(最初に表示された Click イベント用のイベントプロシージャは消して頂いて構いません)。
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) End Sub
QueryClose イベントのイベントプロシージャでは 2 つの引数を取ります。
| 変数 | 説明 |
|---|---|
| Cancel | 0 を設定するとユーザーフォームは閉じます。 0 以外の整数を指定すると QueryClose イベントは停止し、ユーザーフォームは閉じなくなります。 |
| CloseMode | どのような状況で QueryClose イベントが発生したのかを通知します。 |
CloseMode の値は次のいずれかです。
| 定数 | 値 | 説明 |
|---|---|---|
| vbFormControlMenu | 0 | ユーザーフォームの「閉じる」コマンドを実行した。 |
| vbFormCode | 1 | コードから Unload 文が呼び出された。 |
| vbAppWindows | 2 | Windows セッションが終了しようとした。 |
| vbAppTaskManager | 3 | Windows タスクマネージャーがアプリケーションを閉じようとした。 |
2 番目の引数である CloseMode の値を調べることで、どのようにユーザーフォームが閉じようとしているのかを調べることができます。また 1 番目の引数である Cancel にイベントプロシージャの中で値を設定することで、ユーザーフォームが閉じるのをキャンセルすることができます。
それでは簡単なサンプルを作成して試してみます。
QueryClose イベントのイベントプロシージャに次のように記述しました。ユーザーフォームを閉じようとすると確認ダイアログを表示して本当に閉じるかどうか確認します。
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Dim ans As Integer
ans = MsgBox("閉じますか", vbOKCancel, "確認")
If ans = vbOK Then
Cancel = 0
Else
Cancel = 1
End If
End Sub
QueryClose イベントが発生しイベントプロシージャが実行されると、確認ダイアログを表示します。「OK」をクリックしたら Cancel 変数に 0 を設定しユーザーフォームを閉じます。「キャンセル」をクリックしたら Cancel 変数に 1 を設定しユーザーフォームを閉じるのをキャンセルします。
それでは実際に試してみます。「Sub/ユーザーフォームの実行」をクリックしてください。
ユーザーフォームが表示されたら、右上に表示されている「×」をクリックしてユーザーフォームを閉じてください。
するとユーザーフォームが閉じる前に QueryClose イベントが発生し、確認ダイアログが表示されます。
「OK」をクリックすると確認ダイアログが閉じたあとユーザーフォームも閉じます。「キャンセル」をクリックすると確認ダイアログが閉じますがユーザーフォームが閉じるのはキャンセルされてユーザーフォームがそのまま表示されます。
もう一つサンプルを作成して試してみます。
QueryClose イベントのイベントプロシージャに次のように記述しました。ユーザーフォームを「×」ボタンをクリックして閉じようとするとキャンセルするようにします。
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
MsgBox "閉じるボタンでは閉じれません"
Cancel = 1
End If
End Sub
またコマンドボタンの Click イベントで、ボタンがクリックされたらユーザーフォームを閉じるように記述します。
Private Sub CommandButton1_Click()
Unload Me
End Sub
このように QueryClose イベントのイベントプロシージャを作成することで、ユーザーフォームが表示される直前に行いたい処理を実行することができます。
それでは実際に試してみます。「Sub/ユーザーフォームの実行」をクリックしてください。
ユーザーフォームが表示されたら、右上に表示されている「×」をクリックしてユーザーフォームを閉じてください。
するとユーザーフォームが閉じる前に QueryClose イベントが発生します。イベントプロシージャの中で、 CloseMode 変数の値を調べ、「×」ボタンをクリックして閉じようとしていたのでダイアログを表示して「×」ボタンでは閉じることができないことを表示します。
ダイアログを閉じるとユーザーフォームが閉じるのはキャンセルされてユーザーフォームがそのまま表示されます。
ユーザーフォームに表示されているコマンドボタンをクリックすると、コマンドボタンの Click イベントが発生し、イベントプロシージャが実行されてユーザーフォームが閉じます。
この場合もユーザーフォームが閉じる前に QueryClose イベントが発生しますが、イベントプロシージャの中で、 CloseMode 変数の値が「×」ボタンをクリックして閉じようとしていたわけではないので、そのままユーザーフォームを閉じます。
-- --
Excel のユーザーフォームでユーザーフォームを表示する直前に発生する Initialize イベントについて解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。