F列(累計生産時間)が2番目のシートの何行目に相当するかを表示しています
2番目のシートD列のとおり、この生産ラインの稼働時間は1日480分です(5月8日は240分)
1番目のシート5行目を参照願います。累計生産時間は840分ですから2日目に完了しますが
これを算出する簡単な関数がないのです
VLOOKUP関数ではG5でSheet2のB列を検索した場合
=VLOOKUP(F5,Sheet2!B:C,2,1) では1日前の4月27日が算出されてしまいます
もし下記のような式が認められれば 4月28日が算出できるのですが、残念ながら
そのような式は認められていません。
=VLOOKUP(F5,Sheet2!B:C,2,-1)
F5の値と同じ値がなかった場合、その値より大きい最小の値を求めるには
Match関数しかないのです
結局G5には次のような式が入ります。Matchには上記機能がありますがその代わり
参照する対象列が降順にソートされている必要があるのです
そこであらかじめSheet2のB:C列をF:G列にコピーして降順ソートしておきます。
=INDEX(Sheet2!G:G,MATCH(F5,Sheet2!F:F,-1))
実際にはここはメンテナンス漏れの危険性が大きいため、シートチェンジを
イベントとしてイベントプロシージャを組み込みます
J列 =VLOOKUP(F5,Sheet2!B:B,1,1)
前日までの作業時間を算出します
K列 =F5-J5
累計作業時間から前日までの作業時間を引いて当日作業時間(分)を求めます
L列 =VLOOKUP(K4,Sheet3!A:B,2,0)
当日の作業分数から終了時間を求めます
昼休みや休憩時間を加味するために完了時間のテーブルを参照します
1分1行設定しなければいけませんが最大で1440行です 24X60分
残業を加味して最大時間数で設定願います
実際に各日何分稼働するかSheet2のD列でコントロールします
ご要望があればメールで要求して頂ければ元のシートを転送致します
(不特定多数の方にマクロファイルのリンクを張るのははばかれますので控えさせて頂きます)
カレンダー(Sheet2)を1件ずつ読み込み、その操業分で生産可能な手配にその日をセットします
もしその日に終わらなければ1行追加(挿入)して、生産仕切れなかった時間を翌日に繰り越します。
生産数量は操業分数とタクトタイムで逆算します。
上記表をピポットテーブル機能で編集
Sub TEST27()
Dim i, j, k, MaxRow, Max2 As Long
Dim W_CDAY As Date
Dim W_CFUN, W_CSEQ As Long
'計算結果ファイルの初期クリアー
Sheets("Sheet5").Select
MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
Range("A2:Z" & MaxRow).Clear
'スケジュールシートを計算結果ファイルにコピーする
Sheets("Sheet1").Select
MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
Range("A3:E" & MaxRow).Copy Sheets("Sheet5").Range("A1")
''操業カレンダーファイルの初期参照
Sheets("Sheet2").Select
k = 3
If Cells(k, "D") = 0 Then Exit Sub
W_CDAY = Cells(k, "C")
W_CFUN = Cells(k, "D")
Range("C1").Copy Sheets("Sheet5").Range("F1")
'計算ファイルに対する処理
Sheets("Sheet5").Select
MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
i = 2
Do While i <= MaxRow
'該当する手配の所要ninitsがカレンダーのminitsより多かった場合
If Cells(i, "E") > W_CFUN Then
j = i + 1
Rows(j).Insert
MaxRow = MaxRow + 1
Cells(j, "A") = Cells(i, "A") '次行製造手配番号
Cells(j, "B") = Cells(i, "B") '次行製品名
Cells(j, "D") = Cells(i, "D") '次行TACT
Cells(j, "E") = Cells(i, "E") - W_CFUN '次行作業分数繰り越し
Cells(i, "E") = W_CFUN 'この行のminits
Cells(i, "F") = W_CDAY 'この行の日付
Cells(i, "C") = Cells(i, "E") / Cells(i, "D") 'この行の生産数量
W_CFUN = 0
'該当する手配の所要minitsがカレンダーのminits以下だった場合
Else
W_CFUN = W_CFUN - Cells(i, "E") 'この日に使えるminitsを減算する
Cells(i, "F") = W_CDAY
Cells(i, "C") = Cells(i, "E") / Cells(i, "D")
End If
' 当該日のminitsを使い果たしたら、翌日を参照する
If W_CFUN = 0 Then
Sheets("Sheet2").Select
k = k + 1
W_CDAY = Cells(k, "C")
W_CFUN = Cells(k, "D")
Sheets("Sheet5").Select
End If
i = i + 1
Loop
End Sub