2011-07-18 78 views
3


     目前我正在尋找更有效的方法,通過VBA,以獲得一個Sub內從2D陣列傳送的信息到一個交錯組的範圍範圍內的Excel工作簿。我在下面的例子中提煉了我需要的東西,並附上代碼;任何幫助將不勝感激。Excel VBA中:填充交錯與2D陣列數據

     我聯繫說明什麼,我有(輸入,Array和輸出)工作的一個示例圖像,並寫了我使用下面的代碼示例。爲了簡單起見,讓我們定義的「輸入表」工作表Sheet1作爲和「輸出表」作爲Sheet2的工作簿中:

Input Sheet

Option Explicit 

    Sub TransferData() 
    Dim myArray as Variant   'Define the array to hold the data. 
    Dim i as integer     'Define a generic loop counter variable. 

    myArray = Sheet1.Range("A1:F7") 'Pulls all the relevant data into the array. 

      myArray的現在看起來酷似範圍。 (我會發布第三個鏈接,但我需要先獲得更多的代表)。

     我希望將數據轉移到我的輸出文件,以便它看起來像這樣:

Output Sheet

     下面是我目前接近的情況:

For i = 1 to ubound(myArray) 
     Sheet2.Cells(i,1) = myArray(i,1) 
     Sheet2.Cells(i,3) = myArray(i,2) 
     Sheet2.Cells(i,6) = myArray(i,3) 
     Sheet2.Cells(i,7) = myArray(i,4) 
     Sheet2.Cells(i,8) = myArray(i,5) 
     Sheet2.Cells(i,9) = myArray(i,6) 
    Next i 
    End Sub 

     我的問題是這樣的;有沒有一種方法可以將數據從陣列傳輸到交錯範圍,這與我如何抓取陣列相似;一次一個範圍?例如,沿着線的東西:

Sheet2.Range("A1:A8") = myArray(1 to 7, 1) 'Note: this is total pseudocode 
Sheet2.Range("C1:C8") = myArray(1 to 7, 2) 'Note: this is total pseudocode 

等...等...

     我相信我已經成功地自學VBA相當數量的,到目前爲止,但我絕對不知道一切,這是我需要幫助的。我試圖儘量減少從VBA寫入工作表的數量;他們真的付出了代價。

     任何幫助,非常感謝。

   謝謝!

+0

我假設你不只是使用'= Sheet1!B1'作爲Sheet2單元格C2的公式等等。 – mwolfe02

+0

另外,它本身不是答案,但關閉屏幕繪畫可能會加速大大提高你現有的算法('Application.ScreenUpdating = False')。只要不要忘記在錯誤處理程序中並在退出例程之前將其重新打開。 – mwolfe02

+0

當然。首先,謝謝你添加圖片!要編輯sheet1的用戶有刪除行的習慣,並且我試圖避免任何#REF錯誤,如果他們刪除引用的單元格,可能會彈出它們。我的解決方法是簡單地將整個範圍閃存到數組中,並通過快速讀/寫處理事情。那有意義嗎? – Prej1

回答

2

「複製和粘貼」值可能會快很多。顯然需要來概括這適合你的目的,但這個代碼與您提供的樣本:

Sub TransferData() 

    Sheet3.Range("A1:A7") = Sheet1.Range("A1:A7").Value 
    Sheet3.Range("C1:C7") = Sheet1.Range("B1:B7").Value 
    Sheet3.Range("F1:I7") = Sheet1.Range("C1:F7").Value 

End Sub 
+0

這個答案實際上讓我變成了facepalm,因爲我非常專注於數組,所以我忘記了簡單地使用這種方法。您,先生,讓我走上一條軌道,將宏的運行時間縮短几個數量級。感謝您的幫助! – Prej1

1

根據「其它數據」的大小來插入,這接近一個非常簡單的方法將所有數據傳輸到輸出範圍,然後插入新列並根據需要放置其他數據。

例如:

data = Worksheets("InputSheet").Range("A1:F7").Value 
Worksheets("OutputSheet").Range("A1:F7").Value = data 
Worksheets("OutputSheet").Columns("B").EntireColumn.Insert ' do this for every column you need, within reason. 

然後,您可以放下你的「其他數據」爲你創造了新的列。

+0

謝謝保羅;我讚賞輸入(雙關語意)。我已經採取了你和mwolfe所說的並且很好地使用它,並且我感謝你的幫助! – Prej1