Excel 2007 VBA If-THEN-ELSE发货物stream

我有一个包含3列的电子表格: order typeorder datetarget ship date 。 有四种订单types: USAUSAPriorityCanadaMed

每种订单types只在特定date发货。

  • 美国订单types可以在订单date后两天发货,
  • USAPriority在订单date后的第二天发货。
  • 如果星期三上午11:59收到加拿大的订单,
  • 如果星期二上午11:59收到Med订单,Med订单将在每周星期三发货。

我想编写一个代码,根据订单types和订单date生成目标出货date。

您可以将以下所有内容嵌套到一个列中,但是我会一步一步假设每个步骤都有新的列。 我假设order typecolumn Aorder datecolumn Btarget ship datecolumn C

您要做的第一件事就是创build一个有效的订单date,将订单date从订单date中删除,如果晚于发货时间,则添加一天,我们将把它放在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)))

你可以用这个公式=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")))

编辑:详细说明列D如何工作:

TIME函数有三个参数: HourMinuteSecond 。 我们正在做的是使用TIME(HOUR(B2),MINUTE(B2),SECOND(B2))来获取时间超出B2的date+时间值,并且看是否比上午11:59更长TIME(11,59,0) 。 当B2晚于11:59时,我们从DATE(YEAR(B2),MONTH(B2),DAY(B2))取出date+时间的时间,并添加1天+1并返回。 如果时间早于11:59,那么我们只返回当前date。

您可以通过将IF语句的TIME(11,59,0)部分更改为任意时间来更改截止时间。 如果对于每一个不同的值,截止值是不同的,那么ordertypes可以在一个IF语句中包含TIME(11,59,0) (如果语句有三种可能性,您有很多订单types,或者您的截止date在将来可能会更改,您可以创build一个查找表,然后使用VLOOKUP语句而不是在公式本身中硬编码的时间。

这是一个没有VBA的简单解决scheme。 假设你的三列是A,B和C,把这个公式放在列C的顶部,然后双击右下angular将它拖下来。

=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")))

VBA解决scheme

将此代码插入到模块中,并使用函数targetShipDate(orderType,orderDate)获取目标出货date。

 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