shikumika’s diary

日々の事務作業で手間なことを簡単にできる仕組み(自動化、方法など)、困ったことの解決方法を調べた備忘録

【Excel VBA】指定フォルダ内のExcelファイルを順番に処理(Dir関数の利用)

ExcelのVBAで、ユーザーが指定フォルダを選択し、フォルダ内のExcelファイルを順番に処理するサンプル。Dir関数を利用した方法で、別途紹介するFileSystemObject の方法を基本とした方がよい印象

Excel操作で処理が完結するような業務は、VBAでの処理が便利なので今回はDir関数を利用した基本的な事例の備忘録。

 

事例の前提

事例の前提は次のとおり。

  1. ユーザーが処理対象のフォルダ、出力先のフォルダを指定する。
  2. 指定した処理対象のフォルダ内にあるExcelファイルを順番に起動する。
  3. 指定した処理を実行し、出力先フォルダに出力する。

なお、事例の処理内容は、操作イメージ用で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 の方法を基本パターンとした方がよい印象

shikumika.org

 

参考情報:

Dir 関数 (Visual Basic for Applications) | Microsoft Learn

FileSystemObject オブジェクト | Microsoft Learn

 

その他のVBA事例

複数ブックを選択して、順番に処理するサンプルは以下です。

shikumika.org

 

ブック内にある複数シートを選択して、順番に処理するサンプルは以下です。

shikumika.org

以上、ExcelのVBAで、ユーザーが指定フォルダを選択し、フォルダ内のExcelファイルを順番に処理するサンプルでした。