VBA:同名ファイルを安全に開く・扱うコツ
音声
目次
ファイル名が重複するExcelを開くときの困りごとと解決
結論として、同名ファイルはファイル名だけで参照せず、必ずフルパスで判断して開くと混乱を避けられます。
よくある状況として、「Book1.xlsx」を複数開いてどれが最新かわからなくなることがあります。解決には、フルパスの確認とVBAでのフルネーム比較が有効です。
- 困りごとは、同名ファイルを開いたときに意図しないファイルを操作してしまうことです。
- 対策として、Workbooks.Openでフルパスを使い、すでに開いているかをFullNameで判定すると回避できます。
操作手順と短いVBAで安全に開く方法
- エクスプローラーで対象ファイルを右クリックし、「プロパティ」でフルパスを確認します。
- Excelから開くときは、「ファイル→開く」でフルパスを指定して開きます。
- 自動化する場合は、VBAでFullNameを参照して既存のブックと比較します。
フルパスを指定して開く例は次のとおりです。
Dim wb As Workbook
Set wb = Workbooks.Open("C:\Data\報告書.xlsx", ReadOnly:=True)
切り分け・確認観点とよくある失敗例
切り分けの観点は、ファイルのFullName、作成日時、最終更新日時の3点です。
よくある失敗例は、Workbooks("報告書.xlsx")だけで参照してしまい、エラーになったり別ファイルを操作してしまったりすることです。同名のブックが複数あると、名前だけでは一意に決まらないことが原因です。
避けたい例は次のとおりです。
' 避けたい例: 同名の別ファイルを拾う可能性あり
Set wb = Workbooks("報告書.xlsx")
判断のポイントとちょい自動化の応用例
判断のポイントは、フルパスが一致していれば同一ファイルと判断できることです。
ちょい自動化の応用例として、開く前にフォルダ内を走査して最終更新日時を比較し、最新の1件だけを開く方法があります。
Dim f As String, latest As String, t As Date
f = Dir("C:\Data\報告書*.xlsx")
Do While f <> ""
If FileDateTime("C:\Data\" & f) > t Then
t = FileDateTime("C:\Data\" & f)
latest = "C:\Data\" & f
End If
f = Dir()
Loop
Workbooks.Open latest
例え話として、同じ名前の名刺が何枚もある引き出しから1枚を選ぶときに、名前だけで選ぶと別の人の名刺を渡してしまうのに近いです。
注意(ここだけ)
上書きや削除を自動で行うコードは、バックアップを取り、テストフォルダで実行してから運用してください。
要約
- 同名ファイルはフルパスで識別すると安全です。
- 開く前にフルパスと最終更新日時を確認するとよいです。
- VBAではFullNameやFileDateTimeで判定すると誤操作を避けられます。
- よくあるミスはWorkbooks("名前")だけで参照してしまうことです。
- 自動処理はテストとバックアップを必ず行ってから運用するのがポイントです。