将数据数组项分配给范围值的最快方法是什么

what is the fastest way to assign data array items to range values

我正在为 SQL 服务器数据库开发一个 excel 客户端。

当我select从数据库到客户端记录的数据都保存在数组中。然后使用变体数组将这些数组 "injected" 放入 Excel 表中。

此技术比分配单个单元格值要快得多,但在某些特定上下文中似乎会失败。

当数据值为vbNullString时,不分配与该项目对应的范围单元格。最糟糕的是,如果第一个项目是 vbNullString,none 个项目将保存到范围中。 我的猜测是 vbNullString 被转换为 null 作为变体并且变体数组的维数错误。

还有其他解释吗?

例如

ByRef loTable As ListObject,
ByRef sItems() As String

是子程序执行以下代码的参数,其中 loTable 是一个 Excel Table (ListObject) 和 sItems 我要分配到 Excel Table loTable 范围内的数据

Dim lCount as Long
Dim vItems() as Variant
lCount = UBound(sItems)-LBound(sItems)+1
'size vItems as a 2D array - required to fetch a range
If (lCount > 0) Then ReDim vItems(1 To lCount, 1 To 1)
'copy string to variant
Dim i As Integer
For i = LBound(sItems) To UBound(sItems)
    vItems(i, 1) = sItems(i)
Next i
Dim olrs As ListRows
Set olrs = loTable.ListRows
With loTable
    If (lCount > 0) Then
        If (Not (.DataBodyRange Is Nothing)) Then .DataBodyRange.Delete
        olrs.Add
        If (lCount = 1) Then
            olrs(olrs.Count).Range.Cells(1, 1).Value = sItems(LBound(sItems))
        Else
            .DataBodyRange.Resize(lCount, 1).Value = vItems
        End If
    Else
        .DataBodyRange.Delete
    End If
End With 'loTable

我的问题是:您是否尝试过这样一个范围(table)的值赋值以及如何处理数组中的空项以实现快速赋值。 循环遍历数组项并逐个添加只需永远。

这样的事情会有帮助吗?

'Declarations section
Private Const gsPROVIDER as String = [Provider]
Private Const gsDATA_SOURCE as String = [Source]
Private Const gsINITIAL_CATALOG as String = [Catalog]
Private Const gsUSER_ID as String = [User ID]
Private Const gsPASSWORD as String = [Password]

Private Sub Test
    Dim rsData As Object
    Dim sConnect As String
    Dim sSQL As String

    sConnect = "Provider=" & gsPROVIDER & _
               "Data Source=" & gsDATA_SOURCE & _
               "Initial Catalog=" & gsINITIAL_CATALOG & _
               "User ID=" & gsUSER_ID & _
               "Password=" & gsPASSWORD
    sSQL = 'SQL in a string

    Set rsData = CreateObject("ADODB.Recordset")
    rsData.Open sSQL, sConnect

    If Not rsData.EOF Then
        Worksheets(1).ListObjects(loTable).DataBodyRange.CopyFromRecordset rsData
    Else
        MsgBox "No data found!", vbCritical, "Error!"
    End If

    rsData.Close
    Set rsData = Nothing
End Sub