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

时间:2017-04-03 16:48:49

标签: excel excel-vba vba

我使用的表格看起来像这样

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

我想要实现的是这样的

X   Y   Z   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

我尝试使用此帖子How to "flatten" or "collapse" a 2D Excel table into 1D?中给出的宏,但无法使其工作,可能是因为我的表格超过2D,更像是4D。我不是宏观专家。

有没有办法将第一个表转换为第二个表,宏或其他表。我意识到它大大增加了行数,但这不是问题。

2 个答案:

答案 0 :(得分:3)

如果 没有用VBA完成,这是一个解决方案:

我们将使用索引并匹配自定义构建的键表以进行匹配查找。

<强> 1。第1行

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

enter image description here

<强> 2。第20行

在第20行,我有以下内容:

A20:=B20 & C20 & D20

B20:x1

C20:y1

D20:z1

<\ n> 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在匹配我在第一步插回的标题行时使用连接的xyz列。

enter image description here

第3。第21行

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

E栏:您希望每行将E列增加1%,除非您将其设为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(公式。)

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

<强> RESULT

我没有完整的数据表来提供它,所以有很多漏洞。在有数据的情况下,它看起来很符合您的意图(请注意,我隐藏了一些行,因为它们是(预期的)N/A

enter image description here

答案 1 :(得分:1)

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

flatMap()