复杂的如果。 Excel 中的公式
Complex IF. formula in Excel
我查看了有关 IF 公式的各种帖子,但找不到在我的报告中获得正确结果的方法。我管理交货,我想根据交货报告中的数据计算延迟天数。诀窍在于延迟将取决于交付状态,因为在每种情况下我都必须考虑 Excel 中的不同日期和列。这些是数据:
交货状态:
- 确认
- 已卸载
- 正在卸载
- 未确认
- 开始
- 在途中
- 等待取件
- 准备好
此交付状态在我的原始数据报告的 C 列中更新。对于每一个,我都必须以不同的方式计算延迟,因此我认为 IF 公式可能有用。
您可以在下面看到包含计算相关日期的列:
交货状态和参考日期:
- 已确认 - D
- 卸载 - D
- 卸载-D
- 未确认 - S
- 开始 - D
- 在路线中 - S
- 等待取件 - E
- 准备 - 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。
我查看了有关 IF 公式的各种帖子,但找不到在我的报告中获得正确结果的方法。我管理交货,我想根据交货报告中的数据计算延迟天数。诀窍在于延迟将取决于交付状态,因为在每种情况下我都必须考虑 Excel 中的不同日期和列。这些是数据:
交货状态:
- 确认
- 已卸载
- 正在卸载
- 未确认
- 开始
- 在途中
- 等待取件
- 准备好
此交付状态在我的原始数据报告的 C 列中更新。对于每一个,我都必须以不同的方式计算延迟,因此我认为 IF 公式可能有用。
您可以在下面看到包含计算相关日期的列:
交货状态和参考日期:
- 已确认 - D
- 卸载 - D
- 卸载-D
- 未确认 - S
- 开始 - D
- 在路线中 - S
- 等待取件 - E
- 准备 - 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。