2016-07-28 28 views
1

我在函數中有一堆循環,它們循環遍歷一個我定義爲動態範圍的數組。下面是我想達到將範圍放入數組以獲得更高效的循環

Dim myArray As Range 
myArray(x, j) 'So the array loops through each column and then each row in that column 
For i = 1 to lastRow 
If myArray(x, j).Value = myArray(x, i).Value Then 
'Do something 

我有一堆這些迴路的一些僞代碼,它是與100+行的數據集超慢。基本上無論在哪裏,我都將myArray定義爲Range,我想將其更改爲Variant,以便我可以a)遍歷數組,並b)使用該數組檢查值是否相同,而不是檢查範圍,這可能是性能問題的根本原因時,有200行* 500列

編輯

我如何轉換動態定義的範圍到一個數組?

我需要做這樣的事嗎?

lastRow = UBound(myArray, 1) 
lastColumn = UBound(myArray, 2) 

然後

If myArray(x, j) = myArray(x, i) Then 
'Do something 
+0

那麼你的問題是什麼?並意識到「我怎麼能做到這一點?」太寬泛了。 –

+0

@ScottCraner公平點,給我一秒鐘,我會添加更多的代碼來澄清 – MJ95

回答

2

要加載範圍到一個數組:

Dim RngArr() as Variant 
RngArr = WorkSheets("Sheet1").Range("A1:D4").Value 

這將創建和數組,它是4×4。

要使範圍動態

Dim RngArr() as Variant 
Dim lastrow as Long 
Dim lastColumn as Long 

lastrow = 10 
lastColumn = 10 

With WorkSheets("Sheet1") 
    RngArr = .Range(.Cells(1,1),.Cells(lastrow,lastColumn)).Value 
End With 

以這種方式加載數組時,兩個維度的下限都是1,而不是0,因爲它是其他情況。

要通過陣列迭代:

Dim i as long, j as long 
For i = lbound(RngArr, 1) to Ubound(RngArr, 1) 
    For j = lbound(RngArr, 2) to Ubound(RngArr, 2) 
     'Do something with RngArr(i,j) 
    Next j 
Next i 

的LBOUND和UBOUND的第二個標準是維度。

+0

這將如何工作的動態範圍?所以行和列都是變量 – MJ95

+0

你可以設置範圍任何常規的設置範圍的方法。 –

+0

好的,所以在我的情況下,我會切換兩個循環,因爲我迭代列x行,對吧?然後比較單元格中的值,如果RngArr(i,j)<>「空白」,則可以執行...... – MJ95