作成した年月週の表ラベルに実際の値を充て込んでみる ④ 完
昨日は、作成した年月週の表ラベルに既存の値を転記し、更に重複する文字をラベルから消してみた。
infoment.hatenablog.com
今日は、今回の最終回。入出庫情報を元に、在庫の推移表として編集してみる。
現時点での表は、こんな感じだ。
この表の最終目的は、依頼者によれば、週次での在庫推移確認とのこと。従って、初期在庫さえわかれば、後は入出庫情報を加算すれば目的の表が完成する。
では仮に「りんご」「みかん」「ばなな」の初期在庫が10個であるとして、在庫の推移を確認してみよう。
Sub testoooooooooooo() Dim Dict As Dictionary Set Dict = GetTableDict(Range("B1").CurrentRegion) Dim rMax As Long rMax = Range("B1").CurrentRegion.Rows.Count Dim DObj As DateObjectClass Set DObj = New DateObjectClass Dim seq As Variant ' 週が連続する配列を取得。 seq = DObj.配列_年月週("2019/3/1", "2019/4/27") ' データの分だけ配列を拡張。 Dim SQC As SeaquenceClass Set SQC = New SeaquenceClass seq = SQC.ExtractArray2(seq, , rMax) Dim myKey As Long Dim c As Long Dim r As Long ' 各列の年月週が辞書に存在する場合、その値をセットする。 For c = 1 To UBound(seq, 2) myKey = seq(1, c) & Format(seq(2, c), "00") & Format(seq(3, c), "00") If Dict.Exists(myKey) Then For r = 1 To UBound(Dict.Keys) - 1 seq(r + 3, c) = Dict(myKey)(r) Next End If Next ' 年月から、重複するものを削除する。 For r = 1 To 2 For c = UBound(seq, 2) To 2 Step -1 If seq(r, c) = seq(r, c - 1) Then seq(r, c) = vbNullString End If Next Next ' 初期在庫。今回はコードに直接入力するが、実際には引数で受け取っても良い。 ' 一旦、配列を拡張して、そこに初期在庫をセットする。 ' ※存在しなかった0番を差し込むが、配列は1始まりで変わらないことに注意。 seq = SQC.ExtractArray2(seq, , , 0) For r = 4 To rMax seq(r, 1) = 10 Next ' 初期在庫と各週の入出庫情報から、各週の在庫数を算出。 For c = 2 To UBound(seq, 2) For r = 4 To rMax seq(r, c) = seq(r, c - 1) + seq(r, c) Next Next ' 不要な初期在庫列を除く。 seq = SQC.ExtractArray2(seq, , , 2) ' 編集を終えた配列を張り付けて、各行を書式設定。 With Range("B1").Resize(UBound(seq, 1), UBound(seq, 2)) .Value = seq ' 年の書式設定 .Rows(1).NumberFormatLocal = "0000年" ' 月の書式設定 .Rows(2).NumberFormatLocal = "0月" ' 週の書式設定 .Rows(3).NumberFormatLocal = "第0週" End With End Sub
結果、↓ このようになった。
今までは、各週の入出庫情報が記されているだけで、つまりは前の週との相対関係しかわからなかったが、これで各週の在庫が絶対値として分かるようになった。後は、例えば各々の果物で
「在庫が10個を下回ったら、20個発注する」
のように安全在庫の発注点を決めておけば、それなりの管理が出来そうだ。
ということで、今回のシリーズはこれでおしまいです。
参考まで。