2017-02-12 39 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中包含','的值的所有内容。 –