ユーザーフォームが閉じる直前に発生するイベント(QueryCloseイベント)

ユーザーフォームが閉じる直前に発生するイベントが QueryClose イベントです。このイベントに対するイベントプロシージャを作成することで、ユーザーフォームが閉じる前に何らかの確認を行うなどの処理をすることができます。ここでは Excel のユーザーフォームでユーザーフォームが閉じる直前に発生する QueryClose イベントについて解説します。

(Last modified: )

QueryCloseイベントの利用方法

イベントフォームが閉じる直前に発生するイベントが QueryClose です。ユーザーフォームオブジェクトで発生します。このイベントに対するイベントプロシージャを作成することで、ユーザーフォームが閉じる直前に行いたい処理などを実行することができます。

ユーザーフォームには右上に「×」ボタンが表示されておりクリックするとユーザーフォームが閉じます。またユーザーフォームに表示されているボタンがクリックされたときに Unload 文を実行するとユーザーフォームが閉じます。このようにユーザーフォームが閉じようとしているときに直前に QueryClose イベントが発生します。

それでは例として次のようにテキストボックスとコマンドボタンが 1 つずつ設置されたユーザーフォームで QueryClose イベントに対するイベントプロシージャを作成してみます。

QueryCloseイベントの利用方法(1)

ユーザーフォームの何もコントロールが設置されているところをダブルクリックしてください。

QueryCloseイベントの利用方法(2)

ユーザーフォームの既定のイベントに対するイベントプロシージャが表示されます。

Private Sub UserForm_Click()

End Sub

QueryCloseイベントの利用方法(3)

Visual Basic Editor の画面右上にある次の部分をクリックし、イベントの種類として QueryClose を選択してください。

QueryCloseイベントの利用方法(4)

QueryCloseイベントの利用方法(5)

QueryClose イベントに対するイベントプロシージャが表示されました。(最初に表示された Click イベント用のイベントプロシージャは消して頂いて構いません)。

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

End Sub

QueryCloseイベントの利用方法(6)

QueryClose イベントのイベントプロシージャでは 2 つの引数を取ります。

変数説明
Cancel0 を設定するとユーザーフォームは閉じます。 0 以外の整数を指定すると QueryClose イベントは停止し、ユーザーフォームは閉じなくなります。
CloseModeどのような状況で QueryClose イベントが発生したのかを通知します。

CloseMode の値は次のいずれかです。

定数説明
vbFormControlMenu0ユーザーフォームの「閉じる」コマンドを実行した。
vbFormCode1コードから Unload 文が呼び出された。
vbAppWindows2Windows セッションが終了しようとした。
vbAppTaskManager3Windows タスクマネージャーがアプリケーションを閉じようとした。

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イベントの利用方法(7)

QueryClose イベントが発生しイベントプロシージャが実行されると、確認ダイアログを表示します。「OK」をクリックしたら Cancel 変数に 0 を設定しユーザーフォームを閉じます。「キャンセル」をクリックしたら Cancel 変数に 1 を設定しユーザーフォームを閉じるのをキャンセルします。

それでは実際に試してみます。「Sub/ユーザーフォームの実行」をクリックしてください。

QueryCloseイベントの利用方法(8)

ユーザーフォームが表示されたら、右上に表示されている「×」をクリックしてユーザーフォームを閉じてください。

QueryCloseイベントの利用方法(9)

するとユーザーフォームが閉じる前に QueryClose イベントが発生し、確認ダイアログが表示されます。

QueryCloseイベントの利用方法(10)

「OK」をクリックすると確認ダイアログが閉じたあとユーザーフォームも閉じます。「キャンセル」をクリックすると確認ダイアログが閉じますがユーザーフォームが閉じるのはキャンセルされてユーザーフォームがそのまま表示されます。

QueryCloseイベントの利用方法(11)

QueryCloseイベントの利用方法(12)

サンプルコード

もう一つサンプルを作成して試してみます。

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イベントの利用方法(13)

このように QueryClose イベントのイベントプロシージャを作成することで、ユーザーフォームが表示される直前に行いたい処理を実行することができます。

それでは実際に試してみます。「Sub/ユーザーフォームの実行」をクリックしてください。

QueryCloseイベントの利用方法(14)

ユーザーフォームが表示されたら、右上に表示されている「×」をクリックしてユーザーフォームを閉じてください。

QueryCloseイベントの利用方法(15)

するとユーザーフォームが閉じる前に QueryClose イベントが発生します。イベントプロシージャの中で、 CloseMode 変数の値を調べ、「×」ボタンをクリックして閉じようとしていたのでダイアログを表示して「×」ボタンでは閉じることができないことを表示します。

QueryCloseイベントの利用方法(16)

ダイアログを閉じるとユーザーフォームが閉じるのはキャンセルされてユーザーフォームがそのまま表示されます。

QueryCloseイベントの利用方法(17)

ユーザーフォームに表示されているコマンドボタンをクリックすると、コマンドボタンの Click イベントが発生し、イベントプロシージャが実行されてユーザーフォームが閉じます。

QueryCloseイベントの利用方法(18)

この場合もユーザーフォームが閉じる前に QueryClose イベントが発生しますが、イベントプロシージャの中で、 CloseMode 変数の値が「×」ボタンをクリックして閉じようとしていたわけではないので、そのままユーザーフォームを閉じます。

-- --

Excel のユーザーフォームでユーザーフォームを表示する直前に発生する Initialize イベントについて解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。