shikumika’s diary

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

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

ExcelのVBAで、ユーザーが指定フォルダを選択し、フォルダ内のExcelファイルを順番に処理するサンプル。前回のDir関数を利用した方法と同様の処理をFileSystemObjectを利用して実現するサンプルです。

前回のDir関数の方法は、サブフォルダ内の処理ができないなどのデメリットもあるので、より機能が多いFileSystemObject の方法を基本パターンとした方がよい印象。

事例の前提

ユーザーが指定フォルダを選択し、フォルダ内のExcelファイルを順番に処理するサンプル。もう少し詳しい前提を確認したい場合は、次の前回記事を確認ください。

shikumika.org

 

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事例

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

shikumika.org

 

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

shikumika.org

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