銀河鉄道

【VBA】ブックが開いているか判定|StrComp で FullNameを調べる

サムネイル
[VBA]開いているかwith FullName

推奨方法|開いている全ファイルの名前を確認する

FullNameで調べる

Public Function IsWorkbookOpened(ByVal fullPath As String) As Boolean
    Dim wb As Workbook
    For Each wb In Workbooks
        If StrComp(wb.FullName, fullPath, vbTextCompare) = 0 Then
            IsWorkbookOpened = True
            Exit Function
        End If
    Next wb
    IsWorkbookOpened = False
End Function

ファイル名のみ(wb.Name)の比較は不安定

パスが違う同名ファイルを誤検知するリスクあり

StrCompで、wb.FullNamefullPath を比較する

If StrComp(wb.FullName, fullPath, vbTextCompare) = 0 Then
    IsWorkbookOpened = True
    Exit Function
End If
  1. StrComp(wb.FullName, fullPath, vbTextCompare)
    • 引数① wb.FullName → そのWorkbookのフルパス(例: C:\Users\me\Desktop\Book1.xlsx
    • 引数② fullPath → 引数で渡された調べたいファイルのパス
    • 引数③ vbTextCompare → 大文字・小文字を区別せずに比較する(Case-insensitive 比較)

この時点で「Excelで開いているブックのフルパスと、探したいフルパスが一致するか」を判定してる。


  1. = 0 の意味
    • StrComp は結果を数値で返す:
      • 0 → 文字列が等しい-1 → 第1引数 < 第2引数1 → 第1引数 > 第2引数
    = 0 なので、「完全一致したら」という条件になる。

  1. IsWorkbookOpened = True
    • 一致したら、関数の戻り値 IsWorkbookOpenedTrue にセット。
    • つまり「指定のブックはすでに開いている」と判定する。

  1. Exit Function
    • もう答えが出たから、無駄にループを回さず即終了。
    • 処理効率を上げるための書き方。

参考|追記モードFor Appendで調べる

Public Function IsBookOpened(ByVal fullPath As String) As Boolean
    IsBookOpened = False
    
    On Error Resume Next
    Open fullPath For Append As #1
    Close #1
    
    If Err.Number > 0 Then IsBookOpened = True
End Function

テキストの追記モードで開いてエラーが出るかどうかで確認

※追記モードとは
既存ファイルの末尾にデータを追記するための開き方
開いているファイルには追記できないようにするためエラーが出る

追記モード方式が非推奨な理由

  1. 判定が曖昧
    • ReadOnlyで開かれてる場合や共有モードだと、誤判定もある
  2. 環境依存・副作用のリスク
    • 他アプリでのロックまで検出してしまう
      • Excel以外が掴んでるケースも「開いてる」と見なされる
    • しかも「一瞬開いて閉じる」から、余計な影響を与えることもある
  3. VBA的には推奨されていない
    • Microsoft Docs でも「Excelで開いているか」を調べたいときは Workbooks コレクションを使っている

Referenced Insights & Citations

Use the Workbooks method
with FullName comparison.

開いていたら閉じる場合

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。

記事一覧