我有一个包含3列的电子表格:order type
,order date
和target ship date
。共有4种订单类型:USA
,USAPriority
,Canada
和Med
。
每种订单类型仅在特定日期发货。
我想编写一个代码,根据订单类型和订单日期生成目标发货日期。
答案 0 :(得分:2)
这是一个没有VBA的简单解决方案。假设您的三列是A,B和C,请将此公式放在C列的顶部,然后双击右下角将其向下拖动。
=IF(A2="USA",B2+2,IF(A2="Canada",(B2+(7-WEEKDAY(B2,2)+4)),IF(A2="Med",(B2+(7-WEEKDAY(B2,2)+3)),"Invalid order type")))
答案 1 :(得分:2)
您可以将以下所有内容嵌套到一个列中,但我会逐步为每个步骤设置新列。我假设order type
为column A
,order date
为column B
,target ship date
为column C
。
您要做的第一件事就是制作一个有效的订单日期,它会消除订单日期之外的时间,如果它晚于发货时间则会增加一天,我们会将其放入{{1} }。这看起来像column D
然后,您可以使用此公式=IF(TIME(HOUR(B2),MINUTE(B2),SECOND(B2))>TIME(11,59,0),DATE(YEAR(B2),MONTH(B2),DAY(B2))+1,DATE(YEAR(B2),MONTH(B2),DAY(B2)))
编辑:详细阐述D栏的工作原理:
=IF(A2="USA",B2+2,IF(A2="Med",IF(WEEKDAY(D2)>4,D2+7-WEEKDAY(D2)+4,D2+4-WEEKDAY(D2)),IF(A2="Canada",IF(WEEKDAY(D2)>5,D2+7-WEEKDAY(D2)+5,D2+5-WEEKDAY(D2)),"Invalid")))
函数有三个参数:TIME
,Hour
和Minute
。我们正在做的是使用Second
获取B2
的日期+时间值,并查看它是否(晚于)上午11:59 TIME(HOUR(B2),MINUTE(B2),SECOND(B2))
更长。当B2晚于11:59时,我们使用TIME(11,59,0)
取消日期+时间的时间并添加1天DATE(YEAR(B2),MONTH(B2),DAY(B2))
并返回。如果时间早于11:59,那么我们只返回当前日期。
您可以通过将+1
语句的TIME(11,59,0)
部分更改为您想要的任何时间来更改截止时间。如果每个不同的值的截止值不同,那么顺序类型可以在IF
语句中包含TIME(11,59,0)
(如果有语句,那么它实际上是2-3,因为有三种可能性。作为替代,如果您有很多订单类型或者您的截止日期可能会在将来发生变化,您可以创建一个查找表,然后使用IF
语句,而不是在公式本身中对时间进行硬编码。
答案 2 :(得分:0)
VBA解决方案
将此代码插入模块并使用函数targetShipDate(orderType,orderDate)获取目标发货日期。
Function targetShipDate(orderType As String, orderDate As Date)
Select Case orderType
Case "USA"
targetShipDate = nextUsaShipDate(orderDate)
Case "Canada"
targetShipDate = nextCanadaShipDate(orderDate)
Case "Med"
targetShipDate = nextMedShipDate(orderDate)
Case Else
targetShipDate = Null
End Select
End Function
Function nextCanadaShipDate(d As Date)
nextCanadaShipDate = d - Weekday(d) + 5 + IIf(Weekday(d) >= 5, 7, 0)
If Weekday(d) = 5 And Hour(d) <= 11 Then
nextCanadaShipDate = nextCanadaShipDate - 7
End If
End Function
Function nextMedShipDate(d As Date)
nextMedShipDate = d - Weekday(d) + 4 + IIf(Weekday(d) >= 4, 7, 0)
If Weekday(d) = 4 And Hour(d) <= 11 Then
nextMedShipDate = nextMedShipDate - 7
End If
End Function
Function nextUsaShipDate(d As Date)
nextUsaShipDate = d + 2
End Function