【问题标题】:Excel 2007 VBA If-THEN-ELSE Shipping LogisticsExcel 2007 VBA If-THEN-ELSE 航运物流
【发布时间】:2013-06-13 15:17:16
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您对 Excel 公式有多少经验?您不需要 VBA。
  • 使用纯 excel 电子表格函数,然后使用 Range() 将结果输入 VBA 不是更容易吗?
  • 我会说我的 Excel 经验一般。如果您有不使用 VBA 的解决方案,我也将不胜感激。

标签: excel excel-2007 logistics vba


【解决方案1】:

您可以将以下所有内容嵌套到单个列中,但我将逐步执行此操作,假设每个步骤都有新列。我假设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。我们正在做的是使用TIME(HOUR(B2),MINUTE(B2),SECOND(B2))B2 的日期+时间值中获取时间,并查看它是否大于(晚于)上午11:59 TIME(11,59,0)。当 B2 晚于 11:59 时,我们使用 DATE(YEAR(B2),MONTH(B2),DAY(B2)) 取消日期+时间的时间,并添加 1 天 +1 并返回。如果时间早于 11:59,那么我们只返回当前日期。

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

【讨论】:

  • 这可能会使您的美国订单提前 3 天。您可以通过将其放在 IF(b2<>"USA" 子句中来更正 D 列中的问题
  • 这很好用,但问题比我最初想象的要多。发货的截止日期与发货日期不同。我将在编辑后的问题中解释。
  • @Newbie1331 使用附加的 IF 语句来适应 D 列中的截止时间应该相对容易。
  • 你能给我看一个例子吗,我无法理解公式的逻辑。我从未使用公式来更改 Excel 中的日期。
【解决方案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")))

【讨论】:

  • 这不能正确处理当日订单,例如在 OP 的示例中。
【解决方案3】:

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

【讨论】:

  • 当我最初看到杰克的回答没有处理当天的案件时,我写了这个。如果您喜欢公式,Dean MacGregor 的答案很可能是您正在寻找的答案。添加此内容以防任何人更喜欢 VBA 解决方案,以便在工作表中保持清晰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
相关资源
最近更新 更多