|
具体的な例を示すと言うことは例えばこんなことです。
休日テーブルは下記のとおりとする
A列
1 2017/12/2
2 2017/12/3
3 2017/12/9
4 2017/12/10
5 2017/12/16
6 2017/12/17
7 2017/12/23
8 2017/12/24
9 2017/12/28
10 2017/12/29
希望納期 2017/12/28 は休日であった。
実際の納期は、それの直前の稼働日である 27 になる。
リードタイムを3日とすると、
さらに3日遡った稼働日である、22日となる。
21
22 ←求める日
23 休日
24 休日
25
26
27 ← 納期
28 休日 ← 希望納期
------------------
仮に以上のようなことだとすると、以下のコードでどうか。
微修正はそちらで願いたい。
(B1セルに 2017/12/28 が入力されているとします)
Sub test()
Dim myAry As Range
Set myAry = Range("A1:A10")
Debug.Print myDay(Range("B1"), 3, myAry) '→ 2017/12/22 が出力される
End Sub
Function myDay(stDay As Range, myVal As Long, myAry As Range) As Date
'stDay = 納期希望日
'myVal = リードタイム
'MyAry = 定休日データ
Dim k As Long, j As Long
Dim 納期 As Date
Dim d As Date
d = stDay.Value
'(1)直前の稼働日を納期とする
k = 0
Do
If WorksheetFunction.CountIf(myAry, d - k) = 0 Then
納期 = d - k
Exit Do
End If
k = k + 1
Loop
'(2) リードタイムの考慮
k = 1
Do
If WorksheetFunction.CountIf(myAry, 納期 - k) = 0 Then
j = j + 1
If j = myVal Then
myDay = 納期 - k
Exit Function
End If
End If
k = k + 1
Loop
End Function
|
|