2017-04-03 72 views
1

,我使用看起来像这样如何将多维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 

表我想实现的是这样的

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

您需要一个2D变量数组,你应该发布你目前的工作(无论是否工作),有经验的人可以查看代码并确定你的意图nt并纠正它。我的意思是,发生了什么事* 22,23 *和* 26 *? – Jeeped

+0

我已将更多信息添加到需要澄清的表格中。希望它有助于解释22,23和26发生了什么。另外,我在解释中有一个链接,其中讨论了我使用的VBA脚本。没有把它放在这里,以免它变得庞大而复杂。 –

+0

这是否必须使用VBA完成?细胞配方并不是非常难。 – Adam

回答

3

如果不已经用VBA来完成,这里有一个解决方案:

我们将使用索引和匹配的匹配查找键的定制表。

1. ROW 1

我插入的行跨数据设置为匹配,当我做列查找针对的顶部: 的公式表示作为B1文本,但是在其余部分被施加行的1

enter image description here

2. ROW 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在与第一步插回的标题行匹配的匹配项中使用连接的xyz列。

enter image description here

3 ROW 21

现在你需要做的是建立你的表。这是第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:同样地,列d的变化,只有当e和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,你'

现在只需从第21行填充到第21,701行就可以使用Right(公式。要善于

结果

我没有一个完整的数据表给它喂食,所以有很多孔。看起来是符合你的意图非常好,其中有数据(请注意,我已经隐藏了一些行,因为他们(预期)N/A的。

enter image description here

1

您可以在阵列读取表,建另一个阵列并将其复制到目标目标,如下所示:

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