【VBA】開いているブックを選択させる方法(サンプルコード付き)
マクロでデータ処理をしていると、データブックとマクロブックを分けたいケースがよく出てきます。
例えば、毎回システムからデータブックをダウンロードして処理していると、データブックにマクロを残すことはできません。
そうなるとマクロブックは固定しておいて、データブックを選択してマクロを実行させたくなります。
今回はこのデータブックの選択をマクロから行う便利なプロシージャを紹介します。
データ処理をよく行う方は参考にしてみてください。
開いているブックを選択させる動作イメージ
先にプログラムを実行した時のイメージを紹介します。
このプログラムを実行すると、開いているブックの1つがアクティブとなりメッセージが表示されます。
ここで「はい」を押すと処理したいブックが確定する、という仕組みです。
「いいえ」を押すと開いている違うブックに対して同じようにメッセージを表示されます。
開いているブックを選択させるプログラム
Sub Sample()
Dim wb As Workbook
Set wb = SelectOpenWorkBook("に対してマクロを実行しますか?", True)
End Sub
Function SelectOpenWorkBook(strRearMsg As String, Optional blExceptThisWorkBook As Boolean = True) As Workbook
'''開いているワークブックを順番に表示し、選択されたブックを返す
'''選択なし:Nothingを返す
'''strRearMsg:ブックを確認する際のメッセージ
'''blExceptThisWorkBook:Trueの場合はThisWorkBookを候補にしない
Dim oneWb As Workbook
For Each oneWb In Workbooks
''blExceptThisWorkBookがTrueでThisWorkbookの場合はスルー
If blExceptThisWorkBook And (oneWb.Name = ThisWorkbook.Name) Then GoTo Continue
''ワークブックを1つずつアクティブにし、目的のブックか確認
oneWb.Activate
If MsgBox(oneWb.Name & strRearMsg, vbYesNo) = vbYes Then
Set SelectOpenWorkBook = oneWb
Exit Function
End If
Continue:
Next
''選択されなかった場合
Set SelectOpenWorkBook = Nothing
MsgBox "ブックが選択されませんでした"
End Function
先頭に書いているSampleは実行用のプロシージャで、SelectOpenWorkBookがメインとなる関数です。
「はい」で選択されたブックのWorkbookオブジェクトが返り値となります。
また、次の2つの引数で少しカスタムできます。
strRearMsg
表示させるメッセージを変更できます。
Sampleでは「ブック名」+「に対してマクロを実行しますか?」のメッセージを表示させています。
ここを変更すると例えば、「ブック名」+「がデータブックですか?」といったように利用者が分かりやすいメッセージに変更することができます。
blExceptThisWorkBook
この方法では基本的にマクロブックは選択対象にならないと思います。
そのため、デフォルトではマクロブック(ThisWorkBook)を候補表示させないようにしています。
もし、マクロブックも候補にしたい場合はこの引数をFalseとしてください。