复杂的如果。 Excel 中的公式

Complex IF. formula in Excel

我查看了有关 IF 公式的各种帖子,但找不到在我的报告中获得正确结果的方法。我管理交货,我想根据交货报告中的数据计算延迟天数。诀窍在于延迟将取决于交付状态,因为在每种情况下我都必须考虑 Excel 中的不同日期和列。这些是数据:

交货状态:

  1. 确认
  2. 已卸载
  3. 正在卸载
  4. 未确认
  5. 开始
  6. 在途中
  7. 等待取件
  8. 准备好

此交付状态在我的原始数据报告的 C 列中更新。对于每一个,我都必须以不同的方式计算延迟,因此我认为 IF 公式可能有用。

您可以在下面看到包含计算相关日期的列:

交货状态和参考日期:

  1. 已确认 - D
  2. 卸载 - D
  3. 卸载-D
  4. 未确认 - S
  5. 开始 - D
  6. 在路线中 - S
  7. 等待取件 - E
  8. 准备 - S

我按照下面的公式做了这个公式,遗憾的是,只有第一条记录计算正确,其余的延迟是"null"。

=IF(C2="Confirmed";(TODAY()-D2);IF(C2="Unloaded";(TODAY()-D2);IF(C2="Unloading";(TODAY()-D2);IF(C2="Not confirmed";(TODAY()-S2);IF(C2="Started";(TODAY()-D2);IF(C2="In route";(TODAY()-S2);IF(C2="Pick-up pending";(TODAY()-E2);IF(C2="Prepared";(TODAY()-S2);"null"))))))))

您是否知道我在哪里犯了我没有看到的错误?我将不胜感激任何帮助。如果它也相关,我正在使用 Excel 2016.

将其分解,使长行变得可读。

=IF(C2="Confirmed";
     (TODAY()-D2);
     IF(C2="Unloaded";
       (TODAY()-D2);
       IF(C2="Unloading";
         (TODAY()-D2);
         IF(C2="Not confirmed";
            (TODAY()-S2);
            IF(C2="Started";
              (TODAY()-D2);
              IF(C2="In route";
                (TODAY()-S2);
                IF(C2="Pick-up pending";
                  (TODAY()-E2);
                  IF(C2="Prepared";
                    (TODAY()-S2);
                    "null"
                  )
                )
              )
            )
          )
        )
      )
    )

乍一看,我这里看的基本上是一个垂直的查找表。

所以,我创建了这两个列。一个是我们正在寻找的文本状态。
另一个是计算日期。

单日期VLOOKUp

假设 D2、S2 和 E2 是固定字段我制定了公式 =TODAY() - $D

那么在正确的字段中进行 VLOOKUP 就很简单了。
因为我们正在处理日期类型字段,所以我们需要将数字转换为文本以获得有意义的完整日期。 (我在屏幕截图中使用 JJ 多年,因为我有荷兰语言环境)
然后我们还需要处理 VLOOKUP 找不到任何东西的情况,为此我们使用 IFERROR。

=IFERROR(TEXT(VLOOKUP(F6;$A:$B;2);"MM-DD-YY");"NULL")

现在您有一个易于扩展的查找 table 您可以放在任何地方,隐藏在工作人员选项卡上等。您可以在其中计算您的值,您可以在其中添加和删除值。

很多行,很多日期

但是,假设您有许多具有不同状态和日期的行,并且您想知道需要多少天。那么这个垂直查找看起来就没那么有用了,因为它只能用于一行。

我们仍然可以利用 VLOOKUP 让我们的生活更轻松一些

假设 D、E 和 S 列中有日期

=IFERROR(DATEDIF(TODAY();INDIRECT(ADDRESS(ROW();VLOOKUP(F2;$A:$B;2;FALSE)));"d");"NULL")

我们使用 VLOOKUP 来查看我们需要查找的列。我们在这里使用数字作为列,而不是字母。
然后,我们使用 ADDRESS 获取当前 ROW() 的 excel 地址引用,以及我们通过 vlookup
找到的列 我们通过 INDIRECT 汇集它,以便我们可以从目标单元格中​​获取值。
然后我们从今天的偏移量中得到一个以天为单位的 DATEDIFerence。 我们将其全部包装在一个 IFERROR 中以保持干净。

  • 您可以使用 INDEX($D2:$S2;0;VLOOKUP($F2;$A:$B;2;FALSE)) 来获得相同的效果,正如 Dirk Reichel 所指出的,但是您必须注意所使用的索引是从矩阵范围。所以这里矩阵从 D 行开始。所以 D2 是索引 1 而不是 4 它是我原来的方法,所以你需要相应地调整查找 table。