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でプログラムをつくってみるのもいいかもしれませんね。