【Excel VBA】フォルダ内の複数Excelファイルを順番に開いてデータを一括集計する方法

みなさんこんにちは。

毎月届く複数のExcelファイルを1冊ずつ開き、必要なデータを集計用ブックへコピーしている方も多いかと思います。

ファイル数が増えるほど、開く・コピーする・閉じるという作業を何度も繰り返すことになり、入力ミスや集計漏れも発生しやすくなります。

今回は、Dir関数でフォルダ内のExcelファイルを取得し、Workbooks.Openで1冊ずつ開きながら、指定セルの値を集計シートへ一括転記する方法をご紹介したいと思います。


この記事はこんな人におすすめ

  • 複数のExcelファイルを毎回手作業で集計している人
  • フォルダ内のExcelファイルを順番に処理したい人
  • Dir関数とWorkbooks.Openを組み合わせたい人
  • 月次集計や支店別集計を自動化したい人

今回作成する処理の流れ

今回は、集計ツールと同じフォルダに「売上_東京.xlsx」「売上_大阪.xlsx」「売上_名古屋.xlsx」が保存されている想定で進めます。各売上ファイルのSheet1には、B2セルに支店名、C2セルに売上金額が入力されているものとします。

Excel VBAで一括集計する集計ツールと3つの売上Excelファイルを保存したフォルダ

処理の流れは、①Excelファイルを取得→②1冊ずつ読み取り専用で開く→③B2・C2の値を取得→④集計シートへ転記→⑤保存せず閉じる、となります。

Dir関数でExcelファイルを順番に取得する

フォルダ内のファイル一覧はDir関数で取得できます。最初にパスを指定し、その後は引数なしのDirを呼び出すことで、次に一致するファイル名を順番に取得できます。

'集計ツールと同じフォルダを対象にする
folderPath = ThisWorkbook.Path & "\"

'フォルダ内のExcelファイルを最初の1件から取得する
fileName = Dir(folderPath & "*.xls*")

'ファイルが見つからなくなるまで繰り返す
Do While fileName <> ""

    'ここに各ファイルの処理を記述する

    '次のExcelファイル名を取得する
    fileName = Dir()

Loop

Dir関数については、以下の記事でも詳しくご紹介しています。

https://epsilon-delta-blog.com/vba-dir-file-list

複数ファイルを開いて集計する完成コード

今回の完成コードは以下になります。読込元ファイルは変更しないため、ReadOnly:=Trueで開き、処理後はSaveChanges:=Falseで保存せず閉じます。

Sub 複数Excelファイルを一括集計する()

    '==================================================
    ' 変数を定義する
    '==================================================

    '処理対象フォルダのパス
    Dim folderPath As String

    'Dir関数で取得したファイル名
    Dim fileName As String

    '読み込み対象のExcelブック
    Dim sourceBook As Workbook

    '読み込み対象のワークシート
    Dim sourceSheet As Worksheet

    '集計結果を出力するワークシート
    Dim outputSheet As Worksheet

    '集計シートの出力行番号
    Dim outputRow As Long


    '==================================================
    ' 集計先を準備する
    '==================================================

    'このマクロが保存されているブックの「集計」シートを指定する
    Set outputSheet = ThisWorkbook.Worksheets("集計")

    '2行目以降の前回集計結果を削除する
    outputSheet.Rows("2:" & outputSheet.Rows.Count).ClearContents

    '見出しを設定する
    outputSheet.Cells(1, 1).Value = "ファイル名"
    outputSheet.Cells(1, 2).Value = "支店名"
    outputSheet.Cells(1, 3).Value = "売上"

    'データは2行目から出力する
    outputRow = 2


    '==================================================
    ' フォルダ内のExcelファイルを取得する
    '==================================================

    '集計ツールと同じフォルダを対象にする
    folderPath = ThisWorkbook.Path & "\"

    '拡張子がxlsから始まるExcelファイルを取得する
    fileName = Dir(folderPath & "*.xls*")


    '==================================================
    ' Excelファイルを1冊ずつ処理する
    '==================================================

    Do While fileName <> ""

        '集計ツール自身と一時ファイルは処理対象から除外する
        If fileName <> ThisWorkbook.Name And _
           Left(fileName, 2) <> "~$" Then

            '外部リンクを更新せず、読み取り専用で対象ブックを開く
            Set sourceBook = Workbooks.Open( _
                FileName:=folderPath & fileName, _
                UpdateLinks:=0, _
                ReadOnly:=True)

            '読込元のSheet1を指定する
            Set sourceSheet = sourceBook.Worksheets("Sheet1")

            'ファイル名を集計シートのA列へ出力する
            outputSheet.Cells(outputRow, 1).Value = fileName

            '支店名(B2セル)を集計シートのB列へ出力する
            outputSheet.Cells(outputRow, 2).Value = _
                sourceSheet.Range("B2").Value

            '売上金額(C2セル)を集計シートのC列へ出力する
            outputSheet.Cells(outputRow, 3).Value = _
                sourceSheet.Range("C2").Value

            '次の出力行へ移動する
            outputRow = outputRow + 1

            '読込元ブックは変更を保存せず閉じる
            sourceBook.Close SaveChanges:=False

            '次のファイルに備えてオブジェクトを初期化する
            Set sourceSheet = Nothing
            Set sourceBook = Nothing

        End If

        '次のExcelファイル名を取得する
        fileName = Dir()

    Loop


    '==================================================
    ' 処理完了を通知する
    '==================================================

    MsgBox "複数ファイルの集計が完了しました。", vbInformation

End Sub

Workbooks.Openでは、UpdateLinks:=0で外部リンクを更新せず、ReadOnly:=Trueで読み取り専用として開けます。処理後はWorkbook.CloseのSaveChanges:=Falseを指定して、変更を保存せず閉じています。

Workbooks.Openを安全に使用する方法については、以下の記事も参考にしてください。

https://epsilon-delta-blog.com/vba-workbooks-open
集計対象ExcelファイルのB2セルに支店名、C2セルに売上金額を入力した画面

集計結果を確認する

マクロを実行すると、「集計」シートへファイル名・支店名・売上が順番に出力されます。

Excel VBAで複数のExcelファイルから支店名と売上を一括集計した結果

自分自身と一時ファイルを除外する理由

集計ツール自身も同じフォルダにあるため、条件を入れないと処理対象に含まれてしまいます。そのため、fileName <> ThisWorkbook.Nameで自分自身を除外しています。

また、Excelファイルを開いていると「~$」から始まる一時ファイルが作成されることがあります。これも通常のExcelファイルとして開かないように除外しておくと安全です。

別のセルや範囲を取得したい場合

'D5セルの値を取得する場合
outputSheet.Cells(outputRow, 2).Value = _
    sourceSheet.Range("D5").Value

'B2:D2の複数項目を取得する場合
outputSheet.Cells(outputRow, 2).Value = _
    sourceSheet.Range("B2").Value

outputSheet.Cells(outputRow, 3).Value = _
    sourceSheet.Range("C2").Value

outputSheet.Cells(outputRow, 4).Value = _
    sourceSheet.Range("D2").Value

ファイル名の規則やシート構成が統一されていれば、毎月の集計作業をかなり自動化しやすくなります。

参考情報

最後に

いかがでしたでしょうか。

今回は、フォルダ内の複数Excelファイルを順番に開き、必要なデータを1つの集計シートへまとめる方法をご紹介しました。

Dir関数・Workbooks.Open・Workbook.Closeを組み合わせることで、毎月繰り返している集計作業をVBAだけで自動化できます。少しでも参考になれば幸いです。


開発依頼について

ココナラでWebスクレイピング開発サービスを出品しております。

自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。

そんな方はいつでもお気軽にご相談ください。

また、本ブログからご依頼いただいた方については割引特典がございますので、

ご不明点と合わせてメッセージをいただけると幸いです。

Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!

Webスクレイピング以外にもWebアプリの開発サービスも出品しております。

こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、

お気軽にご相談ください。

スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA