提高单元更新性能

提高单元更新性能

我有一本大型字典 jDict ,本例中有 2300 个元素,但其他元素有 150,000 多个。我试图将这些元素添加到单元格行中。我循环遍历字典中的元素 jAcct 并将它们逐行添加到同一工作簿中的工作表中:wksAccts。

    For Each jAcct In jDict("records")
        For intArrayCount = 0 To UBound(strColumnsArray)
            StartTime = Timer
                wksAccts.Cells(lngCount, intArrayCount + 1) = jAcct(strColumnsArray(intArrayCount))
            UpdateCellTime = UpdateCellTime + (Timer - StartTime)
        Next intArrayCount
        lngCount = lngCount + 1
    Next jAcct

在这个例子中,处理计时器包围的一行总共需要 5 秒以上。按照惯例,REST API 在 0.35 秒内返回数据,而我在 0.25 秒内将 json 解析为字典 JDict。

这是有问题的代码行:

wksAccts.Cells(lngCount, intArrayCount + 1) = jAcct(strColumnsArray(intArrayCount))

我正在寻找一种方法来加速将字典中的特定元素(在数组 strColumnsArray 中命名)传输到单元格中。在此过程之后,我将这些单元格变成一个表格。先在内存中处理表格,然后将该表格提交到单元格是否有帮助?如果可以,我将不胜感激。

基本上,有没有更快的方法来做到这一点?

答案1

.copyFromRecordset 速度更快。即使 150,000 条记录现在也只需 0.5 秒。

循环之前,设置记录集:

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Fields.Append "invoiceNo", adVarChar, 10, adFldMayBeNull
rs.Fields.Append "partNo", adVarChar, 30, adFldMayBeNull
rs.Fields.Append "invoiceDate", adDate, , adFldMayBeNull
rs.Fields.Append "orderQty", adDouble, , adFldMayBeNull
rs.Open

将有问题的代码行替换为:

rs.Fields(strColumnsArray(intArrayCount)) = jAcct(strColumnsArray(intArrayCount))

循环结束时:

wksAccts.Range("A2").CopyFromRecordset rs

当我写问题时,我突然想到了这个想法,并把它加在了最后。我发现花时间为别人分解和简化一个问题,我经常会自己找到答案。我的草稿文件夹中有上千个问题,我从未发送过,因为当我分解到足以沟通的时候,答案就变得清晰了。感谢 Stack Exchange... 一直在这里。:)

相关内容