Excel 2007 VBA If-THEN-ELSE航运物流

时间:2013-06-13 15:17:16

标签: excel excel-vba excel-2007 logistics vba

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

每种订单类型仅在特定日期发货。

  • 美国订单类型可在订单日期后2天发货,
  • USAPriority在订购日期后的第二天发货。
  • 如果在星期三上午11点59分收到,加拿大订单将在每周的星期四发货,
  • 如果在星期二上午11:59之前收到,Med订单将在每周的星期三发货。

我想编写一个代码,根据订单类型和订单日期生成目标发货日期。

3 个答案:

答案 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 typecolumn Aorder datecolumn Btarget ship datecolumn 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")))函数有三个参数:TIMEHourMinute。我们正在做的是使用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