2017-02-12 77 views
0

我有套安排這樣的數據:安排從列中的數據矩陣

X Y Z 
x1 y1 z1 
x1 y2 z2 
x1 y3 z3 
x2 y1 z4 
x2 y2 z5 
x2 y3 z6 

,我需要安排成這樣一個表:

y1 y2 y3 
x1 z1 z2 z3 
x2 z4 z5 z6 

是否有這樣做的有效途徑這與vba?

回答

0

這是否必須是VBA解決方案?使用單元格公式可以很容易地完成這項工作...

通過使用數據>刪除重複項,您可以獲得唯一的XY值,然後按照您的要求將它們排列爲表標題。

Layout

然後用下面的公式來填充XY列和表的Z值:

Formulas

即,對於XY串聯:

=CONCAT(A2,",",B2) 

你可以在第一個單元格中輸入並使用AutoFill handle填充整個列。

對於表的Z值,我們使用XY值作爲MATCH查找,其從表的標題列/行的同一級聯返回匹配XY值的行。

=INDIRECT(CONCAT("C", MATCH(CONCAT($F2,",",G$1),$D:$D,0))) 

將此輸入到左上角的單元格中,並再次拖動它以填充表格。

請注意公式中的美元符號,它會停止相對調整這些行/列的自動填充,修復它們,因爲它們是列/行標題。

如果你真的需要一個VBA的解決方案,這將是可行的,但你最大的任務將是

1. Making sure the row/column header values are unique, and looking up where they are for each new row. 
2. Handling what happens when they aren't unique (if your data input allows this) 

否則,遵循類似的邏輯,上述單元格的公式!

編輯:

@Scott建議主查找表效果很好同等功能。我已經增加了更多的美元符號,以便自動填充可用於

=INDEX($C:$C, MATCH(CONCAT($F2,",",G$1),$D:$D,0)) 
+1

1 CONCAT僅在Office 365 Excel和與正在使用CONCATENATE(該方法適用)會工作得很好,這是適用於所有的Excel 。 2.而不是一個易變的INDIRECT使用更快和不易變的INDEX()。 '= INDEX($ C:$ C,MATCH(CONCAT($ F2,「,」,G $ 1),$ D:$ D,0))' –

+0

hi @ScottCraner,好評,我不習慣使用單元格公式,我是一個VBA癮君子!你已經看到了我的第一個工作示例代碼,你的是一個很好的優化:) – Wolfie

+1

只需簡單介紹一下CONCANTENATE和CONCAT之間的區別。CONCAT將執行一個範圍:CONCATENATE連接一系列輸入CONCATENATE(CONCATENATE($ F2,「,」,G $ 1)',然後是新的TEXTJOIN,它將添加分隔符並連接一個範圍,'= TEXTJOIN(「,」,TRUE,A1:A10)'這將連接在A1:A10中包含','的值的所有內容。 –