繼續(xù)介紹列表數(shù)據(jù)處理。 在Excel中,如果我們需要列出列表中滿足條件的記錄,可以使用FILTER函數(shù),比如: =FILTER(A2:A6,A2:A6<>"b") 篩選的就是第一列數(shù)據(jù)中不等于b的那些元素。 這個函數(shù)提供了很大的便利。但是有一點麻煩的地方,那就是我們必須了解需要篩選的結(jié)構(gòu),因為在定義條件時你必須知道是對哪個具體區(qū)域定義的,也就是說,在第二個參數(shù)追蹤必須包含完整的條件區(qū)域,比如, A2:A6<>"b" 在實際工作中場景中,我們運用篩選時,可能未必對其中數(shù)據(jù)的內(nèi)部框架結(jié)構(gòu)了解得那么清楚。因此,在定義條件時,我們更愿意不去涉及具體區(qū)域。 上面的篩選需求,如果要使用文字描述的話,我們可以這么說: 篩選區(qū)域中那些不等于“b”的元素。 這里,我們使用那些代表需要設(shè)置條件的區(qū)域,這就規(guī)避了對區(qū)域的引用。 實際上,在Power Query的M語言中,就有一個LIST.SELECT函數(shù),使用的就是類似的方案。 我們今天就在Excel中實現(xiàn)這個功能。 我們的方案相當(dāng)簡單,使用一個自定義函數(shù)表示篩選條件: select_func(x) 這里的x就是我們在上文中的“那些”,然后循環(huán)檢查待篩選列表中的每一個元素,如果符合返回true,否則,返回false。 這樣我們就可以得到一個邏輯值數(shù)組。 用這個數(shù)組對列表進行篩選即可。 實現(xiàn)代碼很簡單: /** 選取滿足條件的元素*/myFilter = LAMBDA(list, select_func, LET( cond, MAP(list, LAMBDA( a, select_func(a) )), FILTER(list, cond) ) 下面是一個調(diào)用的例子 =myFilter(A2:A6, LAMBDA(x, x <> "b")) 使用多個條件, =myFilter(A2:A6, LAMBDA(x, AND(x <> "b", x <>"a"))) 現(xiàn)在的實現(xiàn)方案中,我們使用MAP函數(shù)循環(huán)列表數(shù)據(jù)。 這就導(dǎo)致這個篩選函數(shù)只能用于單列數(shù)據(jù)。如果有多列數(shù)據(jù),就不能滿足我們的期望。 此時,就需要使用其他循環(huán)函數(shù)了。 |
|