VBAでファイルが開かれているかを確認する方法|For Each・FullName・Is Nothingの使い方

VBAで特定のファイルを開こうとする前に、そのファイルがすでに開かれているかどうかを確認することは実務でよくある重要な処理です。開かれたままのファイルに上書き保存しようとするとエラーが発生したり、意図しない上書きになったりすることがあります。

この記事では、現在開いているすべてのブックを確認してファイルの開閉状態をチェックするマクロを解説します。

ファイルが開かれているかを確認するには?

開いているすべてのブックを For Each でループし、指定したパスと一致するものがあれば「開かれている」と判定します。

Sub CheckFileIsOpen()
    Dim fpath As String
    Dim wb As Workbook
    Dim isOpen As Boolean

    ' 確認したいファイルのフルパスを指定
    fpath = "C:¥Users¥User¥Documents¥test.xlsx"
    isOpen = False

    ' 現在開いているすべてのブックを順に確認
    For Each wb In Workbooks
        If wb.FullName = fpath Then
            isOpen = True
            Exit For
        End If
    Next

    ' 結果を表示
    If isOpen = True Then
        MsgBox "ファイルはすでに開かれています。"
    Else
        MsgBox "ファイルは開かれていません。"
    End If
End Sub

コードのポイントを理解するには?

For Each wb In Workbooks
現在Excelで開いているすべてのブックを1つずつ処理します。Workbooks コレクションには開いているすべてのブックが含まれます。

wb.FullName
ブックのフルパス(ドライブ名からファイル名まで含む完全なパス)を返します。fpath に指定したパスと照合します。

Exit For
一致するブックが見つかった時点でループを抜けます。不要なループを減らして処理を効率化します。

実務での活用方法とは?

このチェック処理を応用すると、次のような実用的なマクロが作れます。

' 開いていない場合だけ開く処理
If isOpen = False Then
    Workbooks.Open fpath
Else
    MsgBox "すでに開いています。そちらのファイルで作業してください。"
End If

また、ファイルパスを直接コードに書くのではなく、ファイル選択ダイアログを使うとより使いやすくなります。

' ファイル選択ダイアログでパスを取得する
fpath = Application.GetOpenFilename("Excelファイル,*.xlsx")
If fpath = "False" Then Exit Sub  ' キャンセル時は終了

まとめ

  • For Each wb In Workbooks で開いているすべてのブックを確認できる
  • wb.FullName でブックのフルパスを取得して照合する
  • 一致したら Exit For でループを抜けて処理を効率化する
  • 「開いていない場合だけ開く」処理と組み合わせるとエラー防止に役立つ
  • ファイルパスはダイアログで選択する方法にすると汎用性が上がる

よくある質問

ファイル名だけで確認することはできますか?(フルパスがわからない場合)

できます。wb.FullName の代わりに wb.Name を使うとファイル名だけで比較できます。ただし同名ファイルが別フォルダにある場合は誤検知の可能性があるため、フルパスでの照合の方が確実です。

他のユーザーが開いているファイルも検出できますか?

この方法では自分のExcelで開いているブックのみが対象です。ネットワーク上の共有ファイルを他のユーザーが開いているかどうかは、この方法では検出できません。

ファイルが存在しない場合と開かれていない場合を区別できますか?

できます。Dir(fpath) でファイルの存在確認を先に行い、存在しない場合は「ファイルが見つかりません」、存在するが開かれていない場合は「開かれていません」と別々にメッセージを出す処理を追加できます。

複数のファイルをまとめて確認することはできますか?

できます。チェックしたいファイルパスを配列に入れて、外側にもう一つループを追加することで複数ファイルをまとめて確認できます。

開いているファイルをそのまま変数に取得することはできますか?

できます。isOpen = True の条件が成立した時点で Set targetWb = wb と書いておけば、発見したブックをそのまま変数に代入して処理を続けられます。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール