Vba 更新Excel表格中大数据的最快方法

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

我在Excel中有一个很大的表,它必须从JSON源更新。 在解析JSON之后,数据以字典的形式被获取并提供给我。 我迭代数据中的所有字段并更新表中的相关列

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分钟


在这种情况下,有没有更快的方法来更新数据?

您可以将更新推送到数组,然后批量更新表

  • 调暗任何类型的数组而不给出大小。如果有不同类型的列(如数字和字符串),请使用Variant
  • 当您知道最终尺寸时,重新分配阵列
  • 用数据更新数组
  • 将表databody设置为与数组相等
  • 使用下面的代码,我能够将更新时间从5分钟缩短到不到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实现。