Vba 更新Excel表格中大数据的最快方法
我在Excel中有一个很大的表,它必须从JSON源更新。 在解析JSON之后,数据以字典的形式被获取并提供给我。 我迭代数据中的所有字段并更新表中的相关列Vba 更新Excel表格中大数据的最快方法,vba,performance,excel,Vba,Performance,Excel,我在Excel中有一个很大的表,它必须从JSON源更新。 在解析JSON之后,数据以字典的形式被获取并提供给我。 我迭代数据中的所有字段并更新表中的相关列 Public Function GetFields(ByVal sApiEndpoint As String, ByVal sSheetName As String, ByVal sTableName As String) ......... 'Parse the Json Response and Update Tabl
Public Function GetFields(ByVal sApiEndpoint As String, ByVal sSheetName As String, ByVal sTableName As String)
.........
'Parse the Json Response and Update Table
Dim dicParsed As Dictionary
With ActiveWorkbook.Sheets(sSheetName).ListObjects(sTableName)
Dim iCount As Integer
iCount = 1
Set dicParsed = JsonConverter.ParseJson(sRestResponse)
For Each Item In dicParsed("data")
iCount = iCount + 1
Next Item
If .ListRows.Count >= 1 Then
.DataBodyRange.Delete
End If
Set Rng = .Range.Resize(iCount, .HeaderRowRange.Columns.Count)
.Resize Rng
Dim iRow As Integer
iRow = 0
For Each Item In dicParsed("data")
On Error Resume Next
.DataBodyRange.Cells(iRow, .ListColumns("name").Index) = Item("name")
.DataBodyRange.Cells(iRow, .ListColumns("id").Index) = Item("id")
.DataBodyRange.Cells(iRow, .ListColumns("type").Index) = Item("schema")("type")
iRow = iRow + 1
Next Item
End With
.........
End Function
在关闭计算和更新的情况下,更新一个500行15列的表大约需要5分钟
在这种情况下,有没有更快的方法来更新数据?您可以将更新推送到数组,然后批量更新表
Public Function GetFields(ByVal sApiEndpoint As String, ByVal sSheetName As String, ByVal sTableName As String)
.........
'Parse the Json Response and Update Table
Dim dicParsed As Dictionary
With ActiveWorkbook.Sheets(sSheetName).ListObjects(sTableName)
Dim iCount As Integer
Dim arrDataBuffer() As Variant
iCount = 1
Set dicParsed = JsonConverter.ParseJson(sRestResponse)
For Each Item In dicParsed("data")
iCount = iCount + 1
Next Item
If .ListRows.Count >= 1 Then
.DataBodyRange.Delete
End If
Set Rng = .Range.Resize(iCount, .HeaderRowRange.Columns.Count)
.Resize Rng
ReDim arrDataBuffer(iCount, .HeaderRowRange.Columns.Count)
Dim iRow As Integer
iRow = 0
For Each Item In dicParsed("data")
On Error Resume Next
arrDataBuffer(iRow, .ListColumns("name").Index - 1) = Item("name")
arrDataBuffer(iRow, .ListColumns("id").Index - 1) = Item("id")
arrDataBuffer(iRow, .ListColumns("type").Index - 1) = Item("schema")("type")
iRow = iRow + 1
Next Item
.DataBodyRange = arrDataBuffer
End With
.........
End Function
如果要立即回答,为什么要问这个问题?请注意,您可以通过使用更高效的JSON解析器以及将
.ListColumns(“…”).Index
存储在变量中而不是在循环中调用它来缩短执行时间。我在键入问题时找到了答案。我们可以在发布之前回答这个问题,这样我们就可以添加到知识库中。请详细说明您的评论好吗?对JSON解析器有什么建议吗?使用数组来加速执行是一件很常见的事情,关于这个问题已经有了数千个答案。我确实明白你的意图,但你的帖子可能太具体了,对其他人没有用处。看看3种不同的JSON实现。