【VBA】処理したいブックを選ぶ方法
配布用のマクロを作っていると、マクロブックとは別のExcelブックを処理したいケースが出てきます。
処理したいExcelブックを選択させる必要があるのですが、ユーザーが選択するので意外なエラーが起きたりします。
経験ある方も多いのではないでしょうか?
そんな問題を解決するため、私が使っている対象ブックを選択させる自作関数を紹介したいと思います。
自作するのが面倒な人、自作しているが参考にしてみたい人、読んでみてください。
処理対象ブックを選ぶ自作関数
Function SelectBook() As Workbook
'処理したいブックを選択させる⇒返す
'ブックの選択なし⇒End
Dim book_i As Integer
For book_i = Workbooks.Count To 1 Step -1
Workbooks(book_i).Activate
If MsgBox(Workbooks(book_i).Name & "を処理しますか?", vbYesNo) = vbYes Then Exit For
'選択されなかった場合はEnd
If book_i = 1 Then MsgBox ("選択されなかったため終了します"): End
Next
Set SelectBook = ActiveWorkbook
End Function
この自作関数のポイントは大きく3つあります。
- 最後に開いたブックから表示
- 選択されなかった場合はEnd(マクロ終了)
- 選択されたブックをWorkbookオブジェクトで返す
最後に開いたブックから表示
For book_i = Workbooks.Count To 1 Step -1
このFor文は1から順番にではなく、大きい方から減らすようにしています。
大抵マクロブックを開いた後に、処理したいブックを開くので一番最後に開いたブックから確認していくように工夫しています。(小さな時短です)
選択されなかった場合はEnd(マクロ終了)
If book_i = 1 Then MsgBox ("選択されなかったため終了します"): End
選択された場合はExit Forでループを抜けるため、book_i=1となったら終了させます。
Endステートメントを使い、マクロ自体を終了させています。
選択されたブックをWorkbookオブジェクトで返す
Set SelectBook = ActiveWorkbook
選択されたブックをWorkbookオブジェクトで返しています。
そのため、自作関数を呼び出すプロシージャは次のように書きます。
Sub Sample()
Dim dataBook As Workbook
Set dataBook = SelectBook
End Sub
これで自作関数が呼び出され、変数(dataBook)にWorkbookオブジェクトが代入されます。