看板 Office 關於我們 聯絡資訊
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