ピボットテーブルで、「年月週でグループ化」っぽいことをしてみる

ピボットテーブルで、部品の入出庫履歴を作成した時のこと。月単位での集計に対し、「週単位で見たい」という要望をいただいたので挑戦してみた。
f:id:Infoment:20190313220909p:plain
まず今回の記事用に、ダミーデータを作成する。かなりナマクラして作ったデータがこちら。

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

出来上がったデータが、こちら。
f:id:Infoment:20190313221235p:plain
マイナスの入庫は便宜上、出庫と見なす。従って、毎日

  • りんご
  • みかん
  • バナナ

の何れかが、0 ~ 50個入庫または出庫される表となっている(千日分)

これでピボットテーブルを作成すると、こうなる。
f:id:Infoment:20190313221618p:plain

日付は、グループ化が可能だ。例えば月単位だと、こうなる。
f:id:Infoment:20190313221802g:plain
複数の条件でグループ化することもできる。
例)年月でグループ化
f:id:Infoment:20190313221911p:plain

だが残念なことに、この中には「週」が存在しない。
f:id:Infoment:20190313221957p:plain

「日」の「日数」を7にすれば週単位になるが、何だか見難い。
f:id:Infoment:20190313222106p:plain
f:id:Infoment:20190313222125p:plain

ということで、話がかなり前後するが、先日のこの記事に内容が生まれた訳で。
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

f:id:Infoment:20190313222503p:plain
次いで、年月でグループ化したテーブルに、「週」を追加する。
※データソースの変更をお忘れなく。

結果、年-月-週での入出庫まとめが完成した。
f:id:Infoment:20190313222657p:plain

もっと簡単な方法もあるかもしれませんが、現状は結構重宝してます。

参考まで。