将数据数组项分配给范围值的最快方法是什么
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
我正在为 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