Django Girls and Boys 備忘録

Python、Selenium、Django、java、iPhoneアプリ、Excelマクロなどで気付いたこと、覚えておきたいことなどを載せていきます。

【VBA】Excelブックが「開いているかどうか」を判定する方法

~初心者が必ず混乱するポイントを完全整理~

Excel VBAで自動化をしていると、必ずぶつかる疑問があります。

「このブック、もう開いてる?」

「同じファイルを二重に開いてしまわないか不安…」

実務でもトラブルになりやすいテーマなので、
正しい判定方法とNG例をまとめて解説します。


結論:判定方法は「1つだけ」覚えればOK

Excel VBAで
ブックが開いているかどうかを判定する王道はこれです👇

Workbooks コレクションに存在するかどうかを調べる


なぜ判定が必要なのか?

開いているかを判定せずに処理すると…

  • 同じブックを二重に Open

  • 「既に開いています」エラー

  • 意図しないブックを操作

  • 保存されない/上書き事故

👉 実務では必須の防御処理です。


❌ よくある間違い(初心者がやりがち)

❌ If Workbooks("Sample.xlsx") <> Nothing Then

 
If Workbooks("Sample.xlsx") Is Nothing Then

 

👉 これはエラーになります

理由:
Workbooks("名前")
存在しない時点でエラーを出す仕様だからです。


✅ 正しい判定方法①(最も一般的)

エラーを利用して判定する方法

 
Function IsWorkbookOpen(bookName As String) As Boolean

    Dim wb As Workbook

    On Error Resume Next
    Set wb = Workbooks(bookName)
    On Error GoTo 0
    IsWorkbookOpen = Not wb Is Nothing

End Function

 

使い方

 
If IsWorkbookOpen("Sample.xlsx") Then
    MsgBox "すでに開いています"
Else
    MsgBox "まだ開いていません"
End If

 

👉 実務で最も使われる定番パターンです。


✅ 正しい判定方法②(For Each で調べる)

 
Function IsWorkbookOpen(bookName As String) As Boolean

    Dim wb As Workbook

    For Each wb In Workbooks
        If wb.Name = bookName Then
            IsWorkbookOpen = True
            Exit Function
        End If
    Next wb
    IsWorkbookOpen = False

End Function

 

特徴

  • エラー処理が不要

  • 処理が直感的

  • 初心者にも理解しやすい

👉 教育用・ブログ向きな書き方です。


フルパスでは判定できない点に注意

 
Workbooks("C:\Test\Sample.xlsx")  ' ❌ 使えない

 

Workbooks で指定できるのは👇

ファイル名のみ(Sample.xlsx)


同名ブックがある場合の注意点(超重要)

もし、

  • 別フォルダに

  • 同じ名前の Excel ファイル

が存在すると👇

 
どちらが開いているか判別できない

実務での対策

  • 同名ファイルを扱わない設計にする

  • もしくは「開く前に必ず閉じる」


開いていれば使い、開いていなければ開く例

 
Dim wb As Workbook
Dim path As String
path = "C:\Test\Sample.xlsx"

If IsWorkbookOpen("Sample.xlsx") Then
    Set wb = Workbooks("Sample.xlsx")
Else
    Set wb = Workbooks.Open(path)
End If

 

👉 実務でめちゃくちゃ使うパターンです。


「開いていないブック」を直接指定することはできない

ここ、超重要です。

 
Set wb = Workbooks("Sample.xlsx")

 

これは👇

  • ❌ 開いていない → エラー

  • ✅ 開いている → 取得できる

👉 Open 済み専用です。


よくある質問

Q. シートが表示されていなくても開いている?

👉 はい、開いています

ScreenUpdating = False で非表示でも
**Workbooks に存在すれば「開いている」**扱いです。


まとめ(ここだけ覚えればOK)

✅ 開いているかの判定は Workbooks にあるかどうか
✅ フルパスではなく ファイル名で判定
✅ 同名ファイルは事故の元
✅ 実務では「判定 → 開く or 使う」が基本構成