【VBA】ブックが開いているか判定|StrComp で FullNameを調べる
作成日:2022-12-02
更新日:2025-10-04

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

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.FullName
と fullPath
を比較する
If StrComp(wb.FullName, fullPath, vbTextCompare) = 0 Then
IsWorkbookOpened = True
Exit Function
End If
StrComp(wb.FullName, fullPath, vbTextCompare)
- 引数①
wb.FullName
→ そのWorkbookのフルパス(例:C:\Users\me\Desktop\Book1.xlsx
) - 引数②
fullPath
→ 引数で渡された調べたいファイルのパス - 引数③
vbTextCompare
→ 大文字・小文字を区別せずに比較する(Case-insensitive 比較)
- 引数①
この時点で「Excelで開いているブックのフルパスと、探したいフルパスが一致するか」を判定してる。
= 0
の意味StrComp
は結果を数値で返す:0
→ 文字列が等しい-1
→ 第1引数 < 第2引数1
→ 第1引数 > 第2引数
= 0
なので、「完全一致したら」という条件になる。
IsWorkbookOpened = True
- 一致したら、関数の戻り値
IsWorkbookOpened
を True にセット。 - つまり「指定のブックはすでに開いている」と判定する。
- 一致したら、関数の戻り値
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
テキストの追記モードで開いてエラーが出るかどうかで確認
※追記モードとは
既存ファイルの末尾にデータを追記するための開き方
開いているファイルには追記できないようにするためエラーが出る
追記モード方式が非推奨な理由
- 判定が曖昧
- ReadOnlyで開かれてる場合や共有モードだと、誤判定もある
- 環境依存・副作用のリスク
- 他アプリでのロックまで検出してしまう
- Excel以外が掴んでるケースも「開いてる」と見なされる
- しかも「一瞬開いて閉じる」から、余計な影響を与えることもある
- 他アプリでのロックまで検出してしまう
- VBA的には推奨されていない
- Microsoft Docs でも「Excelで開いているか」を調べたいときは Workbooks コレクションを使っている
Referenced Insights & Citations
- Walkenbach, J. (2013). Excel 2013 Power Programming with VBA. Wiley.
- Microsoft Docs: Workbooks Object
- Microsoft Docs: File I/O statements
Use the Workbooks method
with
with
FullName
comparison.
開いていたら閉じる場合
2022-12-02
編集後記:
この記事の内容がベストではないかもしれません。