在Dcard有人求救一個問題:想要將layer與panel的資料提出出來,如下圖。
這個題目是很經典的需求,就是多條件查找,多條件查找有蠻多種不同的解決方法,甚至版本不同解法也是天壤之別哦。
可以先下載練習檔案,做做看,學習效果會更棒唷
在寫函數之前,記得要先觀察一下我們想要提取的資料有什麼樣的規則,可以發現A欄中只要是layer與panel都需要抓出來,除了這兩個資料其他都是數字,所以可以利用文字與數字的規則來尋找解法。
今天會分享幾種不同的解法,讓不同版本的人都可以順利使用。
✍🏾FILTER篩選符合條件的資料
函數說明=FILTER(篩選範圍,篩選條件,空格時顯示)
E1=FILTER(A:B,ISTEXT(A:A))
ISTEXT這個函數,會判斷資料是否為文字,如果是文字就回傳TRUE,不是文字就回傳FALSE。
非常剛好的FILTER的第二個引數的篩選條件,就是在判斷布林邏輯,所以只要在ISTEXT的結果用FITER把符合TRUE的A:B欄提取出來就可以了。
D1=ISTEXT(A1)*1 向下填滿
利用ISTEXT來判斷所有A欄的每個儲存格是否為文字,是文字就回傳TRUE,不是文字就回傳FALSE,再將TURE與FALSE的結果乘上1,就會的到0與1
E2=SUM($D$1:D1) 向下填滿
用SUM把D欄的0跟1累加,D1:D1的範圍季的要吧第一個D1加上$(絕對參照),變成$D$1:D1,這樣向下填滿的時候就會變成...
$D$1:D2
$D$1:D3
$D$1:D3
這樣就會有累加的效果,而出現的數字就是文字儲存個所出現的次數。
=MATCH(ROW(A1),$E:$E,0)
用MATCH搭配ROW函數找到E欄的1、2、3、4、5、6分別在第1、2、6、7、10、11列。
=INDEX(A:A,MATCH(ROW(A1),$E:$E,0))
用INDEX把MATCH找到的所有A欄相對應的列號內容提取出來,因為待會會向右填滿,記得MACH的E:E要加上$,這樣填滿時參照才不會跑掉。
=IFERROR(INDEX(A:A,MATCH(ROW(A1),$E:$E,0)),"")
上面步驟會發現,向下填滿後會出現許多#N/A,那是因為符合條件的結果數量已經大於向下填滿的儲存格數量,所以找不到適合的內容,這時只要套上IFERROR就可以囉。
=IFERROR(INDEX(A:A,SMALL(IF(ISTEXT($A$1:$A$14),ROW($1:$14)),ROW(A1))),"")
陣列公式,2019以下,輸入時CTRL+SHIFT+ENTER取代ENTER輸入,向右填滿向下填滿
=IF(ISTEXT($A$1:$A$14),ROW($1:$14))
用IF函數將ISTEXT判斷是文字儲存格為TRUE就回傳ROW(相對應列號)。
=SMALL(IF(ISTEXT($A$1:$A$14),ROW($1:$14)),ROW(A1))
利用SMALL函數配合ROW函數,向下填滿後找出每一個儲存格為文字的列號
=INDEX(A:A,SMALL(IF(ISTEXT($A$1:$A$14),ROW($1:$14)),ROW(A1)))
用INDEX把前面公式找到符合條件的列號A欄內容提取出來。
=IFERROR(INDEX(A:A,SMALL(IF(ISTEXT($A$1:$A$14),ROW($1:$14)),ROW(A1))),"")
一樣的會與輔助欄解法一樣,會出現一些錯誤#NUM!,這時就把公式套上IFERROR就可以囉。
如果資料不會持續新增,只有一次性的用途,其實也不用絞盡腦汁特別寫函數,用篩選再複製就可以輕易完成了。
分享了這麼多種的方法,你喜歡哪一種呢?還是有其他的作法也歡迎留言告訴我~~