部品_ファイルを開く
OpenFile_ByPath
https://feelcodelab.com/vba_parts/openfile_bypath/
・指定したパスの Excel ファイルを開く(開いたあと、ActiveWorkbook が、そのファイルに切り替わる) ・すでに同じファイルが開いている場合は、開き直さず、そのブックをアクティブにする ・開けた場合(すでに開いていた場合を含む)は True、開けなかった場合は False を返す ★ この部品は Sub(プロシージャ)ではなく「Function(関数)」で、成功/失敗を Boolean で返す
土台
処理
ファイル
★【最重要】この部品は Function(関数)であり、戻り値(Boolean)を返す
→ 開けた場合は True、開けなかった場合は False(この場合は、エラーでは止まらない)
→ 呼び出し側は、必ず戻り値を確認してから後続処理を行い、メッセージも呼び出し側で表示する
★【最重要】ファイルを開いた直後に、ActiveWorkbook を変数へ控える
→ ファイルを開くと、ActiveWorkbook が、開いたファイルに切り替わる。
開いたブックは、戻り値ではなく、呼び出し側が ActiveWorkbook から取得する
(Set wbSrc = ActiveWorkbook)。以降の部品には、その変数を渡す
・ファイルのパスは、フルパス(ドライブ名またはネットワークパスから始まるパス)で指定する
・すでに同じファイルが開いている場合は、開き直さず、そのブックをアクティブにして True を返す
→ 同じファイルかどうかは、フルパス(大文字・小文字は区別しない)で判定する
→ 同じ名前で、別のフォルダのファイルが、すでに開いている場合は、開かずに False を返す
(Excel は同名のブックを同時に開けず、Workbooks.Open がエラーにならないまま、別のブックが
アクティブのまま残ることがある。取り違えを防ぐため)
→ OneDrive / SharePoint のブックは、FullName が https:// の形になるため、同じ形のパスで指定する
(ローカルのパスで指定すると、同じファイルでも、別の場所のファイルと見なして False を返す)
https:// FullName, so specify the path in the same form.
・存在しない・フォルダ・壊れているなどで開けない場合も False を返す(原因は、イミディエイトウィンドウに出る)
→ 存在しないことを、メッセージで区別したいときは、呼び出し側で部品_ファイル存在チェックを先に呼ぶ
・読み取り専用・パスワード付きなどのファイルは、対象外(開けなければ False を返す)
・設定の誤りは、False ではなく、原因を示すエラーで止まる(Err.Raise)
- パスが空文字(vbObjectError + 1012)
- パスにワイルドカード(* または ?)が含まれている(vbObjectError + 1013)
・Offset / Find / Resize / With は禁止・特になし(他の部品を参照しない) ・組み合わせ:f_OpenFile_ByPath → f_GetLastRow / f_SetRange_Fixed / f_AssignCell など (開いた直後に ActiveWorkbook を変数へ控えて、その変数を、ブックの引数として渡す)
・特になし(ファイルを開くだけで、特定のシートを前提としない)
vFilePath : 開きたいファイルのフルパス(String)
Boolean : 開けた場合(すでに開いていた場合を含む)は True、開けなかった場合は False
Boolean
Function 部品_ファイルを開く( _
ByVal vFilePath As String) As Boolean
部品_ファイルを開く = f_OpenFile_ByPath(vFilePath)
End Function
Function f_OpenFile_ByPath( _
ByVal vFilePath As String) As Boolean
Dim wb As Workbook
Dim pos As Long
Dim fileName As String
f_OpenFile_ByPath = False
If Len(Trim$(vFilePath)) = 0 Then
Err.Raise vbObjectError + 1012, "f_OpenFile_ByPath", _
"ファイルのパス(vFilePath)が空文字です。"
End If
If InStr(vFilePath, "*") > 0 Or InStr(vFilePath, "?") > 0 Then
Err.Raise vbObjectError + 1013, "f_OpenFile_ByPath", _
"ファイルのパスに、ワイルドカード(* または ?)は使えません(" & vFilePath & ")。"
End If
On Error GoTo ErrHandler
pos = InStrRev(vFilePath, "\")
If InStrRev(vFilePath, "/") > pos Then pos = InStrRev(vFilePath, "/")
fileName = Mid$(vFilePath, pos + 1)
For Each wb In Workbooks
If StrComp(wb.FullName, vFilePath, vbTextCompare) = 0 Then
wb.Activate
f_OpenFile_ByPath = True
Exit Function
End If
If StrComp(wb.Name, fileName, vbTextCompare) = 0 Then
Debug.Print "f_OpenFile_ByPath: 同名のブックが別の場所で開いています(" & wb.FullName & ")"
Exit Function
End If
Next wb
Workbooks.Open vFilePath
f_OpenFile_ByPath = True
Exit Function
ErrHandler:
Debug.Print "f_OpenFile_ByPath: " & Err.Number & " " & Err.Description
f_OpenFile_ByPath = False
End Function<例1:ファイルを開いて、最終行を取得する>
Dim wbSrc As Workbook
Dim lastRow As Long
If 部品_ファイルを開く("E:\TEST\売上.xlsx") = False Then
MsgBox "売上.xlsx を開けませんでした"
Exit Sub
End If
Set wbSrc = ActiveWorkbook '開いた直後に控える
lastRow = 部品_最終行取得(wbSrc, "売上", 2)
<例2:開いたファイルへ、マクロのファイルから代入する>
Dim wbDst As Workbook
If 部品_ファイルを開く("E:\TEST\テンプレート.xlsx") = False Then
MsgBox "テンプレートを開けませんでした"
Exit Sub
End If
Set wbDst = ActiveWorkbook
If 部品_代入_セル(ThisWorkbook, "入力", 6, 2, wbDst, "帳票", 3, 1) = False Then
MsgBox "代入に失敗しました"
End If
<例3:存在しないことを、メッセージで区別する>
If 部品_ファイル存在チェック("E:\TEST\売上.xlsx") = False Then
MsgBox "売上.xlsx が存在しません"
Exit Sub
End If
If 部品_ファイルを開く("E:\TEST\売上.xlsx") = False Then
MsgBox "売上.xlsx を開けませんでした"
Exit Sub
End If
※ パスが空文字・ワイルドカード入りの場合は、False ではなく、原因を示すエラーで止まる
(起点の On Error で受けて、Err.Description を表示する) 1.0
2026-10-29