推 imrt:雖然一時看不懂,先推.. 11/02 00:45
推 fushi:大推 11/02 04:34
推 websterskimo:謝謝分享 11/02 08:46
推 singermath:推 好文章 11/02 10:25
推 cloudxyz:推 實用好文 11/02 10:58
※ 編輯: JieJuen 來自: 218.164.48.216 (11/02 14:51)
推 csleafy:感謝你!!!有幫助到...推推!! 11/04 11:32
※ 編輯: JieJuen 來自: 218.164.50.184 (11/14 02:55)
> -------------------------------------------------------------------------- <
作者: JieJuen (David) 看板: Office
標題: Re: [算表] Excel較少被提及的函數與小技巧
時間: Thu Nov 29 23:21:15 2007
之前文章的一部分
出了一題作業...
4. 重覆的條件,皆傳回相應的值
這不太算是小技巧了,因為有點麻煩
---------------------------------------------
A B C D
1 b W 1 W
2 a X 3 Y
3 b Y 4 Z
4 B Z 0 FALSE
A欄有"b"(不分大小寫)時傳回B欄的內容
C1=MATCH("b",A1:$A$4,0)
C2=(MATCH("b",OFFSET($A$1,C1,0):$A$4,0)+C1)*(C1<4)*(C1<>0)
選C2往下拉. 後兩項是避免超過範圍.
D1=IF(C1>0,INDEX($B$1:$B$7,C1)) 往下拉
---------------------------------------------
大意就是用MATCH找出位置,用OFFSET調整下次搜尋的範圍。
要分大小寫的話,好像麻煩了些,就當作業吧XD
新增:
一欄解決的方法用offset或index
C1
=IF(ROW()>COUNTIF($A$1:$A$4,"b"),"",
OFFSET($B$1,SMALL(IF($A$1:$A$4="b",ROW($A$1:$A$4)),ROW())-1,))
或
=IF(ROW()>COUNTIF($A$1:$A$4,"b"),"",
INDEX($B$1:$B$4,SMALL(IF($A$1:$A$4="b",ROW($A$1:$A$4)),ROW())))
看起來是變長了,但三個式子合為一個式子,其實寫起來是比較簡單,也比較短
當然計算可能慢了點
但靈活度也大了,要分大小寫就可以改成
=IF(ROW()>COUNT(1/EXACT("b",$A$1:$A$4)),"",
INDEX($B$1:$B$4,SMALL(IF(EXACT("b",$A$1:$A$4),ROW($A$1:$A$4)),ROW())))
要找"含有小寫b"
=IF(ROW()>COUNT(FIND("b",$A$1:$A$4)),"",INDEX($B$1:$B$4,
SMALL(IF(ISNUMBER(FIND("b",$A$1:$A$4)),ROW($A$1:$A$4)),ROW())))
不分大小寫,FIND改成SEARCH
作業完成...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.164.59.188
→ JieJuen:補充說明,全部是陣列公式,以Ctrl+Shift+Enter結束公式. 11/30 00:07
> -------------------------------------------------------------------------- <
作者: JieJuen (David) 看板: Office
標題: Re: [算表] Excel較少被提及的函數與小技巧
時間: Fri Nov 30 00:07:30 2007
看不慣公式的朋友可能會覺得公式怎麼那麼長....不知道在做什麼...
尤其是有好多條的時候
※ 引述《JieJuen (David)》之銘言:
: 一欄解決的方法用offset或index
: C1
: =IF(ROW()>COUNTIF($A$1:$A$4,"b"),"",
: OFFSET($B$1,SMALL(IF($A$1:$A$4="b",ROW($A$1:$A$4)),ROW())-1,))
: 或
: =IF(ROW()>COUNTIF($A$1:$A$4,"b"),"",
: INDEX($B$1:$B$4,SMALL(IF($A$1:$A$4="b",ROW($A$1:$A$4)),ROW())))
: 看起來是變長了,但三個式子合為一個式子,其實寫起來是比較簡單,也比較短
: 當然計算可能慢了點
: 但靈活度也大了,要分大小寫就可以改成
: =IF(ROW()>COUNT(1/EXACT("b",$A$1:$A$4)),"",
: INDEX($B$1:$B$4,SMALL(IF(EXACT("b",$A$1:$A$4),ROW($A$1:$A$4)),ROW())))
: 要找"含有小寫b"
: =IF(ROW()>COUNT(FIND("b",$A$1:$A$4)),"",INDEX($B$1:$B$4,
: SMALL(IF(ISNUMBER(FIND("b",$A$1:$A$4)),ROW($A$1:$A$4)),ROW())))
: 不分大小寫,FIND改成SEARCH
例如下邊寫"作業完成"
但其實不知道上面哪一條式子才是答案....(頭都昏了)
: 作業完成...
=IF(ROW()>COUNT(1/EXACT("b",$A$1:$A$4)),"",
INDEX($B$1:$B$4,SMALL(IF(EXACT("b",$A$1:$A$4),ROW($A$1:$A$4)),ROW())))
作業是這一條
當然公式不適合在BBS上看的
放到EXCEL裡比較好,不過有時候放到EXCEL也不明瞭,這時就需要解釋一下了
如果演算法一樣的話
公式應該不會比VBA長,至少公式不用定義
但是全都擠在一起,不怎麼好看
那...就分開看吧
=IF(
ROW() > COUNT(
1/EXACT(
"b",$A$1:$A$4
)
),
"",
INDEX(
$B$1:$B$4,
SMALL(
IF(
EXACT(
"b",$A$1:$A$4
),
ROW(
$A$1:$A$4
)
),
ROW()
)
)
)
這樣有好一點嗎XD
如果您喜歡的話
可以這樣寫
貼到EXCEL裡可以動喔!
還差一個註解是吧,沒問題~
=IF(
ROW() > COUNT(
1/EXACT(
"b",$A$1:$A$4
)
+N("如果是TRUE,1/TRUE=1,
如果是FALSE,1/FALSE=#DIV/0!,
因為COUNT忽略錯誤值,只算數字的個數,
所以可以知道有幾個符合條件")
)
+N("列號大於""b""的個數,就反回空白"),
"",
INDEX(
$B$1:$B$4,
SMALL(
IF(
EXACT(
"b",$A$1:$A$4
),
ROW(
$A$1:$A$4
)
+N("符合完全等於b的,傳回列號,其他傳回FALSE")
),
ROW()
+N("在第幾列,就傳回第幾小的")
)
)
)
上面可以執行的一模一樣~~
N()是會將上面寫的文字轉為0,
所以可以寫在加上零不會變動的地方。
當然平常寫應該不用這麼極端,
但是換行與加註解這兩個小技巧還是蠻好用的,
如果公式真的很長的話
(上面那個在我的EXCEL中只有一行)
換行的方法是按Alt+Enter,也許有些人知道這樣按,
但沒想過在寫公式時也可以按XD
最後提醒,如果有人真的要試,
這是陣列公式,輸入完要按Ctrl+Shift+Enter.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.164.59.188
推 mddc62:陣列公式跟ACCESS 後者好像簡單一點 11/30 00:37
推 JieJuen:要在文字處加註解,則再用T()把0轉為空白~ 12/05 02:55
> -------------------------------------------------------------------------- <
作者: JieJuen (David) 看板: Office
標題: Re: [算表] Excel較少被提及的函數與小技巧
時間: Fri Nov 30 01:41:49 2007
推 mddc62:陣列公式跟ACCESS 後者好像簡單一點 11/30 00:37
在板友建議了VBA之後我就想,
會不會不久就有建議access了呢^^
因為不是很了解access,有些觀念不正確還請指正~
我認識的一些長者,學了access後都說很好用很好用,
但....他們在沒有用XD
一些商店或是機構、醫院等
每天處理大量資料,
會讓人員用寫好的類似VB的東西輸入,
可以避免出錯,易於自動整理,
似乎也不是用ACCESS。
不知道,是不是ACCESS剛好位於中間,
處理小量的使用者覺得它太大,
大量的使用者覺得它不夠用?
ACCESS的表單,一筆一筆的輸入
輸完感覺好像沒看到結果,不知跑哪去了XD
要一次輸入很多筆的時候,
程序也跟一筆一筆時不同?
輸入資料時,使用滑鼠(或TAB?)的步驟也比較多?
(因為要一筆完了才下一筆?)
這只是概略的感覺,
也許是預設這樣,但可以改 之類的~
EXCEL就像寫在紙上,看到了比較心安XD
比較不會出錯?
因為錯誤大部分最多就累積在一個公式之中
(除非寫VBA...)
EXCEL複製上也很方便,
也可以照自己喜愛的順序輸入。
ACCESS雖然自由度比較大(寫程式嘛~)
但是寫好的程式反而讓使用者的自由度更小了
不過以上講的,可能跟用ACCESS解決這題沒有真正的關係:P
因為求出 重覆條件皆傳回相應的值 應該用不到"使用者輸入介面"?
能否介紹一下ACCESS的解法?(因為更容易呀~)
老實說,
=IF(ROW()>COUNT(1/EXACT("b",$A$1:$A$4)),"",
INDEX($B$1:$B$4,SMALL(IF(EXACT("b",$A$1:$A$4),ROW($A$1:$A$4)),ROW())))
這句話對我來說還蠻直觀的XDXD
IF只是偵錯條件不看
INDEX本就要有範圍,不看
SMALL(array,ROW())選個值嘛~不看
EXACT("b",$A$1:$A$4)這就是題目嘛~不看
IF(題目,ROW($A$1:$A$4))這是解答,看...
確實,在PO本系列首文時我還不知道這個解法,
但後來用到這方法的文章也有好幾篇了,
只是現在才剛好看到之前文章中的解法~
歡迎不吝賜教~^^
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.164.59.71
※ 重新編輯: JieJuen (09/29/2008)