2015-12-24 95 views
3

我有一個Excel表(25×25),它看起來像這樣,表排序和查找

C1 C2 C3 
R1 5 6 7 
R2 1 7 9 
R3 2 3 0 

我的目標是使它看起來像這樣,

C3 R3 0 
C1 R2 1 
C1 R3 2 
C2 R3 3 
C1 R1 5 
C2 R1 6 
C2 R2 7 
C3 R1 7 
C3 R2 9 

它會產生一個新的表排名由第一個值。它還會告訴相應的列和行名稱。表格具有重複,負值和小數。

我這樣做是因爲我想找到給定值的3個最接近的候選人(以及C和R)。而VLOOKUP()需要一個排序表。

另一個問題(向前邁進)是VLOOKUP()返回最接近的較小值,而不是實際最小值。有沒有更好的方法來做到這一點或解決方法?這樣的結果是一個整潔的表像這樣,

Value to look up = 2.8 
>> C2 R3 3 
>> C1 R3 2 
>> C1 R1 5 

對於一些原因,我無法使用VBA爲這個項目。 MS Excel中只有內置函數的任何解決方案?

+0

第1部分:'ADDRESS()'第2部分:'INDEX(MATCH())' – ti7

+0

或者來自多個合併範圍的樞軸表 –

+0

請參見http://superuser.com/questions/78439/is-it-possible-到逆透視 - 或反向樞軸式-Excel中。搜索關鍵詞是「Excel unpivot」。 –

回答

2

如果您只需要使用本地工作表函數,則可以完成此操作;即使沒有數組公式。

flatten_matrix

隨着A1的原始數據:D4,在F3的公式:H3是,

=INDEX(B$1:D$1, AGGREGATE(15, 6, COLUMN($A:$C)/(B$2:D$4=H3), COUNTIF(H$3:H3, H3))) 
=INDEX(A$2:A$4, AGGREGATE(15, 6, ROW($1:$3)/(B$2:D$4=H3), COUNTIF(H$3:H3, H3))) 
=SMALL(B$2:D$4,ROW(1:1)) 

必要向下填充。

在K5的公式:N5是在必要

=INDEX(B$1:D$1, AGGREGATE(15, 6, COLUMN($A:$C)/(B$2:D$4=M5), COUNTIF(M$5:M5, M5))) 
=INDEX(A$2:A$4, AGGREGATE(15, 6, ROW($1:$3)/(B$2:D$4=H3), COUNTIF(M$5:M5, M5))) 
=IF(COUNTIF($B$2:$D$4, N5+$K$2)>=COUNTIF(N$5:N5, N5), N5+$K$2, $K$2-N5) 
=AGGREGATE(15,6,ABS($B$2:$D$4-$K$2),ROW(1:1)) 

向下填充。

我已經在K5:N13矩陣中包含了足夠的行,您可以看到如何處理這兩個值。

+0

謝謝你的代碼似乎在我的項目上工作。 您能否介紹一下AGGREGATE()的'ROW($ 1:$ 3)/(B $ 2:D $ 4 = H3)'部分?我知道#DIV/0是不匹配的,所以AGGREGATE()可以忽略這些錯誤。但我無法理解'ROW($ 1:$ 3)'部分。謝謝。 –

+0

ROW(1:3)是* $ B $ 2:$ D $ 4中的*行位置,而不是工作表上的實際行; COLUMN(A:C)是* $ B $ 2:$ D $ 4中的*列位置,而不是工作表上的實際列。 – Jeeped