如何将多维Excel表转换为1维?

我正在使用的表看起来像这样

X x1 x1 x1 x1 x1 x1 x1 x1 x2 x2 x2 x2 Y y1 y1 y1 y1 y2 y2 y2 y2 y1 y1 y1 y1 Z z1 z2 z3 z4 z1 z2 z3 z4 z1 z2 z3 z4 30% 23 22 25 19 24 27 22 32 21 19 31 29 31% 25 23 27 22 26 29 24 33 24 22 33 31 32% 29 26 31 25 28 33 27 36 27 25 35 33 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300% 500 520 613 476 512 312 324 754 432 345 421 444 

我试图达到的是这样的

 XYZ Per. Value x1 y1 z1 30% 23 x1 y1 z1 31% 25 x1 y1 z1 32% 29 . . . . . . . . . . x1 y1 z1 300% 500 x1 y1 z2 30% 22 x1 y1 z2 31% 23 x1 y1 z2 32% 26 . . . . . . . . . . x1 y2 z1 30% 24 x1 y2 z1 31% 26 . . . . . . . . . . x1 y2 z4 30% 32 x1 y2 z4 31% 33 . . . . . . . . . . . . . . . x10 y3 z7 300% 431 

我尝试使用在这个线程中给出的macros如何“扁平化”或“折叠”一个2D Excel表成1D? ,但不能得到它的工作,可能是因为我的表超过2D,更像4D。 我不是一个macros观专家。

有没有办法将第一个表格转换成第二个表格,macros或其他方式。 我意识到它会显着增加行数,但这不是问题。

如果这不需要用VBA来完成,这是一个解决scheme:

我们将使用索引并与用于匹配查找的自定义键表匹配。

1.行1

我在数据集的顶部插入一行,以匹配列的查找时间:公式在B1中显示为文本,但应用于行1的其余部分。

在这里输入图像说明

第20行

在第20行,我有以下几点:

A20: =B20 & C20 & D20

B20: x1

C20: y1

D20: z1

E20: 0.3

F20: =INDEX($C$5:$N$12,MATCH(E20,$B$5:$B$12),MATCH(A20,$C$1:$N$1,0))

F列使用index(array, rowValue, columnValue

array是数据表的位置。 rowValue是百分比列与数据表的左侧标题列的匹配。 columnValue在与第一步插入的标题行匹配的匹配columnValue使用连接的xyz列。

在这里输入图像说明

第二十一行

现在你所要做的就是build立你的桌子。 这是第21行,从右到左。

列E:你想每列增加1%的列E,除非你把它设置为301%,在这种情况下你重新开始:

=IF(E20+0.01 < 3.001 , E20 + 0.01 , 0.3)

实际上 – 当我们加上0.01的时候(其中270个,我们得到了一点浮点漂移,所以我会每次舍入0.01)

=MROUND(IF(E20+0.01<3.001,E20+0.01,0.3),0.01)

D列:只有E列重置为0.3时,才希望列D的值更改。 否则,保持不变:

IF(E21=0.3,IF(D20="z4","z1","z"&RIGHT(D20,1)+1),D20)

列C:同样,只有E和D刚刚复位时,D列才会更改。

=IF(AND(D21="z1",E21=0.3),IF(C20="y1","y2","y1"),C20)

B列:同样,只有当其他三个重置时,该列才会改变:

=IF(AND(C21="y1",D21="z1",E21=0.3),"x"&RIGHT(B20,1)+1,B20)

(请注意,如果你的数据超过了x!0,你必须修改Right(公式Right(公式)。

现在只需从第21行填到21701行。 应该是好的

结果

我没有一个完整的数据表来喂它,所以有很多漏洞。 看起来这是匹配你的意图相当好,哪里有数据(注意,我已经隐藏了一些行,因为它们是(预期的) N/A的。

在这里输入图像说明

您可以读取数组中的表格,构build另一个数组并将其复制到目标目标,如下所示:

 Option Explicit Option Base 1 Sub Flatten() Dim inArr As Variant, col As Long, rw As Long Dim outArr() As String, rwcount As Long, outRng As Range inArr = Range("A1:M7").Value 'change to correct range Set outRng = Range("A12") 'change to correct range ReDim outArr(1 To (UBound(inArr, 2) - 1) * (UBound(inArr, 1) - 3) + 1, 5) rwcount = 1 outArr(1, 1) = "X": outArr(1, 2) = "Y": outArr(1, 3) = "Z" outArr(1, 4) = "Per.": outArr(1, 5) = "Value" For col = 2 To UBound(inArr, 2) For rw = 4 To UBound(inArr, 1) rwcount = rwcount + 1 outArr(rwcount, 1) = inArr(1, col) outArr(rwcount, 2) = inArr(2, col) outArr(rwcount, 3) = inArr(3, col) outArr(rwcount, 4) = inArr(rw, 1) outArr(rwcount, 5) = inArr(rw, col) Next rw Next col outRng.Resize(UBound(outArr, 1), UBound(outArr, 2)).Value = outArr End Sub