我可以将 IF 函数嵌套在 Filter 函数中吗?

Can I nest the IF function inside of the Filter Function?

提问人:Ilyas Esa 提问时间:10/23/2023 最后编辑:Ilyas Esa 更新时间:10/24/2023 访问量:124

问:

我可以将 IF 或任何其他函数嵌套在 FILTER 函数中,以便在 J 列中返回 1 而不是 GBP,并在 B 列中返回 LON 而不是 LONDON 吗?enter image description here

excel if 语句 excel-formula filter函数

评论

0赞 Mayukh Bhattacharya 10/23/2023
如果不是,值应该是多少?另外,当您已经有 5 列要返回时,为什么要使用?FALSEGBPCHOOSECOLS()
0赞 Dominique 10/23/2023
是的,你可以:-)
0赞 Mayukh Bhattacharya 10/23/2023
您可以使用这样的公式 --> 虽然不确定为什么要在这里使用,但我也建议使用 aka 而不是使用整个范围,这样可以避免迭代空白行并使 excel 引擎工作得更快。=CHOOSECOLS(FILTER(IF(A:E="GBP",1,A:E),(A:A="MS")*(E:E<>0)),1,2,3,4,5)CHOOSECOLS()Structured ReferencesTables
0赞 Ilyas Esa 10/23/2023
谢谢,这个有效 =CHOOSECOLS(FILTER(IF(A:E=“GBP”,1,A:E),(A:A=“MS”)*(E:E<>0)),1,2,3,4,5) 我不打算返回 B 列,所以这就是为什么但忘记排除它。因此,我可以将包含 GBP 的列返回为 1,然后我是否可以向其添加另一列,以便将列 D 返回为 1 并将列 B 返回为 LON?
1赞 Dominique 10/23/2023
请尽量避免两次问同一个问题 我可以将 IF 或任何其他函数嵌套在 Filter 函数中吗?

答:

0赞 Rashed Ul Alam 10/23/2023 #1

我认为提供的公式会像它看起来一样工作

=LET(
    f, FILTER(
        A2:E25,
        (A2:A25 = "MS") *
            (E2:E25 <> 0)
    ),
    IFS(
        f = "LONDON",
        "LON",
        f = "GBP",
        1,
        f <> "",
        f
    )
)

让我一步一步地分解公式:

1.

=LET(f, FILTER(A2:E25, (A2:A25="MS") * (E2:E25<>0))

变量 f 被分配了 FILTER 函数的结果。

FILTER 函数用于从满足两个条件的 A2:E25 范围内提取行:

A 列 (A2:A25) 中的相应单元格等于“MS”。

E 列 (E2:E25) 中的相应单元格不等于 0。

两个条件之间的乘法运算符 (*) 充当逻辑 AND,这意味着这两个条件都必须为真,才能将行包含在结果中。

2.

IFS(f="LONDON", "LON", f="GBP", 1, f<>"", f)

如果 f 等于 “LONDON”,则返回 “LON.

如果 f 等于“GBP”,则返回 1。

如果 f 不为空(即,它与前面的任何条件都不匹配),则返回 f。

希望对你有帮助。

0赞 DjC 10/24/2023 #2

根据我们在上面的评论中的讨论,通过将函数嵌套在另一个函数中来操作函数的结果会更有效,而不是尝试操作整个数据集。在这种情况下可以工作的一个函数是:FILTER()SWITCH()

=LET(
arr, FILTER(A2:E1000, (A2:A1000="MS")*(E2:E1000<>0)),
SWITCH(arr, "GBP", 1, "LONDON", "LON", arr))

SWITCH()查看筛选数组中的每个值,并将找到的任何匹配值替换为其相应的结果。匹配值和结果成对输入,总共最多可以包括 126 对。最后一个可选参数是未找到匹配项时返回的默认值,在本例中为筛选数组中存在的原始值。此外,仅执行完全匹配,因此不能使用通配符或比较运算符。SWITCH()

上述公式是快速简便的方法,适用于您提供的示例数据;但是,如果“GBP”和/或“LONDON”出现在多个列中,则可能容易出现错误。此外,如果您的实际数据集在“地址”列中包含多个城市名称(即:伯明翰、格拉斯哥、利物浦等),则管理值列表及其相应的结果可能会变得非常麻烦。因此,更合适的做法是确定要操作的筛选数组中的特定列,并对每个单独的列执行适用的操作:SWITCH()

=LET(
arr, FILTER(A2:E1000, (A2:A1000="MS")*(E2:E1000<>0)),
add, LEFT(INDEX(arr,,2), 3),
cur, SWITCH(INDEX(arr,,4), "GBP", 1, "EUR", 2, "USD", 3),
CHOOSECOLS(HSTACK(arr, add, cur), 1, 6, 3, 7, 5))

在此示例中,用于通过省略 row_num 参数并将column_num设置为 2 来标识整个“Address”列,并用于仅返回每个值的前 3 个字母。“货币”列的标识方式与column_num 4相同,用于用数值替换货币代码。如果您的数据集仅包含有限数量的货币代码,则此方法有效。在这种情况下,我没有指定最终的默认值参数,因此如果存在新代码(即:“CAD”),则将返回,并且您会知道需要使用额外的值和结果对更新公式。INDEX()LEFT()SWITCH()SWITCH()#N/A

HSTACK()然后用于创建一个由筛选后的数组以及新的“add”和“cur”列(总共 7 列)组成的新数组,并用于将原始列 2 替换为新列 6,以及将 4 替换为 7。就是这样!CHOOSECOLS()

顺便说一句,我不喜欢使用像 这样的整个列引用,因为这会显着降低工作簿的整体性能(在引用的列中输入新值时,您可能会注意到滞后或犹豫)。结构化表是理想的选择,因为列引用是动态的,并且在添加新记录时会自动展开。但是,如果您更喜欢标准范围引用,我强烈建议使用合理数量的行,这些行延伸到现有数据下方足够远,以允许增长。例如:如果你只处理几百行数据,那么就足够了,而且它比(这就是引用的)要高效得多。A:EA:AE:EA2:E1000A2:A1000E2:E1000A1:E1048576A:E

干杯!