🚀

【VBA】複数のエクセルファイルを選択してファイルパスを返すコード

2023/06/25に公開

市町村から提出された同じ様式のエクセルファイルを集めてなんやかんや処理したいときに使うコードです。
リスト型でデータを受け取るのでそれに応じた処理をします。

Function SelectFiles() As Variant

    Dim fileDialog As fileDialog
    Dim filePath As Variant
    Dim count As Integer
    
    ' 動的配列の初期化
    ReDim filePath(1 To 1) As String
    
    ' FileDialogオブジェクトの初期化
    Set fileDialog = Application.fileDialog(msoFileDialogFilePicker)
    
    With fileDialog
        ' 複数選択を許可する
        .AllowMultiSelect = True
        
        ' ダイアログのタイトル設定
        .Title = "複数のExcelファイルを選択してください"
        
        ' Excelファイルのみを表示
        .Filters.Clear
        .Filters.Add "Excel Files", "*.xls; *.xlsx; *.xlsm; *.xlsb"
        
        ' ファイル選択ダイアログの表示
        If .Show = -1 Then
            ' 選択されたすべてのファイルパスを動的配列に格納
            For count = 1 To .SelectedItems.count
                ReDim Preserve filePath(1 To count) As String
                filePath(count) = .SelectedItems(count)
            Next count
        Else
            filePath(1) = ""
        End If
        
    End With
    
    Set fileDialog = Nothing
    
    ' ファイルパスの配列を返す
    SelectFiles = filePath

End Function

Redimは動的配列の宣言です。
Preserveは動的は配列の宣言時に古い要素をコピーして末尾に新しい要素を追加します。
filePathにファイル名が1個ずつ追加されるイメージです。

使い方

Sub Test()
    
    Dim list As Variant
    list = SelectFiles
  
    Dim i As Long
    For i = LBound(list) To UBound(list)
        Debug.Print list(i)
    Next i
    
End Sub

実行するとファイル選択のダイアログが出ます。
エクセルファイルを選択すると、イミディエイトウィンドウに選択したファイルのファイルパスが出力されます。
LBoundは配列の最初、UBoundは最後です。

C:\Users\robin\\デスクトップ\vba\ex1.xlsx
C:\Users\robin\\デスクトップ\vba\ex2.xlsx
C:\Users\robin\\デスクトップ\vba\ex3.xlsx

こんな感じで出力されるので、list = SelectFiles以降のコードを改変してお望みの処理をしてください。

Discussion