最有效的方法是在大范围内解析到数组VBA

时间:2016-10-06 13:47:41

标签: arrays excel vba excel-vba matrix

我在excel中有大量数据,我想将其解析为用户定义函数的数组。范围是2250 x 2250.通过for循环解析每个单元格需要太长时间,并且它太大而无法通过此方法分配给数组:

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

在这里集思广益,解析每一列并加入数组会更有效吗?有什么想法吗?

由于

3 个答案:

答案 0 :(得分:4)

你几乎就在那里。

您需要的代码是:

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

请注意,我使用了该范围的.Value2属性,而不仅仅是' Value',它会读取格式和区域设置,并且可能会破坏任何日期

另请注意,我还没有为Redim打扰并指定数组的维度:Value和Value2属性是一个二维数组,(1到Rowcount,1到Col Count )...除非它是一个单细胞,它将是一个标量变体,它打破了任何预期阵列的下游代码。但是,对于已知的2250 x 2250范围,这不是你的问题。

如果反转操作并将数组写回某个范围,则需要将接收范围的大小完全设置为数组的尺寸。再一次,不是你问的问题的问题:但这两个操作通常是一起的。

一般原则是每次击中'到工作表大约需要二十分之一秒 - 有些机器速度要快得多,但它们都有糟糕的日子 - 并且“击中”#39;或者将单个单元格读取到变量几乎与将七百万个单元格范围读入变量数组完全相同。两者都比在一个单元格中一次读取该范围快几倍

无论哪种方式,您都可以将VBA中的任何操作计算为在零时间内完成“读入”后的操作。并停止与工作表交互。

这些数字都非常粗糙和准备好了,但是一般原则会持续到你开始分配不适合工作记忆的阵列的那一刻,再一次,那就是今天不是你的问题。

当你完成时,请记住Erase数组变体,而不是依赖它超出范围:这将产生差异,范围如此。

答案 1 :(得分:2)

这很好用。

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

答案 2 :(得分:0)

我认为最好的选择是:

  1. 尝试将数据限制为合理的数字,例如每次1,000,000个值。
  2. 添加一些错误处理以捕获Out of Memory错误,然后重试,但将大小减半,然后减少三分之一,等等......直到它工作。
  3. 无论哪种方式,如果我们使用的数据集大小为5,000,000,并且您希望确保程序运行,则需要调整代码以切断数据。