ExcelのVBAで、ユーザーが指定フォルダを選択し、フォルダ内のExcelファイルを順番に処理するサンプル。Dir関数を利用した方法で、別途紹介するFileSystemObject の方法を基本とした方がよい印象
Excel操作で処理が完結するような業務は、VBAでの処理が便利なので今回はDir関数を利用した基本的な事例の備忘録。
事例の前提
事例の前提は次のとおり。
- ユーザーが処理対象のフォルダ、出力先のフォルダを指定する。
- 指定した処理対象のフォルダ内にあるExcelファイルを順番に起動する。
- 指定した処理を実行し、出力先フォルダに出力する。
なお、事例の処理内容は、操作イメージ用でCSVに変換するだけ。この処理内容部分を中心に目的に応じてカスタマイズし、利用する想定。
また、処理の進行状況を表示するため、Application.StatusBarを使っている。
VBAサンプル
Option Explicit Dim 対象フォルダ As String Dim 出力フォルダ As String Dim 対象ファイル名 As String 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 'フォルダ内のExcelファイルのループ' 対象ファイル名 = Dir(対象フォルダ & "\*.xls*") Do While 対象ファイル名 <> "" i = i + 1 Application.StatusBar = i & " 番目のファイル処理中" 'ファイル毎の処理' Workbooks.Open FileName:=対象フォルダ & "\" & 対象ファイル名, ReadOnly:=True Set 対象ブック = ActiveWorkbook Call 各ブックの処理 対象ブック.Close SaveChanges:=False '次のファイルを探す' 対象ファイル名 = Dir() Loop '終了処理' Application.StatusBar = False MsgBox "処理が完了しました。" End Sub Private Sub 各ブックの処理() '処理イメージ用でCSV保存のサンプル。この部分をカスタマイズする' 出力ファイル名 = Left(対象ファイル名, InStrRev(対象ファイル名, ".") - 1) & ".csv" ActiveWorkbook.SaveAs FileName:=出力フォルダ & "\" & 出力ファイル名, FileFormat:=xlCSV End Sub
事例の補足説明
上記はフォルダ内のファイル取得の方法として、Dir関数を利用したが、FileSystemObject を利用する方法もある。
僅かの差でほぼ変わらないが、FileSystemObject を利用する場合、参照設定と、Excelファイルだけを抽出の方法が主に異なる。ただし、今回のサンプルであれば、コードの行数はどちらの方法でも同程度。
なお、Dir関数は、サブフォルダ内の処理ができないなどのデメリットもあるので、より機能が多いFileSystemObject の方法を基本パターンとした方がよい印象。
参考情報:
Dir 関数 (Visual Basic for Applications) | Microsoft Learn
FileSystemObject オブジェクト | Microsoft Learn
その他のVBA事例
複数ブックを選択して、順番に処理するサンプルは以下です。
ブック内にある複数シートを選択して、順番に処理するサンプルは以下です。
以上、ExcelのVBAで、ユーザーが指定フォルダを選択し、フォルダ内のExcelファイルを順番に処理するサンプルでした。