日本語名

部品_ファイルを開く

英語名

OpenFile_ByPath

URL

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 を表示する)

BASファイル(ダウンロード)

OpenFile_ByPath.bas

バージョン

1.0

更新日

2026-10-29