Excel VBA 開いているすべてのユーザーフォームを閉じる方法

ユーザーフォーム作成/操作

VBAで開いているすべてのユーザーフォームを閉じる方法についてご説明します。

複数のフォームを開いて処理を行っていた場合に、処理が完了した際にまとめてフォームを閉じたい場合に使用すると便利です。

また、条件に一致したフォーム以外を全て閉じるといった処理方法についても記載したいと思います。

ユーザーフォームを閉じる方法の詳細については「ユーザーフォームを閉じる方法」をご覧下さい。

1.ユーザーフォームを閉じる方法

開いているすべてのユーザーフォームを閉じる方法の前に、ユーザーフォームを閉じる方法について簡単に説明します。

閉じる方法自体はとても簡単です。

VBAで開いているユーザーフォームを閉じるには「Unload」ステートメントを使用します。

次のように記述します。

Unload object

object」には閉じたいユーザーフォームを指定します。

もし「UserForm1」というユーザーフォームが開いている場合に、このフォームを閉じる場合は次のように記述します。

Unload UserForm1

注意点として「vbModeless」で開いている場合は、閉じる処理が記述されたプロシージャをどこから実行しても閉じる事が可能ですが、「vbModal」で開いている場合はユーザーフォーム上に埋め込まれたコントロールなどのイベントでしか閉じる事が出来ません。

2.開いているすべてのユーザーフォームを閉じる方法

次は開いているすべてのユーザーフォームを閉じる方法です。

すべて閉じる場合は1つ1つフォームを指定する必要はなく、「For Each In Next」のループを使用する事で閉じる事が出来ます。

ループの詳細については「ループの使い方「For~Next」「For Each In Next」「Do~Loop」」をご覧ください。

次のようにUserForm1~6のユーザーフォームを開いた状態を用意しました。

UserForm1だけコマンドボタンを設置して、ボタンを押すと全てのユーザーフォームが閉じるようにします。

サンプルコード

開いているユーザーフォームをすべて閉じるコードも実はとても簡単です。

下記コードを標準モジュールに記述して、UserForm1のコマンドボタンのクリックイベントで呼び出しているだけです。

※すべて閉じるため実行結果の図はありません。

標準モジュールのコード
Sub FormClose1()

Dim MyForm As Object

For Each MyForm In UserForms

    Unload MyForm

Next

End Sub
コマンドボタンのイベントのコード
Private Sub CommandButton1_Click()

Call FormClose1

End Sub
コードの説明

実は処理自体はたった6行です。

標準モジュールに書かれている「Sub FormClose1()」は

「For Each MyForm In UserForms」でユーザーフォームをすべてループして、MyFormという変数に1つずつ格納しています。

「Unload MyForm」で格納したユーザーフォームを閉じます。

処理は以上となります。

そして、コマンドボタンのイベントの「Private Sub CommandButton1_Click()」はボタンが押された際に「Call FormClose1」で処理のプロシージャを呼び出しているだけです。

3.条件を指定してユーザーフォームを閉じる

すべてのユーザーフォームを閉じてしまう事はあまりないと思いますので、条件を指定して条件に一致するユーザーフォームだけを閉じるコードも紹介したいと思います。

先ほどと同じくUserForm1~6を開いた状態で、コマンドボタンの設置しているUserForm1のみを残して他のフォームをすべて閉じます。

サンプルコード

標準モジュールのコード
Sub FormClose2()

Dim MyForm As Object

For Each MyForm In UserForms

    If MyForm.Name <> "UserForm1" Then

        Unload MyForm
    
    End If
    
Next

End Sub
コマンドボタンのイベントのコード
Private Sub CommandButton1_Click()

Call FormClose2

End Sub
コードの説明

標準モジュールに書かれている「Sub FormClose2()」は

先ほどの「Sub FormClose1()」のコードに次の分岐を追加しただけです。

Object,Nameで指定したObjectの名前を取得出来ますので、閉じたくないオブジェクト名を指定する事で、閉じる処理を回避できます。

「If MyForm.Name <> “UserForm1” Then」で格納したユーザーフォームの名前が”UserForm1″ではない場合のみ閉じるという条件にしています。

コマンドボタンのイベントの「Private Sub CommandButton1_Click()」はボタンが押された際に呼び出すプロシージャを「Call FormClose2」に変更しただけになります。

タイトルとURLをコピーしました