ユーザーフォームの表示/非表示を自動で行う

Excel VBA ファイル検索

エクセルで複数のファイルを開いて入力作業をするとき、ユーザーフォームが表示されているとエクセルシートがユーザーフォームで隠れてしまい作業がやりにくいことがあります。

ユーザーフォームの閉じるボタンを押せば済むのですが毎回行うのは煩わしいので、ファイルを検索するときはユーザーフォームが自動で開いて、検索したファイルを操作するときはユーザーフォームが自動で閉じるようにしてみたいと思います。

今回は、下のようなフォルダ構成で「ファイル検索.xlsm」のマクロ実行ファイルから「フォルダ」の中にある「企画書A.xlsx」「企画書B.xlsx」「企画書C.xlsx」エクセルファイルを開いて作業することを想定してマクロを組んでいきます。

以前のブログ「ユーザーフォームでファイルの検索をする」で「ファイル検索.xlsm」のマクロ有効ブックの作成を行いました、今回はこれを参考にしてマクロを組みたいので↓次のリンク↓をクリックして内容を確認してから次に進むことをお勧めします。

ユーザーフォームの「検索開始」のボタンのコード変更

先ずは、マクロ実行するブック (ファイル検索.xlsm) を開いて「開発」タブ →「Visual Basic」でVBE (Visual Basic Editor) の画面を表示します。

VBAProjectの「UserForm1」を選択し「コードの表示」ボタンを押してコードウインドウを表示し、次のコードをコピーして書き換えます。

コードの変更は「UserForm1.Show vbModeless」と「UserForm1.Hide」の2箇所になります。

Private Sub CommandButton1_Click()

Dim name As String
name = UserForm1.TextBox1.Text

Dim ブック As Workbook
Dim Flag As Boolean

For Each ブック In Workbooks '検索したファイルが開いているか調べます。

If ブック.name = name & ".xlsx" Then Flag = True

Next ブック

If Flag = True Then '検索したファイルが開いていた場合の処理。

MsgBox "「" & name & "」" & "のファイルは既に開いているので最前面に表示します。"

Workbooks(name & ".xlsx").Activate '開いていたファイルを最前面に表示します。

UserForm1.Hide '入力したデータを残したまま一時的にユーザーフォーム非表示にします。
'Unload UserForm1 'ユーザーフォームを閉じます。

Exit Sub

Else '検索したファイルが開いていない場合はファイルを開きます。

If Dir(ThisWorkbook.Path & "\フォルダ\" & name & ".xlsx") <> "" Then 'ファイルがフォルダ内にあるか調べます。

Workbooks.Open Filename:=ThisWorkbook.Path & "\フォルダ\" & name & ".xlsx" 'ファイルを開きます。

UserForm1.Hide '入力したデータを残したまま一時的にユーザーフォーム非表示にします。
'Unload UserForm1 'ユーザーフォームを閉じます。

Else 'ファイルがフォルダ内に無いときはメッセージを表示します。

UserForm1.Hide '入力したデータを残したまま一時的にユーザーフォーム非表示にします。
'Unload UserForm1 'ユーザーフォームを閉じます。

MsgBox "ファイルはフォルダ内にありません。"

UserForm1.Show vbModeless 'ユーザーフォームをモードレスで表示します。

End If

End If

End Sub

ThisWorkbookにコードを書き込む

次に、ファイルを検索するときはユーザーフォームが自動で開いて、検索したファイルを操作するときはユーザーフォームが自動で閉じる設定をします。

VBAProjectの「ThisWorkbook」をダブルクリックしてコードウィンドウを開き、次のコードをコピーして貼り付けます。

Private Sub Workbook_Activate()   'ワークブックがアクティブになったときの処理

UserForm1.Show vbModeless 'ユーザーフォームをモードレスで表示します。

End Sub

Private Sub Workbook_Deactivate() 'ワークブックが非アクティブになったときの処理

UserForm1.Hide '入力したデータを残したまま一時的にユーザーフォーム非表示にします。
'Unload UserForm1 'ユーザーフォームを閉じます。

End Sub
!ポイント

複数のファイルを開いて作業をするときは、ユーザーフォームをモードレス「vbModeless」で表示すると、ユーザーフォームの表示/非表示の切り替えが上手くいくようです。

テキストボックスの値について

「UserForm1.Hide」にするとユーザーフォームのテキストボックスに入力した値を残したまま、次回もユーザーフォームが表示されます。「Unload UserForm1」にするとテキストボックスに入力した値が消去されて、次回は表示されないようになります。

シートモジュールにコードを書き込む

最後にVBAProjectの「Sheet1」をダブルクリックしてコードウインドウを表示し、次のコードをコピーして書き換えます。これはセルをクリックした時にユーザーフォームを表示するための設定です。

こちらのブログ記事でユーザーフォームを表示するための設定方法を詳しく解説しているので参考にしてみてください。↓

セルをクリックしてユーザーフォームを表示する3つの方法

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

UserForm1.Show vbModeless

End Sub

これで下のように複数のファイル「ファイル検索.xlsm」「企画書A.xlsx」「企画書B.xlsx」「企画書C.xlsx」を開いて作業するとき、「ファイル検索.xlsm」を開いたときはユーザーフォームが表示され「企画書A.xlsx」「企画書B.xlsx」「企画書C.xlsx」を開いたときはユーザーフォームが閉じようになりました。