2016-05-05 27 views
0

我有一個excel工作簿,我正在處理大量數據。在這一點上大約有5000列和1000行,但這會增長。我已經定義和數組以下列方式將整列數據分配給vba中的數組的特定列

ReDim arr(1 To numRows, 1 To lastcol3) 

如果我以下列方式使用雙for循環,我可以填充整個陣列和它的作品:

For r = 1 To lastcol3 
    For i = 1 To numRows 
    arr(i, r) = ws1.Cells(i, 11) 
    Next 
Next 

其中WS1是在工作表問題和11是我想從中獲取數據的數據列(每個r的值都有變化)。此方法可行,但需要花費大量時間,因爲它需要遍歷每行數據。

我想知道是否有一種方法,對於每個r值,將列11分配給數組中的相應列「r」。這將確保代碼只需要通過r循環,而不是我?

我在網上搜索了很多,但似乎無法找到一種方法來定義數組中的特定列,並使其等於一系列數據。

如果您需要進一步澄清或代碼的副本,請讓我知道。

+0

警告如果要在使用保留選項設置對數組進行重新映射時保留信息,則只能調整數組的最後列出的維度。這個問題對你來說可能有用也可能沒用,但是我想我會提到它,因爲我遇到了這個問題。 –

+0

有很多關於**加載範圍值到內存**的帖子,無需定義大小。你可以像'Dim oValues as Variant:oValues = ActiveSheet.UsedRange.Value'這樣的操作,將所有使用範圍的值(包括空值)加載到內存中。使用'LBound/UBound(oValues,1/2)'檢索邊界:1:rows,2:cols – PatricK

回答

0

您可以直接從範圍指定一個數組,無需循環。數組類型必須是變體。

例如

dim myArr() as Variant 
dim myRng as Range 

Set myRng = Worksheets("Sheet1").Range("A1:Z100") 
myArr = myRng.Value 
'... do stuff with myArr 

Set myRng = Worksheets("Sheet2").Range("A1:Z100") 
myRng.Value = myArr 

Chip Pearson有很多有用的數組處理例程。

1

就我看來,你只是爲了價值觀。但是,與工作表的每次交互都比變量之間的交互慢得多。無論是使用一個輔助變量,做你的方式:

Dim xxx As Variant 
xxx = ws1.Cells(i, 11).Resize(numRows, 1).Value 
For r = 1 To lastcol3 
    For i = 1 To numRows 
    arr(i, r) = xxx(i, 1) 
    Next 
Next 

或將更快去與()()選項是這樣的:

ReDim arr(1 To lastcol3) 
Dim xxx As Variant 
xxx = Application.Transpose(ws1.Cells(i, 11).Resize(numRows, 1).Value) 
For r = 1 To lastcol3 
    arr(r) = xxx 
Next 

,但得到的值,你需要解決它像arr(r)(i)這可能會在開始時引起混淆。但是這也取決於你以後要做什麼。

+0

This釘它! –

+0

感謝您的幫助。請原諒我不太關注,我對vba比較陌生,但仍然找到我的腳。 雖然你的方法似乎工作,它仍然需要我遍歷所有行「我」如果我沒有弄錯?我試過了,它仍然運行得很慢。我想創建1000行5000列的數組。每次我增加r的值時,數據列都會發生變化,我希望從r = 1到lastcol3添加到數組的列中,而不必逐行進行。 我誤解了你的解釋,這是什麼? – Kettle

+0

要真正有幫助,最好知道你需要5000+次以上的原因嗎?正如在問題'arr(i,r)= ws1.Cells(i,11)'中,你陣列中的所有5k列都保存着完全相同的數據,這對我們來說沒有任何意義。也許一個不同的方法會更有幫助,然後加速1代碼的sniped ... –

相關問題