2017-04-03 14 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