推 diskk:用VBA可以,但最好把來源欄數減為只有AB兩欄 11/06 20:29
→ kunjin1113:先建立全部公司的list放在A欄,再配合vlookup列出每季的 11/06 21:32
→ kunjin1113:的data 11/06 21:35
的確,也許有更好的方式從根本上改進處理這個問題的方式
這裡只是藉該問題推荐一個函數:IFERROR
這是一個2007才有的函數,用途是
如果公式計算錯誤,會傳回指定的值;否則,會傳回公式的結果。
語法
IFERROR(value,value_if_error)
看起來沒什麼了不起,
但是當判斷錯誤的式子不短的時候,就十分好用
像本題
A B C D E F
1 台塑 5% 台銀 7%
2 鴻海 6% 台塑 9%
3 鴻準 3% 南亞 2%
4 中壽 2% 可成 8%
5 南亞 7% 聯電 5%
不用IFERROR的話,E1的公式
{=IF(ISNA(MATCH(A1,C範圍,0)),IF((ROW()>A最大列數)*(ROW()<=總列數),INDEX(C範圍
,SMALL(IF(ISNA(MATCH(C範圍,A範圍,0)),ROW(C範圍)),ROW()-A最大列數)),""),INDEX(
C範圍,MATCH(A1,C範圍,0)))}
要判斷需要顯示空白的範圍
要判什麼時候用哪個部份的index
而且判斷式又跟之後的內容重覆
已經盡力精簡,寫起來卻還十分眼花瞭亂
(雖然不排除還有更精簡的可能性~)
不小心還可能超過巢狀函數層級限制...
{=IFERROR(INDEX(C範圍,SMALL(IF(ISNA(MATCH(C範圍,A範圍,0)),ROW(C範圍)),ROW()-A
最大列數)),)&IFERROR(INDEX(C範圍,MATCH(A1,C範圍,0)),)}
用IFERROR之後,反正錯誤值就傳回空字串(或自訂)
精簡不少!
回到題目,F1就相對簡單許多
=IF(E1="","",VLOOKUP(E1,OFFSET($C$1,,,C最大列數,2),2,FALSE))
結果:
A B C D E F
1 台塑 5% 台銀 7% 台塑 9%
2 鴻海 6% 台塑 9%
3 鴻準 3% 南亞 2%
4 中壽 2% 可成 8%
5 南亞 7% 聯電 5% 南亞 2%
台銀 7%
可成 8%
聯電 5%
因為不知道資料到底有多少
以上公式之定義中,資料的可能範圍到65535(工作表名稱:移)
A最大列數 =MAX((移!$A$1:$A$65535<>"")*ROW(移!$A$1:$A$65535))
A範圍 =OFFSET(移!$A$1,,,A最大列數)
C最大列數 =MAX((移!$C$1:$C$65535<>"")*ROW(移!$C$1:$C$65535))
C範圍 =OFFSET(移!$C$1,,,C最大列數)
重覆列數 =SUM(ISNUMBER(MATCH(C範圍,A範圍,0))*1)
總列數 =A最大列數+C最大列數-重覆列數
視需要可調整固定的部分($部分)與最大列數
2007版
http://kuso.cc/AutoShift2007 (9.35K)
2003版
http://kuso.cc/AutoShift2003 (18.5K)
※ 引述《sean508 (暹)》之銘言:
: (若是和其他不同軟體互動之問題 請記得一併填寫)
: 您所使用的軟體為:
: EXCEL
: 版本:
: 2003或2007
: 問題:
: 因為最近有一個報告,而我們要比較各個基金每季的持股比例
: 因為資料數實在太龐大,如果一個一個做可能時間會不夠
: 所以想看看有沒有可能做到下面這樣
: A B C D A B C D
: 1 台塑 5% 台銀 7% 1 台塑 5% 台塑 9%
: 2 鴻海 6% 台塑 9% 2 鴻海 6%
: 3 鴻準 3% 南亞 2% ==================> 3 鴻準 3%
: 4 中壽 2% 可成 8% 4 中壽 2%
: 5 南亞 7% 聯電 5% 5 南亞 7% 南亞 2%
: 6 6 台銀 7%
: 7 可成 8%
: 8 聯電 5%
: 也就是固定A B 讓C D對照,不一樣的則往下排列
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.123.36.226
※ 編輯: JieJuen 來自: 122.123.36.226 (11/07 15:57)
推 sean508:真的很謝謝你~我會用了~ 11/07 22:56
推 JieJuen:^^ 11/07 23:02