0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

VBAでサブフォルダ内のExcelファイルをマージする

Last updated at Posted at 2020-10-18

Excelに

Excelにモジュールを追加して下記のソースを添付してください。

'パブリック変数
Public gSheet As Worksheet
Public gRow As Long
'定数
Const C_GET_ROW_S As Long = 4 '取得元データの開始行
Const C_SET_ROW_S As Long = 3 '添付先データの開始行

'サブフォルダを含むフォルダ内のファイルデータを取得する
Sub getFileData()
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With
    
    '初期設定
    gRow = C_SET_ROW_S
    
    Set gSheet = Sheets(1)

    '初期化
    'A~K列まで初期化
    gSheet.Range("A" & C_GET_ROW_S & ":K" & gSheet.Range("A" & Rows.Count).End(xlUp).row).ClearContents
    
    'ファイルマージ
    Dim path As String
    path = "C:\work"
    'path = gSheet.Range("B1").Value
    Call mergeData(path)
    
    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With

End Sub

'サブフォルダも含むフォルダ内のファイルデータを探してデータをマージする
Sub mergeData(folderPath As Variant)
    
    '参照設定
    Dim fso As Object, folder As Variant, file As Variant
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    'フォルダ内のサブフォルダを探す
    For Each folder In fso.GetFolder(folderPath).SubFolders
        Call mergeData(folder)
    Next
   
    Dim row As Long
    'フォルダ内のファイルを探索
    For Each file In fso.GetFolder(folderPath).Files
        'エクセル以外は対象外
        If Not (LCase(fso.GetExtensionName(file)) Like "xls*") Then
            GoTo Continue
        End If
        
        gRow = gRow + 1
        row = gRow
        
        'ファイル内のデータをコピーする
        copyData (file)
       
        With gSheet
            'ファイル情報
            .Cells(row, 1) = folderPath 'フォルダパス
            .Cells(row, 2) = file 'ファイルパス
            .Cells(row, 3) = fso.GetFileName(file) 'ファイル名
            .Cells(row, 4) = fso.GetExtensionName(file) '拡張子
            .Cells(row, 5) = fso.GetFile(file).Size 'ファイルサイズ
            .Cells(row, 6) = fso.GetFile(file).DateCreated '作成日時
            .Cells(row, 7) = fso.GetFile(file).DateLastModified '最終更新日時
            .Cells(row, 8) = fso.GetFile(file).DateLastAccessed '最終アクセス日時
            
            'データ行数分ファイル情報をコピー
            .Range("A" & row & ":H" & row).Copy
            .Range("A" & (row + 1) & ":H" & gRow).PasteSpecial xlPasteValuesAndNumberFormats
        End With
        
Continue:
    Next
    
End Sub

'データコピーを行う
Sub copyData(filePath As Variant)
    
    Dim rowEnd As Long
    
    'データの範囲はB~D列
    With Workbooks.Open(filePath)
        rowEnd = .Worksheets(1).Range("B" & Rows.Count).End(xlUp).row
        '先頭行から末尾行までコピー
        .Worksheets(1).Range("B" & C_GET_ROW_S & ":D" & rowEnd).Copy
        'このブックの1シート目へ値貼り付け
        gSheet.Cells(gRow, 9).PasteSpecial xlPasteValuesAndNumberFormats
        'コピー中状態を解除
        Application.CutCopyMode = False
        'ブックを保存せずに閉じる
        .Close False
    End With
    
    'データ行数分追加
    gRow = gRow + rowEnd - C_GET_ROW_S
    
End Sub
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?