📖

【VBA】ファイルパスからワークブックオブジェクトを作る

2023/07/02に公開

【VBA】フォルダ内のキーワードを含むエクセルファイルリストを返す
【VBA】複数のエクセルファイルを選択してファイルパスを返すコード
これらのコードではファイルパスのリストを返します。
これを実際に使うには受け取ったファイルパスをワークブックオブジェクトにしてなんやかんやする必要があります。

またとりあえず「あのフォルダのあのエクセルをなんやかんやしてみたい」という時にはファイルパスからワークブックオブジェクトを作る必要があります。

コードは以下のように書きます。

ちなみにファイルパスはエクスプローラー(よくあるWindowsのファイル選択画面)でファイルを選択するとき、Shiftを押しながら右クリックすると「パスのコピー」が選択できます。

Function OpenWorkBook(FilePath As String) As Workbook

    Dim wb As Workbook
    Set wb = Workbooks.Open(FilePath)
    Set OpenWorkBook = wb
    
End Function

コードを部品に分けることは大事ですが、さすがにやりすぎ感はあります。
実際は以下のように使うことが多いかと思います。

Sub test()
    
    Dim filePath As String
    filePath = "C:\Users\robin\vba\テスト用エクセルファイル\1.xlsx"
    
    Dim wb As Workbook
    Set wb = Workbooks.Open(filePath)
    
    '選択したエクセルのA1セルの内容を表示
    MsgBox wb.Worksheets(1).Range("A1").Value
    
    '保存せずに閉じる
    wb.Close SaveChanges:=False
    
End Sub

このコードでは1.xlsxのA1セルの値を表示します。
MsgBoxのところをしたい処理に書き換えてください。
filePathの内容を都度書き換えるのも面倒なので、ファイル選択ダイアログから取得するとなると以下のようになります。

Sub test()
    
    Dim fileDialog As fileDialog
    Dim filePath As String
    
    ' FileDialogオブジェクトの初期化
    Set fileDialog = Application.fileDialog(msoFileDialogFilePicker)
    
    With fileDialog
    
        ' ダイアログのタイトル設定
        .Title = "Excelファイルを選択してください"
        
        ' Excelファイルのみを表示
        .Filters.Clear
        .Filters.Add "Excel Files", "*.xls; *.xlsx; *.xlsm; *.xlsb"
        
        ' ファイル選択ダイアログの表示
        If .Show = -1 Then
            filePath = .SelectedItems(1)
        End If
        
        If filePath = "" Then
            MsgBox "Excelファイルを選択してください"
        End If
        
    End With
    
    Set fileDialog = Nothing
    
    ' ここまでのコードでfilePathにファイルパスが格納された
    ' 以降でwbをワークブックオブジェクトとして処理を実行するコードを書く
    
    Dim wb As Workbook
    Set wb = Workbooks.Open(filePath)
    
    MsgBox wb.Worksheets(1).Range("A1").Value
    
    wb.Close SaveChanges:=False
    
End Sub

単にファイル選択ダイアログからファイルパスを持ってくる処理だけでも長い記述が必要なものです。
Dim wb As Workbookより前は完全コピペでいいと思います。それ以降を書き換えてみて動作を確認してみてください。

また、ファイル選択ダイアログから直でワークブックオブジェクトを返すように書く方法もありますが、個人的にはファイルパスを返す方が使い勝手が良くて好きです。

Discussion