继续介绍列表数据处理。 在Excel中,如果我们需要列出列表中满足条件的记录,可以使用FILTER函数,比如: =FILTER(A2:A6,A2:A6<>"b") 筛选的就是第一列数据中不等于b的那些元素。 这个函数提供了很大的便利。但是有一点麻烦的地方,那就是我们必须了解需要筛选的结构,因为在定义条件时你必须知道是对哪个具体区域定义的,也就是说,在第二个参数追踪必须包含完整的条件区域,比如, A2:A6<>"b" 在实际工作中场景中,我们运用筛选时,可能未必对其中数据的内部框架结构了解得那么清楚。因此,在定义条件时,我们更愿意不去涉及具体区域。 上面的筛选需求,如果要使用文字描述的话,我们可以这么说: 筛选区域中那些不等于“b”的元素。 这里,我们使用那些代表需要设置条件的区域,这就规避了对区域的引用。 实际上,在Power Query的M语言中,就有一个LIST.SELECT函数,使用的就是类似的方案。 我们今天就在Excel中实现这个功能。 我们的方案相当简单,使用一个自定义函数表示筛选条件: select_func(x) 这里的x就是我们在上文中的“那些”,然后循环检查待筛选列表中的每一个元素,如果符合返回true,否则,返回false。 这样我们就可以得到一个逻辑值数组。 用这个数组对列表进行筛选即可。 实现代码很简单: /** 选取满足条件的元素*/myFilter = LAMBDA(list, select_func, LET( cond, MAP(list, LAMBDA( a, select_func(a) )), FILTER(list, cond) ) 下面是一个调用的例子 =myFilter(A2:A6, LAMBDA(x, x <> "b")) 使用多个条件, =myFilter(A2:A6, LAMBDA(x, AND(x <> "b", x <>"a"))) 现在的实现方案中,我们使用MAP函数循环列表数据。 这就导致这个筛选函数只能用于单列数据。如果有多列数据,就不能满足我们的期望。 此时,就需要使用其他循环函数了。 |
|