我有一本大型字典 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... 一直在这里。:)