0

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

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

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

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

4

3 回答 3

2

您可以将以下所有内容嵌套到单个列中,但我将逐步执行此操作,假设每个步骤都有新列。我假设order typecolumn Aorder datecolumn Btarget ship datecolumn C

您要做的第一件事是制定一个有效的订单日期,该日期从订单日期中剔除时间,如果晚于发货时间,则添加一天,我们会将其放入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。我们正在做的是从使用的日期+时间值中获取时间,B2TIME(HOUR(B2),MINUTE(B2),SECOND(B2))查看它是否大于(晚于) 11:59am TIME(11,59,0)。当 B2 晚于 11:59 时,我们从日期+时间中取出时间DATE(YEAR(B2),MONTH(B2),DAY(B2))并添加 1 天+1并返回。如果时间早于 11:59,那么我们只返回当前日期。

TIME(11,59,0)您可以通过将语句的一部分更改为IF您想要的任何时间来更改截止时间。如果每个不同值的截止值不同,则可以将订单类型包含TIME(11,59,0)在一个IF语句中(实际上它将是 2-3 个 if 语句,因为存在三种可能性。作为替代方案,如果您有很多订单类型或您的截止日期将来可能会发生变化,您可以制作一个查找表,然后使用该VLOOKUP语句而不是将时间硬编码在公式本身中。

于 2013-06-13T17:32:18.440 回答
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")))

于 2013-06-13T16:46:21.377 回答
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
于 2013-06-13T18:05:33.713 回答