2016-07-28 31 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