分享

Excel列表数据处理:另类筛选 - Excel函数式编程

 ExcelEasy 2024-07-19 发布于北京


继续介绍列表数据处理。

在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)    )
这里,我们使用了MAP函数对列表进行循环。
调用示例

下面是一个调用的例子

=myFilter(A2:A6, LAMBDA(x, x <> "b"))

使用多个条件,

=myFilter(A2:A6, LAMBDA(x, AND(x <> "b", x <>"a")))
讨论

现在的实现方案中,我们使用MAP函数循环列表数据。

这就导致这个筛选函数只能用于单列数据。如果有多列数据,就不能满足我们的期望。

此时,就需要使用其他循环函数了。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多