ユーザーフォームが閉じる直前に発生するイベント(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 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。