編集

【ExcelVBA】複数シートの内容を1シートにまとめる

ExcelVBA #009 複数シートの内容を1シートにまとめる

今回は、複数シートの内容を1シートにまとめる処理をご紹介します。さて、この「シートにまとめる」という文言が非常に厄介で、”まとめる”がどういう状態を指すのか、まずそこを突き詰めた方が良いかもしれません。「まとめる」が「統合」なのか「集計」なのか「集約」なのか...はたまたピボットテーブルを使うのかExcelの機能を使うのか...人によってバラバラなんですよね。

ここで紹介するマクロの動作としては、表の下に次の表をどんどん追加していくというイメージです。前回、複数CSVを取り込むマクロを作成したので、その続きの処理として付け足したいと思います。度々使用していますが、コレクションの繰り返しやタイトル行を省いてコピーするなどのOffsetプロパティの利用についても記述していますので是非参考にしてください。

▼過去記事:フォルダー内の複数CSVファイルを取り込む

【ExcelVBA】フォルダー内の複数CSVファイルを取り込む | ともゆきの独り言(雑記ブログ)

【ExcelVBA】フォルダー内の複数CSVファイルを取り込む | ともゆきの独り言(雑記ブログ)

今回は、フォルダに格納されている複数のCSVファイルをExcelのシートに取り込む処理をご紹介します。

画面設計

画面設計
  • 集約ボタン:「MainProcess2」マクロを指定

前回作成したマクロファイルに「集約」ボタンだけ追加しました。今回は参照ボタンや読み込み開始ボタンは使用しません。

入力データ

入力データ

前回作成したマクロファイルの結果(複数CSVファイルの内容をシートに取り込んだ状態)から始めます。4月、5月、6月シートが既に作成されています。この3つのシートを1つの表にします。

処理実行結果

処理実行結果

集約ボタンを押すと、新たに「集約」シートが作成され、4月・5月・6月の3つのシートの表が1つの表として表示されます。

ソースコード(ExcelVBA)

Option Explicit

Sub MainProcess2()

    '対象シートのみのCollectionを生成(「設定情報」シート以外)
    Dim WSCollection As Collection
    Set WSCollection = New Collection
    Dim CurrentSheet As Worksheet
    For Each CurrentSheet In Worksheets
        If CurrentSheet.Name <> "設定情報" Then
            WSCollection.Add CurrentSheet
        End If
    Next

    '新規シート作成
    Dim newWS As Worksheet
    Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "集約"
    Set newWS = ActiveSheet

    'タイトル行の設定
    newWS.Range("A1") = "契約日"
    newWS.Range("B1") = "契約番号"
    newWS.Range("C1") = "機器"
    newWS.Range("D1") = "製造番号"
    newWS.Range("E1") = "台数"
    newWS.Range("F1") = "設置場所"

    '集計シートの貼付行を取得
    Dim PasteRow As Long
    PasteRow = newWS.Cells(newWS.Rows.Count, "A").End(xlUp).Row + 1
    
    'シートの繰り返し処理
    Dim item As Worksheet
    For Each item In WSCollection
        item.Range("A1").CurrentRegion.Offset(1, 0).Copy newWS.Cells(PasteRow, 1)
        PasteRow = newWS.Cells(newWS.Rows.Count, "A").End(xlUp).Row + 1
    Next

End Sub

ポイント

  1. 最初に対象シートのみのコレクションを生成します。このマクロは集約対象でないシートが「設定情報」だけなのでコレクション作成はあまり必要ないかもしれませんが、20シート程度あったりすると、要・不要のシートが結構存在することもあるので、最初に必要なシートだけ決めておくために作成しています。
  2. 最終行の取得は頻繁に使いますが、newWS.Cells(newWS.Rows.Count, "A").End(xlUp).Rowです。データが入っている最後の行番号ですので、今回は「貼り付け行」として+1しています。
  3. 各シートの表をコピーする際、CurrentRegionで指定するとタイトル行まで含まれてしまいます。そのため、Offsetプロパティで1行下げた範囲を指定しています。なお、移動しない場合は行・列ともに0を指定してください。Rangeオブジェクト.Offset(行の移動数,列の移動数)・行の移動数:正の数は下方向、負の数は上方向・列の移動数:正の数は右方向、負の数は左方向

新しい投稿はありません 前の投稿