hiko-blog

VBA業務改善

MENU

フォルダ内の全集計ファイルを取りまとめる

Option Explicit

Sub フォルダ内の全集計ファイルを取りまとめる()
    Dim フォルダパス As String
    Dim 対象ファイル As String
    Dim 対象ブック As Workbook
    Dim 一時ブック As Workbook
    Dim シート As Worksheet
    Dim 合成シート As Worksheet
    Dim 最終行 As Long
    Dim 集計ファイル数 As Integer

    Application.ScreenUpdating = False

    ' 新しいワークブックを作成
    Set 一時ブック = Workbooks.Add
    Set 合成シート = 一時ブック.Sheets(1)

    ' 合成シートの行数を初期化
    最終行 = 1

    ' 対象フォルダのパスを取得
    フォルダパス = "Z:\Work" ' <-- ここにフォルダのパスを入力してください

    ' フォルダ内のExcelファイルを処理
    対象ファイル = Dir(フォルダパス & "\*.xlsx") ' フォルダ内のExcelファイルを取得
    集計ファイル数 = 0

    ' ファイル名を格納する列のヘッダーを追加
    '合成シート.Cells(1, 1).Value = "ファイル名"

    Do While 対象ファイル <> ""
        ' Excelファイルを開く
        Set 対象ブック = Workbooks.Open(フォルダパス & "\" & 対象ファイル)

        ' 「sheet1」という名前のシートが存在するかチェック
        If WorksheetExists(対象ブック, "sheet1") Then
            ' 集計ファイル数をカウント
            集計ファイル数 = 集計ファイル数 + 1

            ' ファイル名のみを取得
            Dim ファイル名 As String
            ファイル名 = 対象ファイル

            ' ファイル名を格納する行を取得
            Dim 挿入行 As Long
            挿入行 = 最終行
            
            ' ファイル名を挿入
            合成シート.Cells(挿入行, 1).Value = ファイル名

            ' 集計ファイルのsheet1を合成シートにコピー
            対象ブック.Sheets("sheet1").UsedRange.Copy 合成シート.Cells(挿入行, 2)

            ' 最終行の更新
            最終行 = 挿入行 + 対象ブック.Sheets("sheet1").UsedRange.Rows.Count
        End If

        ' 次のファイルへ
        対象ブック.Close False
        対象ファイル = Dir
    Loop

    ' 合成データの書き込みが終了したので、合成ワークブックを保存
    一時ブック.SaveAs フォルダパス & "\集計データ.xlsx"

    ' 合成ワークブックを閉じる
    一時ブック.Close False

    Application.ScreenUpdating = True
    MsgBox "集計が完了しました。" & vbCrLf & "フォルダ内の「sheet1」のシート数: " & 集計ファイル数, vbInformation
End Sub

Function WorksheetExists(wb As Workbook, sName As String) As Boolean
    Dim ws As Worksheet

    On Error Resume Next
    Set ws = wb.Sheets(sName)
    On Error GoTo 0

    WorksheetExists = Not ws Is Nothing
End Function