返回列表 上一主題 發帖

[發問] match函數處理重複數值,如何傳回最後符合的列?

[發問] match函數處理重複數值,如何傳回最後符合的列?

比方說:
A列:
1  A
2  B
3  C
4  D
5  B
6  E
7  S
8  A
9  B

1. match("A",$A$1:$A$9,0)=1
2. match("A",$A$1:$A$9)=8
3. large(if($A$1:$A$9="A",row($A$1:$A$9),""),1)=8
我希望出現3式的結果(8),但是match必需要精確(因此2式不行),可是用large函數又太吃資源
想請教一下match函數遇到重復值,是否能直接傳回最後一個符合的列?

感謝版主的說明
看到
a. =LOOKUP(2,1/(A1:A9="A"),ROW(A1:A9))這個式子時
馬上會想到
b. =LOOKUP(1,1/(A1:A9="A"),ROW(A1:A9))
c. =LOOKUP(2,1*(A1:A9="A"),ROW(A1:A9))
這兩種方式,不過都不行,看了gong版主那篇說明之後大概比較了解:
b式中會出現內含1以及#DIV/0!的陣列,因為lookup函數是用二分搜尋法,因此無法確定會找到哪一個1(未必是最後一個)
c式中會出現內含1及0的陣列,但是1或0都小於2,因此二分搜尋會一直往下搜尋,直到最後一個,因此一定會回傳最後一個值(可能是1也可能是0,是0的話就錯了),因此必需用a式,以除的製造出#DIV/0!,再讓lookup函數自動刪掉,因此最後一定會傳回最後一個1

TOP

回復 11# lukychien

找第n大(小)的話,大概就是像我首篇那用,用large(small)函數了吧
large(if($A$1:$A$9="A",row($A$1:$A$9),""),n)=8

TOP

本帖最後由 Bodhidharma 於 2013-3-19 01:36 編輯
回復  lukychien
=LOOKUP(2,1/((A1:A20=E9)*(COUNTIF(OFFSET(A1,,,ROW(A1:A20),),E9)=D9)),ROW(A1:A20))
...
Hsieh 發表於 2013-3-16 23:47


1. G3~G5格似乎把E9誤植為E8了
2. G4格=INDEX(MATCH(2,1/(A1:A20=E9)),),似乎用=MATCH(2,1/(A1:A20=E9))即可,不需再加index?
3. G9格=LOOKUP(2,1/((A1:A20=E9)*(COUNTIF(OFFSET(A1,,,ROW(A1:A20),),E9)=D9)),ROW(A1:A20)),其中(A1:A20=E9)*(COUNTIF(OFFSET(A1,,,ROW(A1:A20),),E9)=D9))好像就已經是0與1的陣列,而且只有一個1是正確的位置,因此似乎也可以用=MATCH(1,(A1:A20=E9)*(COUNTIF(OFFSET(A1,,,ROW(A1:A20),),E9)=D9),0)或=MATCH(E9&D9,A1:A20&COUNTIF(OFFSET(A1,,,ROW(A1:A20),),E9),0)
4. 上面這個函式有趣歸有趣,不過我覺得還是用large最簡單方便(而且應該也不會沒效率吧)

TOP

=LOOKUP(N,(A1:A9="A")*COUNTIF(OFFSET(A1,,,ROW(A1:A9),),"A"),ROW(1:9))
ANGELA 發表於 2013-3-15 23:35


lookup函數是用二分搜尋法,搜尋矩陣沒有遞增的時候會出問題

TOP

1. G3~G5格似乎把E9誤植為E8了
2. G4格=INDEX(MATCH(2,1/(A1:A20=E9)),),似乎用=MATCH(2,1/(A1:A20=E ...
Bodhidharma 發表於 2013-3-19 01:34


剛剛又研究了一下,
=INDEX(MATCH(2,1/(A1:A20=E9)),) 會把MATCH(2,1/(A1:A20=E9))視為是一個矩陣,因此這個函數不需要用矩陣形式
於是想說比造辦理,去套=index(MATCH(1,(A1:A20=E9)*(COUNTIF(OFFSET(A1,,,ROW(A1:A20),),E9)=D9),0),),卻出現錯誤
使用評估值公式去看,發現COUNTIF(OFFSET(A1,,,ROW(A1:A20),),E9)=D9不會被視為是一個矩陣…想請教一下這是什麼原理?

TOP

        靜思自在 : 謊言像一朵盛開的鮮花,外表美麗,生命短暫。
返回列表 上一主題