我使用的表格看起来像这样
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。我不是宏观专家。
有没有办法将第一个表转换为第二个表,宏或其他表。我意识到它大大增加了行数,但这不是问题。
答案 0 :(得分:3)
如果 没有用VBA完成,这是一个解决方案:
我们将使用索引并匹配自定义构建的键表以进行匹配查找。
<强> 1。第1行
我在数据集顶部插入一行,以便在进行列查找时进行匹配: 该公式在B1中显示为文本,但在第1行的其余部分中应用。
<强> 2。第20行
在第20行,我有以下内容:
A20:=B20 & C20 & D20
B20:x1
C20:y1
D20:z1
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列。
第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
。
答案 1 :(得分:1)
您可以读取数组中的表,构建另一个数组并将其复制到目标目标,如下所示:
flatMap()