Board logo

標題: [發問] match函數處理重複數值,如何傳回最後符合的列? [打印本頁]

作者: Bodhidharma    時間: 2013-3-11 09:01     標題: 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函數遇到重復值,是否能直接傳回最後一個符合的列?
作者: Hsieh    時間: 2013-3-11 10:35

回復 1# Bodhidharma

=LOOKUP(2,1/(A1:A9="A"),ROW(A1:A9))
作者: p212    時間: 2013-3-11 15:27

本帖最後由 p212 於 2013-3-11 15:28 編輯

回復 2# Hsieh
超級版主:可否指導一下粗紅字體部份用意何在?謝謝!

=LOOKUP(2,1/(A1:A9="A"),ROW(A1:A9))
作者: Hsieh    時間: 2013-3-11 16:03

回復 3# p212

詳細請看LOOKUP函數說明
因為在無排序狀態要找到最後一個符合小於等於搜尋值最方便的就是LOOKUP
此例中2為搜尋值
1/(A1:A9="A")
會產生一個1與除以0的錯誤值陣列
在此陣列找到最後一個小於等於2的位置即為所求
作者: p212    時間: 2013-3-11 22:16

回復 4# Hsieh
請問超級版主:
那為何搜尋值不逕用「1」,而用「2」?
「1/(A1:A9="A")」產生的結果不是<=1?
作者: Hsieh    時間: 2013-3-11 22:43

回復 5# p212

http://forum.twbts.com/thread-2906-2-1.html
作者: JBY    時間: 2013-3-11 23:26

回復 1# Bodhidharma

=INDEX(MATCH(2,1/(A1:A9="A")),)
作者: p212    時間: 2013-3-12 15:01

本帖最後由 p212 於 2013-3-12 15:04 編輯

回復 6# Hsieh
謝謝超級版主的指導!受益良多。
對於Excel內建教學說明,似乎未提供諸如以1/(A1:A9="A")方式作為引數,以製造出陣列效果之原理,請問自何處(或哪一類專書)可獲得如此陣列效果之系統性基礎觀念與解析?
謝謝賜教!
作者: Hsieh    時間: 2013-3-12 16:49

回復 8# p212
函數說明都只是基本功能說明
應用完全是依據個人思考而產生不同程度的效果
這類書籍似乎還沒有,因為畢竟這會與表格配置、資料型態等因素
而有不同的思考,只有自己多看、多想才能夠融會貫通
作者: Bodhidharma    時間: 2013-3-12 23:19

感謝版主的說明
看到
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
作者: lukychien    時間: 2013-3-15 01:53

看了這一篇文章後想了很久,才慢慢有點了解...
於是找了其他函數&修改一下版主的公式,想知道是不是一定要用 1/(A1:A9="A") 製造出 #DIV/0!,
發現 =LOOKUP(2,FIND("A",A1:A9),ROW(A1:A9)) 也是可以找到最後一個值,
感覺意思有點像,但是不是如gong版主所說的一樣,我還需要再研究。

想到另一個問題,若是要找第n個(不是第1個或最後1個,而是第2 or 3 or 4個)數值的時候,公式應該如何修改?
作者: Bodhidharma    時間: 2013-3-15 22:14

回復 11# lukychien

找第n大(小)的話,大概就是像我首篇那用,用large(small)函數了吧
large(if($A$1:$A$9="A",row($A$1:$A$9),""),n)=8
作者: ANGELA    時間: 2013-3-15 23:35

=LOOKUP(N,(A1:A9="A")*COUNTIF(OFFSET(A1,,,ROW(A1:A9),),"A"),ROW(1:9))
作者: lukychien    時間: 2013-3-16 01:45

回復  lukychien

找第n大(小)的話,大概就是像我首篇那用,用large(small)函數了吧
large(if($A$1A$ ...
Bodhidharma 發表於 2013-3-15 22:14


好像不行...
作者: lukychien    時間: 2013-3-16 01:49

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



有時候找的到,有時候找不到...

[attach]14368[/attach]
作者: JBY    時間: 2013-3-16 16:12

回復 15# lukychien
{=SMALL(IF((A1:A20=E9),ROW(A1:A20)),D9)}
作者: lukychien    時間: 2013-3-16 17:16

回復 16# JBY

原來是這樣...   謝謝您

一個主題學到二樣東西,還不錯...


#12樓的先進 (Bodhidharma) ...

不好意思,是我搞錯了,難怪抓不出來...  抱歉抱歉
作者: Hsieh    時間: 2013-3-16 23:47

回復 15# lukychien
=LOOKUP(2,1/((A1:A20=E9)*(COUNTIF(OFFSET(A1,,,ROW(A1:A20),),E9)=D9)),ROW(A1:A20))
[attach]14380[/attach]
作者: Bodhidharma    時間: 2013-3-19 01:34

本帖最後由 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最簡單方便(而且應該也不會沒效率吧)
作者: Bodhidharma    時間: 2013-3-19 01:50

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


lookup函數是用二分搜尋法,搜尋矩陣沒有遞增的時候會出問題
作者: Bodhidharma    時間: 2013-3-19 02:00

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不會被視為是一個矩陣…想請教一下這是什麼原理?
作者: ANGELA    時間: 2013-3-19 09:30

確實是疏忽了.函數多樣化也是一種樂趣.用SMALL是標準做法,
避免LOOKUP的二分法可用VLOOKUP
={VLOOKUP(D9,IF({1,0},COUNTIF(OFFSET(A1,,,ROW(A1:A20),),E9),ROW(1:20)),2,)}
作者: Hsieh    時間: 2013-3-19 10:56

回復 21# Bodhidharma
函數使用不必拘泥於何種方式
只要能夠達到所需的方法都是好方法
至於您提到COUNTIF(OFFSET(A1,,,ROW(A1:A20),),E9)=D9不會被視為是一個矩陣
其中的前段(A1:A20=E9)會得到一個陣列無虞
當公式使用ENTER直接輸入,並未告知EXCEL要使用陣列,所以ROW(A1:A20)會傳回範圍的第一個儲存格列位
做為A1:A20=E9這個陣列中每個元素的相同倍數
唯有使用陣列公式,才會讓ROW(A1:A20)傳回1~20的陣列




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)