【问题标题】:Filter an excel range based on multiple dynamic filter conditions (with column values delimited)根据多个动态过滤条件过滤 Excel 范围(列值分隔)
【发布时间】:2022-09-27 20:57:26
【问题描述】:

我发布了一个类似的问题:Filter an excel range based on multiple dynamic filter conditions。现在我正在考虑一种更一般的情况,即对于过滤器列之一(Releases,列E),它可能有几个用逗号分隔的值。预期结果应按具有发布值的行过滤:AB,但发布列可以带有多个值,并且对于团队过滤器按特定的一个或全部(ALL 通配符)。

这是示例(当我们的发布列最多有两个值时):

我能够根据过滤条件获得所需的结果,但它需要辅助列(列:J,K,L),通过N3 中的公式:

=FILTER(D3:H15, (IF(B3=\"ALL\", D3:D15<>\"*\",D3:D15=B3)) * (L3:L15))

和列L 神奇地识别具有所需释放值的行:

=LET(result, ISNUMBER(MATCH(J3:K15,TEXTSPLIT(B4,\", \"),0)), IF((FILTER(result, {1,0}) 
+ FILTER(result, {0,1}))>0, TRUE, FALSE))

我正在寻找一个解决方案不需要辅助列也为Release 列可以有两个以上值的一般情况,例如:A, C, G, F... 如果可能的话。

这是我的示例文件的链接:

https://1drv.ms/x/s!AlZxw2GG3C7Ihyyx8_AM5ylbZWaI?e=F3WUep

笔记:

  1. 我不能在单个调用中使用TEXTSPLIT来获取列J,K,因为当文本输入参数是一个数组(范围)时,没有办法用空字符串分隔,所以TEXTSPLIT(E3:E15,\",\")不会返回两列(它适用于单个单元格,但不适用于范围),所以我必须使用TEXTAFTER(E3:E15,\",\") 来获取列K 中逗号后的信息
  • 为什么没有C, A 在您的结果列表中,因为它有A
  • 真的@Harun24hr 它应该是其中的一部分。我会审查它。谢谢
  • 我已经纠正了@Harun24hr

标签: excel excel-formula


【解决方案1】:

我们试试看-

=FILTER(D3:H15,BYROW(E3:E15,
  LAMBDA(x,MAX(--ISNUMBER(XMATCH(TOCOL(TEXTSPLIT(x,",")),
  TOCOL(TEXTSPLIT(B4,", ")),0)))))
 * IF(B3="ALL",D3:D15<>"",D3:D15=B3))

确定是否存在释放值的解决方案说明:

它使用BYROW 函数,该函数通过您定义的LAMBDA 函数处理每一行。

公式:TOCOL(TEXTSPLIT(B4,", ")

生成一个值为B4 的列数组,即:{A;B}(分号表示列数组)在我们的例子中是一个 2x1 数组。 TEXTSPLIT 通过分隔符 (", ") 吐出一个字符串。

公式:TOCOL(TEXTSPLIT(x,", "))

为由分隔符 (", ") 拆分的 x 表示的值生成数组列。例如,如果 x 是:A,它将生成:{A},对于 A,C,输出将是:{A;C},即 2x1 数组。

带有签名的XMATCH 函数:XMATCH(lookup_value, lookup_array, 0)

当找到与look_value 完全匹配时,将返回lookup_array 的索引位置,否则返回N/A。如果lookup_value 是列数组,则XMATCH 函数会为数组的每个元素求值,并在列数组中返回结果。

对于lookup_array:{A;B},它将根据以下输入值产生以下输出:

|查找值 |结果 |

|{A} | {1} |
|{A;C} | {1;不适用} | |{C;D} | {不适用;不适用} | |{A;B} | {1;2} | |{B;A} | {2;1} | |{B;A;C} | {2;1;N/A} | |{C} | {不适用} |

在我们的例子中:

XMATCH(TOCOL(TEXTSPLIT(x,", ")),TOCOL(TEXTSPLIT(B4,", ")),0)

将为每个版本返回值(x)({A}{A;B}{A;C} 等)一个大小为x 的数量或元素的列数组,表示{A, B} 的行位置(如果匹配)或N/A(未找到)x 的每个元素。

ISNUMBER 将结果转换为TRUE(如果匹配)或FALSE(对于N/A)。 --ISNUMBER(cell) 将结果转换为1(匹配)或0(对于N/A)。最后MAX函数返回1如果至少有一个匹配,否则0

因为BYROW 为每一行处理LAMBDA 函数,所以它为E3:E15 的每一行返回1(至少一个匹配)或0(不匹配)。

=BYROW(E3:E15,LAMBDA(x,
MAX(--ISNUMBER(XMATCH(TOCOL(TEXTSPLIT(x,", ")),
TOCOL(TEXTSPLIT(B4,", ")),0)))))

这就是我们需要的过滤条件

笔记:您可以使用MATCH 函数而不是XMATCH,但请记住,对于第三个输入参数,默认行为是不同的。 MATCH 的默认值为1(小于或等于lookup_value 的最大值),XMATCH 的默认值为0(完全匹配)。

【讨论】:

  • 谢谢@Harun24r 它甚至适用于一般情况,我更改了值:C, DC, D, A 并且它有效
  • @DavidLeal 很高兴知道!如果您发现它有效,请接受它(勾选答案)。
  • 我接受了你的解决方案。当我试图理解它时,我还记录了你的答案。我从你的回复中学到了很多。对于其他类似的excel问题,这确实是一种很好的技术。
猜你喜欢
  • 2018-09-16
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 2020-04-12
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多