VBA100本ノック 40本目:複数ブックの統合
こちらで公開されている、100本ノックに挑戦。
www.excel-ubara.com
素晴らしい教材を公開いただき、ありがとうございます。
上記リンク先から、問題文を転載。
最近ではPower Querryという便利なものがあるので、敢えてマクロで行う
必要は無いかもしれない。でも、できるに越したことは無いか。
Sub VBA_100Knock_40() ' 各ファイルの転記元シート。 Dim SrcSheet As Worksheet ' 情報集約(転記先)シート。 Dim DstSheet As Worksheet ' 情報集約(転記先)シート名。 Dim DstSheetName As String: DstSheetName = "2020年12月" Set DstSheet = ThisWorkbook.Sheets(DstSheetName) ' 転記元ファイルが保存されたフォルダパス。 Dim TargetFolderPath As String TargetFolderPath = "C:\temp\新しいフォルダー (2)\data" Dim FSO As Scripting.FileSystemObject Set FSO = New Scripting.FileSystemObject ' 各転記元ファイル格納用変数。 Dim Wb As Workbook ' 各転記元シート格納用変数。 Dim Ws As Worksheet ' Wb内のシートループ用変数。 Dim File As Scripting.File ' 転記元情報格納用配列。 Dim SrcArray As Variant ' 転記先の左上セルアドレス。 Dim DstRange As Range ' 画面更新の一時停止。 Application.ScreenUpdating = False ' 転記元の各ファイルについて、拡張子に「.xls」を含むものを起動。 ' 転記先と同じ名前のシート名が存在したら、その中身を配列に格納する。 For Each File In FSO.GetFolder(TargetFolderPath).Files If FSO.GetExtensionName(File) Like "xls?" Then Set Wb = Workbooks.Open(Filename:=File.Path, _ UpdateLinks:=False, _ ReadOnly:=True) SrcArray = Array() For Each Ws In Wb.Sheets If Ws.Name = DstSheetName Then Set SrcSheet = Ws SrcArray = Ws.UsedRange Exit For End If Next Wb.Close False ThisWorkbook.Activate If UBound(SrcArray) <> -1 Then ' 一つ目の転記情報。 If DstSheet.Range("A1") = vbNullString Then Set DstRange = DstSheet.Range("A1") ' 二つ目以降の転記情報。 Else Set DstRange = DstSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1) ' 空白を目印に二つ目以降のラベル行を纏めて削除するために、 ' 配列(1,1)を空白にする。 SrcArray(1, 1) = vbNullString End If DstRange.Resize(UBound(SrcArray), UBound(SrcArray, 2)) = SrcArray End If End If Next ' 空白が無い場合はエラーになるので、一旦エラー無視。 On Error Resume Next DstRange.Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete On Error GoTo 0 Application.ScreenUpdating = True End Sub
※冒頭リンク先の解答例および解説も、ぜひご一読ください。
参考まで。