最有效的方法来parsing大范围内的数组VBA

我在Excel中有一个大范围的数据,我想分析一个用户定义函数的数组。 范围是2250 x 2250.通过for循环parsing每个单元格需要很长的时间,并且这个过大而无法通过此方法分配给数组:

dim myArr as Variant myArr = range("myrange") 

只是在这里集思广益,parsing每一列并join数组会更有效率吗? 有任何想法吗?

谢谢

你快到了

你需要的代码是:

 Dim myArr as Variant myArr = range("myrange").Value2 

请注意,我正在使用范围的.Value2属性,而不仅仅是“值”,它读取格式和区域设置,并可能会破坏任何date

请注意,我还没有打扰Redim并指定数组的维数:Value和Value2属性是一个二维数组,(1到Rowcount,1到Col Count)…除非它是单个单元格,这将是一个标量变体,它打破了期望数组的所有下游代码。 但是,这不是你已知的2250 x 2250范围的问题。

如果反转操作,并将数组写回范围,则需要将接收范围的大小精确设置为数组的维数。 再次,不是你问你所问的问题:但这两个行动通常一起去。

总的原则是,每个“打到”工作表需要大约二十分之一秒 – 有些机器更快,但他们都有糟糕的日子 – “打”或读一个单元格的variables几乎是完全就像读取一个七百万个单元格的范围到一个variables数组一样。 两者的速度比一次读取一个单元的速度快几百万倍。

无论采用哪种方式,您都可以将VBA中的任何操作计数为零,一旦您完成“读入”并停止与工作表交互操作。

这些数字都是非常粗糙和准备好的,但是一般的原则将会持续下去,直到你开始分配不适合工作记忆的数组为止。现在,这不是你的问题。

请记住在完成时Erase数组variables,而不是依靠它超出范围:这将有所作为,与此范围的范围。

我只是做了一个testing,在我的机器上,下面需要大约1-2秒的时间来执行。 这听起来像你可以只将值分配给范围对象

 Public Sub get_Range() Debug.Print Now() Dim myRange As Range: Set myRange = Range("A1:BEA5000") 'over 7,000,000 Cells Dim Cell As Range For Each Cell In myRange 'Do something here Next Debug.Print Now() End Sub 

这工作正常。

 Sub T() Dim A As Variant A = Range("A2").Resize(2250, 2250).Value2 Dim i As Long, j As Long For i = 1 To 2250 For j = 1 To 2250 If i = j Then A(i, j) = 1 Next j Next i Range("A2").Resize(2250, 2250).Value2 = A End Sub