在Excel VBA中提高range()。value的速度

时间:2017-10-13 06:39:56

标签: excel vba excel-vba dictionary

我目前有一个代码,简而言之,我收到一个数组字典,并将该字典的每个项目分配给一系列单元格。正如预期的那样,问题是大量的细胞变得非常慢。

我使用的初始代码是:

For i = 1 To clxRtrn.Count
    For j = 0 To UBound(clxRtrn.Item(i))
          Worksheets("Sheet1").Cells(2 + i, 2 + j).value = clxRtrn(i)(j)
    Next j
Next i

请注意:

clxRtrn.Count 'number of rows
UBound(clxRtrn.Item(i)) 'Number of columns

我用以下方式描述了速度:

Sub DebuggingSpeed()
    Const n = 5
    Dim sngTime As Single
    Dim i As Long
    sngTime = Timer
    For i = 1 To n
        Call SQLite_Query2
    Next i
    sngTime = (Timer - sngTime) / n
    Debug.Print n & " runs in an average of " & Format(sngTime, "0.00") & " seconds."
End Sub

对于包含14列(总共7014项)的501行的字典,我得到以下结果:

5 runs in an average of 0,35 seconds.

对于包含84列(总共1260252项)的15003行的字典,我得到以下结果:

5 runs in an average of 37,32 seconds.

this case中提出的问题不同,我必须在excel表中显示dict的结果(因此,循环遍历单元格)。我不想仅仅操纵数组中的数据,必须显示它们。

编辑: 根据{{​​3}},我们的想法是尽量减少工作表和VBA代码之间的流量。我采取了不同的方法。简而言之,我遍历字典并将每一行写入工作表:

 For i = 1 To clxRtrn.Count
    Worksheets("Database").Range(Cells(1 + i, 2), Cells(1 + i, UBound(clxRtrn.Item(i)))).value = clxRtrn(i)
    Next i

这大大加快了执行速度:

5 runs in an average of 0,03 seconds.
5 runs in an average of 5,32 seconds.

此操作还有改进的空间吗?

0 个答案:

没有答案