ピボットテーブルで、「年月週でグループ化」っぽいことをしてみる
ピボットテーブルで、部品の入出庫履歴を作成した時のこと。月単位での集計に対し、「週単位で見たい」という要望をいただいたので挑戦してみた。
まず今回の記事用に、ダミーデータを作成する。かなりナマクラして作ったデータがこちら。
Sub データ作成() Dim seq(1 To 1000, 1 To 3) Dim goods As Variant goods = Array("りんご", "みかん", "バナナ") Dim i As Long Dim goodsIndex As Long Dim goodsCount As Long seq(1, 1) = "商品名" seq(1, 2) = "日付" seq(1, 3) = "入庫" For i = 2 To 1000 goodsIndex = Rnd * 2 goodsCount = Rnd * 100 - 50 seq(i, 1) = goods(goodsIndex) seq(i, 2) = Date + i seq(i, 3) = goodsCount Next Range("A1").Resize(1000, 3) = seq End Sub
出来上がったデータが、こちら。
マイナスの入庫は便宜上、出庫と見なす。従って、毎日
- りんご
- みかん
- バナナ
の何れかが、0 ~ 50個入庫または出庫される表となっている(千日分)
これでピボットテーブルを作成すると、こうなる。
日付は、グループ化が可能だ。例えば月単位だと、こうなる。
複数の条件でグループ化することもできる。
例)年月でグループ化
だが残念なことに、この中には「週」が存在しない。
「日」の「日数」を7にすれば週単位になるが、何だか見難い。
ということで、話がかなり前後するが、先日のこの記事に内容が生まれた訳で。
infoment.hatenablog.com
まず、元データに「週」の列を追加し、当該日が第何週目かを求める。
Function WeekNumber(target_date As Date) As Long Dim FirstDay As Date FirstDay = DateSerial(Year(target_date), Month(target_date), 1) WeekNumber = WorksheetFunction.WeekNum(target_date) - _ WorksheetFunction.WeekNum(FirstDay) _ + 1 End Function
次いで、年月でグループ化したテーブルに、「週」を追加する。
※データソースの変更をお忘れなく。
結果、年-月-週での入出庫まとめが完成した。
もっと簡単な方法もあるかもしれませんが、現状は結構重宝してます。
参考まで。