シートに分かれたデータを1シートにまとめるVBA

会社ごとに独自のExcelの記録方法があります。昔からの方法で、もしかすると現在ではもっと効率の良い方法があるのかもしれません。

バラバラデータ

例えば、月ごとに販売記録をシートに分けていて、年に12シートが作成されてしまうなど、下のような記録をしている場合です。

しかし、今から仕組みを変えるには、大きなコストをかけることになり、なかなか先に進まなかったりします。
その状態から、効率化するという依頼があったときに、どうするかというと、現行データは維持しつつ、ばらばらに分かれているデータを一か所にまとめることを考えます。

一か所で管理できるようにする

このシートに分かれたままでは、今年、何の商品が売れたか集計できませんし、どの分の入金がまだかなどのチェックも漏れるかもしれません。
なのでこのような形にします。

一か所にまとめた方がメリットはあるのですが、現状のデータをそのまま加工してしまうと、それはそれで運用しにくくなってしまうでしょう。
なので、別のシートにリンクするような形で作成できるといいのかもしれません。

VBAで対応する!

ということで、それを実現するVBAを考えました。
この記事のVBAの応用です。

Sub 全シートデータドッキング()
Dim i, ii, linecount As Integer
ii = 0
For i = 1 To Worksheets.Count
If Worksheets(i).Name <> “main” Then
ii = ii + 1
Range(“I” & ii).Value = Worksheets(i).Name
End If
Next
Range(“H1:H” & Worksheets.Count – 1).Formula = “=COUNTA(INDIRECT(“”‘””&I1&””‘!A:A””))”
Range(“G1”).Value = 0
Range(“G2:G” & Worksheets.Count).Formula = “=IF(ROW()=1,0,SUM($H$1:H1))”
linecount = WorksheetFunction.Sum(Range(“H:H”))
Range(“A1”).Value = 1
Range(“A2:A” & linecount).Formula = “=IF(VLOOKUP(ROW()-1,G:I,3,TRUE)<>VLOOKUP(ROW()-2,G:I,3,TRUE),1,A1+1)”
Range(“B1”).Value = “シート名”
Range(“B2:B” & linecount).Formula = “=VLOOKUP(ROW()-1,G:I,3,TRUE)”
Range(“C1:C” & linecount).Formula = “=INDIRECT(“”‘””&VLOOKUP(ROW()-1,$G:$I,3,TRUE)&””‘!A””&$A1)”
Range(“D1:D” & linecount).Formula = “=INDIRECT(“”‘””&VLOOKUP(ROW()-1,$G:$I,3,TRUE)&””‘!B””&$A1)”
Range(“E1:E” & linecount).Formula = “=INDIRECT(“”‘””&VLOOKUP(ROW()-1,$G:$I,3,TRUE)&””‘!C””&$A1)”
ActiveSheet.Calculate
End Sub

集計するブックに、新規シートを一枚挿入してシート名を「main」にし、このVBAを実行します。

こうなります。

まとめ

一枚にまとまれば、できることが増えます。大きなところでは、並べ替え、フィルター、ピボットテーブルができるようになります。
このように、オリジナルデータに変更を加えずに使いやすいデータを作りかえることは、組織にとってストレスなく、新たな効率化ができるようになります。
もちろん将来的には、データは整理されるべきです。しかし、今すぐ行うことなのかは判断していかなければなりません。一つの手法としてこのような方法が考えられます。
この考え方はこれからのコンピューティングのやり方、RPAにも通じます。
また、今回のVBAでは、値をコピーしたり、そのままに値を書き込んだりせず、Excelの計算式を書き込むという手法を使っています。
この方法では、VBAのコードの行数を少なくすることができる反面、再計算されるようになるので、処理時間が遅くなります。
なので、都度、値貼り付けなどを使って、計算式を値に入れかえていきます。この手法、開発が楽なので、私はよく使います。

コメント

タイトルとURLをコピーしました