提问人:Ilyas Esa 提问时间:10/23/2023 最后编辑:Ilyas Esa 更新时间:10/24/2023 访问量:124
我可以将 IF 函数嵌套在 Filter 函数中吗?
Can I nest the IF function inside of the Filter Function?
答:
我认为提供的公式会像它看起来一样工作
=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。
希望对你有帮助。
根据我们在上面的评论中的讨论,通过将函数嵌套在另一个函数中来操作函数的结果会更有效,而不是尝试操作整个数据集。在这种情况下可以工作的一个函数是: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:E
A:A
E:E
A2:E1000
A2:A1000
E2:E1000
A1:E1048576
A:E
干杯!
评论
FALSE
GBP
CHOOSECOLS()
=CHOOSECOLS(FILTER(IF(A:E="GBP",1,A:E),(A:A="MS")*(E:E<>0)),1,2,3,4,5)
CHOOSECOLS()
Structured References
Tables