2011-12-06 73 views
-1

我發現了一個宏(由Jerry Beaucaire提供),它根據給定列中的唯一值將一個工作表分成許多個。這很好。然而...VBA陣列操作

客戶端提供了一個不同格式的工作表,需要一些溫和的按摩來進入我們需要的格式。

首先,讓我告訴你的JB的代碼片段:

MyArr = Application.WorksheetFunction.Transpose _ 
    (ws.Columns(iCol).SpecialCells(xlCellTypeConstants)) 

從我可以告訴(我是一個總的VB新手,所以我知道什麼??),這填充與所選行的一個數組值

這:

For Itm = 2 To UBound(MyArr) 

    ...(code removed) 

    ws.Range("A" & TitleRow & ":A" & LR).EntireRow.Copy _ 
     Sheets(MyArr(Itm) & "").Range("A1") 


    ...(code removed) 

Next Itm 

...似乎做複製。

好的。迄今爲止很好。

問題是我需要爲該過程添加一個步驟。這將是棘手的解釋。請多多包涵......

標題行是第1行

數據開始第2行

每行有9列:

可樂:標識符

COLB冷: x,y,z值(對於項目的頂部)

colE-colG:x,y,z值(用於項目的底部)

colH和colI:可以忽略

這些x,y和z值用於定義用於在3D建模程序中繪製線條的點。工作表中的每一行實際上都定義了一條線(呃...一個起點和一個終點 - 「頂部」和「底部」)。不幸的是,我們收到的數據(工作表)定義了每行的兩組數據 - 兩具有相同的起點,但具有不同的終點。換句話說,從第3行和第4行開始,列B-D中的數據對於兩行是相同的。這適用於行5 & 6,7 & 8等

由於我們需要的是一組數據點,我們可以安全地使用列E-G中的值。
但是這是我需要幫助的地方...我們需要新創建的工作表的第一行以行2,列B-D中的值開始。 (即我們可以使用終點作爲我們的座標,但是我們仍然需要第一個起點)其餘的都很好。

例如:

源數據:

 
    | A | B | C | D |  E |  F |  G | 
1 | id | x-top | y-top | z-top | x-bottom | y-bottom | z-bottom | 
2 | H1 | 101.2 | 0.525 | 54.25 | 110.25 | 0.625 | 56.75 | 
3 | H1 | 110.25| 0.625 | 56.75 | 121.35 | 2.125 | 62.65 | 
4 | H1 | 110.25| 0.625 | 56.75 | 134.85 | 3.725 | 64.125 | B,C,D same as row 3 
5 | H1 | 134.85| 3.725 | 64.125| 141.25 | 4.225 | 66.75 | 
6 | H1 | 134.85| 3.725 | 64.125| 148.85 | 5.355 | 69.85 | B,C,D same as row 5 

我需要什麼:

 
    | A | B | C | D |  E |  F |  G | 
1 | id | x-top | y-top | z-top | x-bottom | y-bottom | z-bottom | 
2 | H1 |  |  |  | 101.2 | 0.525 | 54.25 | 
3 | H1 | 101.2 | 0.525 | 54.25 | 110.25 | 0.625 | 56.75 | 
4 | H1 | 110.25| 0.625 | 56.75 | 121.35 | 2.125 | 62.65 | 
5 | H1 | 110.25| 0.625 | 56.75 | 134.85 | 3.725 | 64.125 | 
6 | H1 | 134.85| 3.725 | 64.125| 141.25 | 4.225 | 66.75 | 
7 | H1 | 134.85| 3.725 | 64.125| 148.85 | 5.355 | 69.85 | 

所以...什麼是做到這一點的最好方法是什麼?我可以添加到現有的宏來執行此操作嗎?如果是這樣,最好修改數組? ...更好地修改複製例程? ...如何??

在此先感謝您的幫助,並請不要建議您手動進行此操作。有70,000多行解析!

如果您需要更多信息,請告訴我!

+0

你能確認你所需要的是後插入一行標題行並將值從BD轉移到EG? –

+1

「從我可以告訴的(我是一個完全VB的新手,所以我知道什麼.. ??)」在該行上設置一個斷點,在該數組上設置一個監視,並在調試模式下逐步執行代碼。然後你會知道。 –

+0

是的,Rachel,我需要在標題行之後插入一個數據行。應該將行3中的數據(具有值的第一個數據行 - 由於插入而從行2移出)列B-D複製到行2(新的空行)列E-G。 因爲VB對我來說仍然是希臘語,所以我只是不確定在數據建立之後(在創建新工作表之前)還是在數據添加之後更容易做到這一點到新的工作表。 ......哦,對...以及如何去做。 ;) –

回答

0

全宏免費提供給所有在this location

爲了實現你的連接點,這些增加應該這樣做:

For Itm = 2 To UBound(MyArr) 

    ...(code removed) 

    ws.Range("A" & TitleRow & ":A" & LR).EntireRow.Copy _ 
     Sheets(MyArr(Itm) & "").Range("A1") 
    Sheets(MyArr(Itm) & "").Rows(2).Insert xlShiftDown 
    Sheets(MyArr(Itm) & "").Range("E2").Resize(, 3).Value = Sheets(MyArr(Itm) & "").Range("B3").Resize(, 3).Value 

    ...(code removed) 

Next Itm