エクセル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」の挙動がわかれば、ロジック自体も短くて済みます。

どちらか気に入ったほうを使ってみてください。

エクセル基礎講座 「無料」動画マニュアル

「経理事務のためのエクセル基礎講座(初級編)」(動画マニュアル 総収録時間162分)を無料プレゼント中です!

このマニュアルで解説していることを一通り学べば、経理事務を行う上で最低限必要となる知識が得られます。

ご登録者の方には、合わせて、公認会計士が実体験を通して身に付けたエクセルを使う技をメールにてお伝えしていきます!

無料動画講座 登録フォーム

※ご登録頂いたメールアドレスに、エクセルを使いこなすための情報を配信するメールセミナー「エクセル倍速講座」も合わせて配信させていただきます。