Excel VBA UserForm の表示/閉じる方法について

スポンサーリンク

UserForm に関することを色々と勉強してきましたが、肝心な UserForm の表示や終了の部分を詳しく解説していませんでした。今回は UserFrom の表示/閉じるについて勉強していきましょう。

くるみこ
くるみこ

説明を省略していましたが、ここで UserForm の表示方法と終了する方法についてきちんと勉強しておきましょうましょう(^^)/

そういえば UserForm の表示や終了方法を正式に勉強していませんでしたね。Show で表示することはわかっていますけど、その他にどうんなものがあるのか、よろしくお願いしますm(__)m

【この記事でわかること
・UserForm を表示する方法がわかります
UserForm を閉じる方法がわかります

前回記事のおさらいは、下のカードをクリックすれば開きます(^^ゞ

くるみこ
くるみこ

Excelブックの起動時にマクロを自動実行させるWorkbook_OpenイベントとAuto_Openプロシージャの違いとそれぞれの使用方法を解説しています。是非こちらもあわせてご覧ください(^^)/

スポンサーリンク

UserForm を表示する方法

・UserForm を表示するには UserFormオブジェクトの Show メソッドで設定します。

Showメソッド と Loadステートメント

Show メソッド

【構文】[object ].Show modal  (引数 modalには次の定数を指定できます
・objectには、開く UserForm を指定します。

定数説明
vbModal (既定値)1UserFormを閉じるまでExcel内の他の部分は使用できません
vbModeless0UserFormを表示した状態でExcel内の他の部分を使用できます

InitializeイベントやClickイベントなどのイベントから表示させることが一般的です。

Sub sample01()
    MsgBox "UserForm1をモダールで開きます!"
    UserForm1.Show vbModal
    UserForm1.Show vbModeless
    MsgBox "UserForm1をモードレスで開きました!"
End Sub

・最初は「vbModal」モダールで開きます。
・次は「vbModeless」モードレスで開きます。

Load ステートメント

Loadステートメントは、UserFormをメモリに読み込みます。
【構文】Load objec (objectには、読み込む UserForm を指定します)

実は、事前にメモリにロードされていないまま Showメソッドで UserForm を表示する場合、自動的にメモリにロードされているんです

Loadステートメントを単独で使う場合は、UserForm上のプロパティを参照したり設定しようとする場合です。Showメソッドで表示される前に設定を整えておく必要がある場合などには、メモリに Loadする必要があります。

'Userform起動(Losd後Captionを変更して表示する)
Sub sample02()
    Dim Res As String
    Load UserForm1
    MsgBox "UserForm1をロードしました!"
    Res = InputBox("フォームのタイトルを入力してください!")
    UserForm1.Caption = Res
    UserForm1.Show
End Sub

・上の例では、Load 後に UserFormCaption を入力変更してから表示します。

UserForm を閉じる方法

UserForm を閉じる方法で一番簡単なのは、右上の「×」ボタンで閉じる方法です。
・もちろんVBAを操作して閉じることも可能です。
UserForm を閉じると、UserForm がメモリ上から削除されてしまいます。同時に UserForm 上で設定取得していた情報などはすべて破棄されてしまいます。この点を考慮していく必要がありますので注意してください

UnLoad ステートメント

UnLoadステートメントは、メモリに読み込んだ UserFormをメモリから解放します。
【構文】UnLoad objec (objectは、閉じる UserForm を指定します)

'UserFormを閉じる際にメッセージを表示する
Sub UnLoadSample()
    UnLoad UserForm1
    MsgBox "UserForm1をアンロードしました!"
End Sub

UserForm が閉じる際のイベント

UserForm が閉じらる際のイベントを二つ紹介しておきます。
・発生順に QueryClose イベントと Terminate イベントの二つです。

QueryClose イベント

UserForm が閉じられようとする直前で発生するイベントです。
・VBAで Unload Me されたり、フォーム右上の「x」ボタンを押した時に発生します。

【構文】Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

指定項目説明
Cancel0 以外の値に設定すると、QueryCloseイベントが停止されます。
CloseModeQueryCloseイベントの発生原因を示す値または定数です。

CloseMode 引数は、次の値を返します。

定数説明
vbFormControlMenu0UserFormコントロール メニューで
[閉じる] コマンドを選択しました。
vbFormCode1コードから Unload ステートメントが呼び出されます。
vbAppWindows2現在の Windows オペレーティング環境セッションが
終了しようとしています。
vbAppTaskManager3Windows タスク マネージャー がアプリケーションを
閉じようとしています。

QueryClose には引数「Cancel」があります。
・引数「Cancel」に「0」以外を指定することでこのイベントをキャンセルすることができます。
UserForm を閉じようとするときに確認してから閉じたい場合に引数「Cancel」を使います。

「×」ボタンでは閉ないようにするコード
'「×」ボタンの場合は閉ないようにする
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
        MsgBox "[×]ボタンでは閉じられません!", vbExclamation
        Cancel = 1  '0以外では終了しない
    End If
End Sub

・「Cancel」への代入は、Falseが 0 なので True(=1)としてもいいでしょう。

Terminate イベント

オブジェクトを参照するすべての変数が Nothing に設定され、オブジェクトのインスタンスへの参照がメモリからすべて削除されるか、オブジェクトへの最後の参照がスコープ外になったときに発生します。【参照先】https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/terminate-event-visual-basic-for-applications

・こんな感じで使えます。UserForm が存在していないことが確認できます。

'UserFormが閉じたらUserFormをカウントしてみる
Private Sub UserForm_Terminate()
    Dim n As Long
    n = UserForms.Count
    MsgBox "開かれているUserFormは " & n & " 個です!"
End Sub

・このイベントで UserForm のプロパティや入力値や処理結果を取得することはできません。
 メモリから解放された後に発生するイベントだから当然ですよね(^^ゞ

・以上で大体わかっていただけたと思うので終了します。

スポンサーリンク

まとめ(おわりに)

・いかがでしたでしょうか?
記事内で使用したコードのサンプルファイルを登録していますのでご利用ください!
今までの記事のサンプルも登録していますのでよろしければお使いください(^^)

まとめと感想など

UserForm の表示と終了について、かなり理解が深まりました(^^♪ どの場所やタイミングで何を実行するのか、ちゃんと考えないといけないこともわかりました。

くるみこ
くるみこ

UserForm の表示/終了だけでも結構奥が深いですよね。表示の部分の関してはもう少し知っておいた方が良いことがあります。次回は表示位置について勉強しましょう(^^)/

【今回わかったことは】
・UserForm を表示する方法と閉じる方法がわかりました
・終了時に発生するイベントについてもわかりました

★★★ ランキング参加中! クリックしてね(^^)/ ★★★

今後の記事について

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考えてVBAを使う」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m

【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思います・・・・・
・今後の記事にもご期待ください(^^)/

記事のサンプルファイルをダウンロードできます

今回の記事のサンプルをダウンロードできるようにしています!
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください