數組公式可以用于動態篩選數據區域,其中的一個關鍵步驟是使用數組公式去排序一些數字。
使用數組公式排序數字
如下圖1所示,列A中的單元格區域A1:A10放置了一系列無序的數字,要求在列B中以升序排列該區域的這些數字。
可以在單元格B1中輸入公式:
=SMALL($A$1:$A$10,ROW())
向下拖至單元格B10,如下圖所示。
還有一種方法是使用數組公式。選擇單元格區域B1:B10,輸入公式:
=SMALL(A1:A10,ROW(Z1:Z10))
按下Ctrl+Shift+Enter組合鍵,結果如下圖3所示。
公式中,ROW(Z1:Z10)生成數組{1;2;3;4;5;6;7;8;9;10},作為索引值,然后依次在單元格區域A1:A10中取值。然而,如果在第1行插入新行,公式會變為:
=SMALL(A2:A11,ROW(Z2:Z11))
將導致結果錯誤。其中,第2個參數生成的數組變為{2;3;4;5;6;7;8;9;10;11}。
為了提高公式的健壯性,使用INDIRECT函數保持第2個參數生成的索引數組在插入行時保持不變,公式為:
=SMALL(A1:A10,ROW(INDIRECT("1:10")))
結果與上面的相同,如下圖所示。
在公式中使用INDIRECT函數,可使索引數組保持不變,因而可用于排序未知大小的動態區域(該區域的大小可以估計一個最大值)。
使用數組公式篩選數據
如下圖5所示,列A中單元格區域A1:A10有一系列數據,要篩選出這些數據中有7個字符的數據并放置在列B中。
選擇單元格區域B1:B10,輸入數組公式:
=INDEX(A:A,SMALL(IF(LEN(A1:A10)=7,ROW(A1:A10),99),ROW(INDIRECT("1:10"))),1)&""
公式中:IF(LEN(A1:A10)=7,ROW(A1:A10),99)將得到數組{1;99;99;99;99;6;7;99;99;99},其中的99表明所有單元格中的數值長度不是7,其他數字則是長度為7的數值所在單元格的行號。
使用本文前面的技術對該數組排序:SMALL(IF(LEN(A1:A10)=7,ROW(A1:A10),99),ROW(INDIRECT("1:10"))),返回數組{1;6;7;99;99;99;99;99;99;99}。
將上面的數組傳遞給INDEX函數得到結果。
由于單元格A99為空,INDEX函數將返回0,因此在公式末尾添加&””。
對于更大的數據集,將公式中的99和”1:10”進行相應的修改,使其足夠大以匹配數據區域的大小。
小結
在前面的示例中,我們假設數據區域從第1行開始。當然,數據區域不一定非得從第1行開始,但INDEX函數的第1個參數必須是包含數據區域的整列。
如果數據區域命名為MyData,那么數組公式為:
=INDEX(dataColumn,SMALL(IF(LEN(MyData)=7,ROW(MyData),ROW(MyData)+ROWS(MyData)),ROW(INDIRECT(“1:1048576”))),1)& “”
公式中的dataColumn,引用:
=INDEX(Sheet1!$1:$1048576,0,COLUMN(MyData))
上述公式可以根據篩選條件進行相應的修改,以篩選出滿足條件的數據。