繼續介紹列表數據處理。 在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函數循環列表數據。 這就導致這個篩選函數只能用于單列數據。如果有多列數據,就不能滿足我們的期望。 此時,就需要使用其他循環函數了。 |
|