エクセルVBAで指定したWorkbookがあるか調べる2つの方法
エクセルVBAで、指定した名前のWorkbookが存在しているかどうかを確認する方法を紹介します。
この記事の目次
For Eachを使う
1つめの方法は、For Eachを使う方法です。
ソースコード
Function getWorkbookByName(targetWorkbookName) As Workbook
Dim TempWorkbook As Workbook
For Each TempWorkbook In Workbooks
If TempWorkbook.Name = targetWorkbookName Then
Set getWorkbookByName = TempWorkbook
Exit Function
End If
Next
Set getWorkbookByName = Nothing
End Function
概要
このFunctionは、次のような動作をします。
- 指定したWorkbookが存在する場合 → そのWorkbookオブジェクトが得られる
- 指定したWorkbookが存在しない場合 → Nothingが得られる
使用例
次のソースの17行目のように「Is Nothing」を使ってチェックをすることで、指定したワークブック(Book1)があるかないかが確認できます。
Sub main()
Dim targetWorkbook As Workbook
Set targetWorkbook = getWorkbookByName("test.xlsx")
If targetWorkbook Is Nothing Then
Debug.Print "test.xlsxは存在しません"
Else
Debug.Print targetWorkbook.Name & "が見つかりました"
End If
End Sub
解説
かんたんに解説をしていきます。
For Eachループ
Dim TempWorkbook As Workbook
For Each TempWorkbook In Workbooks
If TempWorkbook.Name = targetWorkbookName Then
Set getWorkbookByName = TempWorkbook
Exit Function
End If
Next
For Eachループで、全Workbookを1つずつTempWorkbookに入れていきます。
名前が一致しているか確認
If TempWorkbook.Name = targetWorkbookName Then
Set getWorkbookByName = TempWorkbook
Exit Function
End If
- 4行目
-
If TempWorkbook.Name = targetWorkbookName Then
For Eachループで取り出しているTempWorkbookが指定した名前(TargetWorkbookName)と一致しているかを調べます。
- 5行目~6行目
-
Set getWorkbookByName = TempWorkbook Exit Function
もし、一致していれば、そのWorkbookを返り値に設定して、Functionを終了します。
名前が一致しなかったとき
Set getWorkbookByName = Nothing
もし、For Eachループで名前が一致するものがなかったときには、返り値に「Nothing」が代入されます。
On Errorを使う
2つめの方法は、On Errorを使う方法です。
こちらの関数でも、1つめの方法とまったく同じ結果を返します。
ソースコード
Function getWorkbookByName(targetWorkbookName) As Workbook
On Error Resume Next
Set getWorkbookByName = Workbooks(targetWorkbookName)
On Error Goto 0
End Function
解説
かんたんに解説をしていきます。
3行目
実質的なロジックは次の1行だけです。
Set getWorkbookByName = Workbooks(targetWorkbookName)
- 指定された「targetWorkbookName」が存在している場合
-
返り値(getWorkbookByName)には、通常通り、指定したWorkbookオブジェクトが格納されます。
- 指定された「targetWorkbookName」が存在していない場合
-
通常ならばエラーになります。
ところが、1行前に「On Error Resume Next」という文があるため、エラーになった場合には、この文は実行されなかったことにされて、次に進みます。
結果、返り値(getWorkbookByName)は、何も指定されず「Nothing」になります。
On Error Resume Nextを使う時の注意点
「On Error Resume Next」を使うと、先ほど書いた通りエラーを無視することができます。
うまく使えば便利なのですが、本来検出すべきエラーが検出できなくなるという重大なデメリットがあります。
そのため、使う場合には使用範囲を最小限に止める必要があります。
エラーを無視すべき範囲を過ぎたら、必ず「On Error Goto 0」を使うようにしましょう。
この命令文で「On Error Resume Next」の効果をなくすことができます。
まとめ
1つめのコードのほうは、通常のFor Eachループなので理解はしやすいですが、
- コード自体が若干長い
- For Eachループを回す分、実行に時間がかかる
という欠点があります。
一方、2つめのコードは、実行時間もかからず「On Error」の挙動がわかれば、ロジック自体も短くて済みます。
どちらか気に入ったほうを使ってみてください。