ExcelのVBAで、ユーザーが指定フォルダを選択し、フォルダ内のExcelファイルを順番に処理するサンプル。前回のDir関数を利用した方法と同様の処理をFileSystemObjectを利用して実現するサンプルです。
前回のDir関数の方法は、サブフォルダ内の処理ができないなどのデメリットもあるので、より機能が多いFileSystemObject の方法を基本パターンとした方がよい印象。
事例の前提
ユーザーが指定フォルダを選択し、フォルダ内のExcelファイルを順番に処理するサンプル。もう少し詳しい前提を確認したい場合は、次の前回記事を確認ください。
VBAサンプル
Option Explicit Dim fs As Object 'FileSystemObjectのオブジェクト変数を宣言' Dim 対象フォルダ As String Dim 出力フォルダ As String Dim 対象File As Object Dim 対象ブック As Workbook Dim 出力ファイル名 As String Dim i As Long Sub 指定フォルダ内のExcelファイルを順番に処理() '対象フォルダの設定' With Application.FileDialog(msoFileDialogFolderPicker) .Title = "対象のExcelファイルが保存されているフォルダを選択してください。" If .Show <> -1 Then Exit Sub 対象フォルダ = .SelectedItems(1) End With '出力フォルダの設定' With Application.FileDialog(msoFileDialogFolderPicker) .Title = "出力フォルダを選択してください。" If .Show <> -1 Then Exit Sub 出力フォルダ = .SelectedItems(1) End With 'FileSystemObjectの利用準備' Set fs = CreateObject("Scripting.FileSystemObject") 'フォルダ内のExcelファイルのループ' For Each 対象File In fs.GetFolder(対象フォルダ).Files 'Excelファイルだけ処理する' If InStr(対象File.Name, ".xls") > 0 Then i = i + 1 Application.StatusBar = i & " 番目のファイル処理中" Workbooks.Open FileName:=対象File.Path, ReadOnly:=True Set 対象ブック = ActiveWorkbook Call 各ブックの処理 対象ブック.Close SaveChanges:=False End If Next 対象File '終了処理' Application.StatusBar = False MsgBox "処理が完了しました。" End Sub Private Sub 各ブックの処理() 'CSV保存' 出力ファイル名 = Left(対象File.Name, InStrRev(対象File.Name, ".") - 1) & ".csv" ActiveWorkbook.SaveAs FileName:=出力フォルダ & "\" & 出力ファイル名, FileFormat:=xlCSV End Sub
事例の補足説明
CreateObject 関数、FileSystemObjectについての参考情報は次のとおり。
CreateObject 関数 (Visual Basic for Applications) | Microsoft Learn
FileSystemObject オブジェクト | Microsoft Learn
なお、CreateObject 関数を使用せず、参照設定をする方法もある。この場合、誰かとVBAを共有するときに参照設定を個別に設定が必要で、その説明も必要になる。そのため、誰かと共有する場合はCreateObject関数が良い印象。
[参照設定] ダイアログ ボックス | Microsoft Learn
その他のVBA事例
複数ブックを選択して、順番に処理するサンプルは以下です。
ブック内にある複数シートを選択して、順番に処理するサンプルは以下です。
以上、ExcelのVBAで、ユーザーが指定フォルダを選択し、フォルダ内のExcelファイルを順番に処理するサンプル(FileSystemObjectを利用)でした。