選択したフォルダ内で、キーワードを含むエクセルを読み込んで処理したいときに使います。
まずこれがフォルダを選択するコードです。
Function SelectFolder() As String
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "フォルダを選択してください"
.AllowMultiSelect = False
If .Show = -1 Then
SelectFolder = .SelectedItems(1)
End If
End With
End Function2行目からすでに意味不明ですね。
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個程度であれば人間が選んだ方が確実です。










コメントを残す