5/02/2021

Excel。VBA。各シートにあるデータを一つのシートにまとめるのが面倒なので楽をしたい。【Gather on the sheet】

Excel。VBA。各シートにあるデータを一つのシートにまとめるのが面倒なので楽をしたい。

<Excel VBA>

それぞれのシートにあるデータを、一つのシートにまとめる作業は、簡単ですが、シートが多いと、単純作業の繰り返しになるため、とても面倒な処理になってきます。


例えば、次のようなファイルがあります。


新宿・渋谷・池袋・八王子・四谷のシートには、各店舗の売上表が同じセル番地に入力されています。


それを、全店舗シートにまとめたい。

すなわち、各店舗のシートのA1:B11を範囲選択して、全店舗シートにコピーしたいわけです。


作業としては、とても単純ですが、単純がゆえに、繰り返すとなると面倒なわけです。


さらに、各店舗のシートには、シート名でどの店舗なのか管理しているために、店舗名を表示しているデータの列はありません。

単純にまとめてしまうと、どの店舗のデータなのかわからなくなってしまいます。

そこで、全店舗シートのC列に店舗名も入力する作業も追加したい。


そこで、Excel VBAでマクロをつくってしまおうというわけですね。


次のようなプログラム文を用意しました。

Sub データ集合()

    Dim i As Integer

    Dim j As Integer

    Dim data_count  As Long

    Dim total  As Long

    Dim shop_name As String

    

    total = 2


    For i = 2 To Worksheets.Count

        data_count = Worksheets(i).Range("a1").CurrentRegion.Rows.Count - 1

        shop_name = Worksheets(i).Name

        Worksheets(i).Range("a2").Resize(data_count, 2).Copy Worksheets("全店舗").Range("a" & total)

            For j = total To total + data_count - 1

                Cells(j, 3) = shop_name

            Next

        total = total + data_count

    Next

End Sub


まずは、実行してみましょう。


希望通りに、全店舗シートにまとめることができ、C列に店舗名も入力されています。


では、プログラム文を確認していきます。


最初は、変数の宣言ですね。

Dim i As Integer

Dim j As Integer

Dim data_count  As Long

Dim total  As Long

Dim shop_name As String


data_count には、店舗名シートのデータの件数を代入させます。

totalは、全店舗シートにこぴーされたデータの件数で使用します。

shop_nameは、C列用の店舗名のための変数です。


total = 2

これは、全店舗シートの1行目が見出し行であって、データそのものは2行目からコピーしていきますので、2を代入させておきます。


For i = 2 To Worksheets.Count

    data_count = Worksheets(i).Range("a1").CurrentRegion.Rows.Count - 1

    shop_name = Worksheets(i).Name

    Worksheets(i).Range("a2").Resize(data_count, 2).Copy Worksheets("全店舗").Range("a" & total)

        For j = total To total + data_count - 1

            Cells(j, 3) = shop_name

        Next

    total = total + data_count

Next


For i = 2 To Worksheets.Count ~ Next

i=2。

これは、このファイルの左から2番目のシートのデータをコピーしますので、左から2番目の「2」です。

3番目だったら「3」とします。


また、Worksheets.Countで、ファイルの総シート数を算出することができるので、作業したいシート数を繰り返し処理をすることができます。


data_count = Worksheets(i).Range("a1").CurrentRegion.Rows.Count - 1

1行目が見出し行なので、見出し行までコピーするとあとあと、処理が増えてしまうので、見出し行を除いた、データだけの行数を代入しておきます。


shop_name = Worksheets(i).Name

シート名をshop_nameに代入しておきます。


Worksheets(i).Range("a2").Resize(data_count, 2).Copy Worksheets("全店舗").Range("a" & total)

全店舗シートの最終行の下に、店舗シートのデータのみをコピーし貼り付けます。


コピーの範囲は、Range("a2").Resize(data_count, 2)。

A2からデータの件数分が対象とすることで、見出し行を含めないで、コピーすることができます。


For j = total To total + data_count - 1

    Cells(j, 3) = shop_name

Next

貼り付けたデータのC列に店舗名を入力するブロックです。


このようなプログラム文をつくることで、各店舗シートのデータを全店舗シートにまとめることができます。


現場では、単純作業を繰り返して行っているものなどある場合には、Excel VBAでプログラムをつくってみるのもいいかもしれませんね。