3/18/2018

Excel。マクロ24。シートごとのデータを1つのシートにまとめるのが面倒なので。【Union】

Excel。マクロ24。シートごとのデータを1つのシートにまとめるのが面倒なので。

<Excel VBA>

シートごとにデータがありまして、そのデータを1つのシートにまとめたい場合、
いちいち、シートごとに範囲選択をして、コピーして、
まとめたいシートに移動して貼り付けてという処理を繰り返すというのは、
面倒ですよね。

しかも、シートの枚数が多い場合は、ゾッとしますよね。

このような単調な作業。
しかも繰り返し処理ということならば、
Excel VBAの出番という感じですね。

では各シートを確認してみましょう。

新宿・渋谷・池袋の各シートを用意しております。

レコード件数は、多くても少なくてもOKなのですが、
1行目に見出し行があり、A列に社員番号・B列が氏名ということが、
各シートの共通のルールにしております。

場所が違うと、それぞれのシートごとに対応することになるので、
同じ処理とはいきませんので、注意が必要です。

そして、合体するシートが、全社員シートとなっています。

合体するシートを今回はデータのあるシートの前に置いておきます。

さて、Excel VBAを作っていくために事前に確認しておきたいことは、
全社員シートが2枚目にあるので、
3枚目から最後のシートまで繰り返し処理をする必要があること。

それぞれのシートのレコード数(見出し行を除いた行数)を
数える必要があること。

そして、合体させるシートの最終行にデータを追加していく必要があること。

この3つのことを念頭にして作ってみましょう。

Sub シート合体()
    Dim i As Integer
    Dim 社員数  As Long
    Dim 合体数  As Long

    合体数 = 2

    For i = 3 To Worksheets.Count
        社員数 = Worksheets(i).Range("a1").CurrentRegion.Rows.Count - 1
        Worksheets(i).Range("a2").Resize(社員数, 2).Copy _
            Worksheets("全社員").Range("a" & 合体数)
        合体数 = 合体数 + 社員数
    Next
End Sub

構文を確認していきましょう。

変数は、3つ用意します。

変数の合体数は、合体したレコード数をカウントするためのものです。

合体数 = 2
これは、見出しが1なので、2行目から貼り付けたいので2としています。

For i = 3 To Worksheets.Count
この構文ですが、i=3の3は、先頭のシートが3枚目だから3で、
Worksheets.Countは、シートの数を数えますので、
この数は、最終シートの数ですから、
この数値まで繰り返し処理を行わせることができます。

社員数 = Worksheets(i).Range("a1").CurrentRegion.Rows.Count - 1
シートのレコード数(社員数)を求めますが、
Worksheets(i).Range("a1").CurrentRegion.は、
ワークシートのA1からの表という意味ですね。

そしてその表の、Rows.Count – 1。

Rows.Countはその表の行数を数えます。
そして、見出し行を減らす必要があるので-1(マイナス1)します。

Worksheets(i).Range("a2").Resize(社員数, 2).Copy _
            Worksheets("全社員").Range("a" & 合体数)
この行は、長いので『_』(アンダーバー)で接続させています。

この処理は、Worksheets(i).Range("a2")。コピー元のワークシートのA2から、
Resize(社員数, 2)。B列の社員数のセルまでを、範囲選択して、コピーして、Worksheets("全社員").Range("a" & 合体数)。

全社員シートの最終行に貼り付けをするという構文ですね。

合体数 = 合体数 + 社員数
次のシートのデータを全社員データの最終行に追加するために、
合体数に社員数をプラスしておきます。

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

このように、1つのシートにデータだけを合体させることができましね。