【VBA】キーワードを含むエクセルファイルを読み込んでファイルパスを返すコード

選択したフォルダ内で、キーワードを含むエクセルを読み込んで処理したいときに使います。

まずこれがフォルダを選択するコードです。

Function SelectFolder() As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "フォルダを選択してください"
        .AllowMultiSelect = False
        If .Show = -1 Then
            SelectFolder = .SelectedItems(1)
        End If
    End With
End Function

2行目からすでに意味不明ですね。

msoFileDialogFolderPickerという便利なオブジェクトを渡して云々しているだけなので覚える必要はありません。

次に行きます。

フォルダを選択してキーワードを含むエクセルファイルパスを返します。

返す型はcollection型です。配列より便利に使えるので、慣れたら使ってみましょう。

Function SelectFolder() As String
    With Application.fileDialog(msoFileDialogFolderPicker)
        .Title = "フォルダを選択してください"
        .AllowMultiSelect = False
        If .Show = -1 Then
            SelectFolder = .SelectedItems(1)
        End If
    End With
End Function

Function GetExcelFilesMatchKeyword(ByVal keyword As String) As Collection
    Dim folderPath As String
    Dim file As String
    Dim files As New Collection

    folderPath = SelectFolder()

    ' ユーザーがフォルダを選択しなかった場合は処理を終了
    If folderPath = "" Then Exit Function

    ' フォルダパスの末尾にバックスラッシュがない場合は追加
    If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"

    ' 最初のファイルを検索
    file = Dir(folderPath & "*.xls*")

    ' 全ファイルをループ
    Do While file <> ""
        ' キーワードを含む場合にリストに追加
        If InStr(1, file, keyword) > 0 Then
            files.Add folderPath & file
        End If

        ' 次のファイルを検索
        file = Dir()
    Loop

    Set GetExcelFilesMatchKeyword = files
End Function

これを実行するとフォルダを開いて引数にしたキーワードを含むエクセルファイルのパスを返してくれます。

これも中身を理解する必要はありませんが、18行目のDo whileはたまに使います。

Sub Test()
    Dim files As Collection
    Dim file As Variant

    Set files = GetExcelFilesMatchKeyword("様式")
    
    ' 好きな処理
    For Each file In files
        Debug.Print file
    Next file
End Sub

実際に使ってみます。

選択したフォルダ内のエクセルのうち、「様式1」を含むもののみ、パスを取得して出力します。

Dim keyword as String
keyword = ThisWorkBook.WorkSheets(1).Range("A1").Value
Set files = GetExcelFilesMatchKeyword(keyword)

「様式1」とせず、マクロを書いたブックのA1セルに入力された値をキーワードにする。という方法もよく使います。

ただ実際のところ、関連記事のように自分で選択した方が早いということが往々にして発生します。

前任者のn-1年度フォルダをコピーしてn年度の作業をしていて、大量のごみファイルがあり、それも読み込んでエラーを吐いてしまう。エラー回避のコードを書く。

面倒くさいですね。

選択するファイルが20~30個程度であれば人間が選んだ方が確実です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA