动态添加数据到 ADODB Recordset
Add data to ADODB Recordset dynamically
我想知道是否可以使用命名范围列表将数据添加到 ADODB 记录集中,而无需在单独的行上指定名称。
我试图计算名称,但记录集将我的变量作为名称而不是对其进行计算。
这会导致错误,因为数据库中没有包含我的变量名的名称。
Set rst = New ADODB.Recordset
SqlStr = "SELECT * From " & table & ";"
rst.Open SqlStr, conn, adOpenDynamic, adLockOptimistic 'adLockPessimistic
If rst.EOF Then
rst.AddNew
End If
namedCells = Array("orgNr", "name")
With rst
For i = LBound(namedCells) To UBound(namedCells)
MsgBox (namedCells(i) & " = " & Range(namedCells(i)))
!orgNr = Range(namedCells(i)) 'works fine
!namedCells(i) = "!orgNr" 'gives error du to "namedCells(i)" is not present in database
Next i
End With
您可以尝试使用 .fields :
For i = LBound(namedCells) To UBound(namedCells)
MsgBox (namedCells(i) & " = " & Range(namedCells(i)))
rst!orgNr = Range(namedCells(i)) 'works fine
rst.fields(namedCells(i)) = Range(namedCells(i))
Next i
!
bang 运算符只是隐式默认成员调用的 shorthand 符号。
当你这样做时:
Debug.Print rs!SomeField
实际情况是这样的:
Debug.Print rs.[Default].[Default]("SomeField").[Default]
三个隐式默认成员调用 - 第一个针对 Recordset
对象的是 Recordset.Fields
属性,它产生一个 Fields
对象引用,它本身有一个默认值成员 Item
,它接受一个 String
参数 - !
bang 运算符将其后面的标识符作为此字符串参数的值传递(这就是为什么您需要将其括在方括号中,如果它不是一个有效的 VBA 标识符名称) - 这个 Item
成员产生一个 Field
对象, 也 有一个默认成员,Value
.因此,完整拼写的 bang 运算符符号变为:
Debug.Print rs.Fields.Item("FieldName").Value
现在, 参数化(/索引)的默认成员调用通常被认为是好的,所以这也完全可以:
Debug.Print rs.Fields("FieldName").Value
任何其他涉及隐式默认成员调用并使您的代码说一套......实际上做另一套。
请注意,您在该代码段中的这些不合格 Range
调用是 implicitly referring to whatever the ActiveSheet
is,这是极其常见的错误来源。
请参阅 Modern VBA Best Practices: Default Members 了解有关默认成员及其最佳实践的更多信息(我写了那篇文章)。
我想知道是否可以使用命名范围列表将数据添加到 ADODB 记录集中,而无需在单独的行上指定名称。
我试图计算名称,但记录集将我的变量作为名称而不是对其进行计算。 这会导致错误,因为数据库中没有包含我的变量名的名称。
Set rst = New ADODB.Recordset
SqlStr = "SELECT * From " & table & ";"
rst.Open SqlStr, conn, adOpenDynamic, adLockOptimistic 'adLockPessimistic
If rst.EOF Then
rst.AddNew
End If
namedCells = Array("orgNr", "name")
With rst
For i = LBound(namedCells) To UBound(namedCells)
MsgBox (namedCells(i) & " = " & Range(namedCells(i)))
!orgNr = Range(namedCells(i)) 'works fine
!namedCells(i) = "!orgNr" 'gives error du to "namedCells(i)" is not present in database
Next i
End With
您可以尝试使用 .fields :
For i = LBound(namedCells) To UBound(namedCells)
MsgBox (namedCells(i) & " = " & Range(namedCells(i)))
rst!orgNr = Range(namedCells(i)) 'works fine
rst.fields(namedCells(i)) = Range(namedCells(i))
Next i
!
bang 运算符只是隐式默认成员调用的 shorthand 符号。
当你这样做时:
Debug.Print rs!SomeField
实际情况是这样的:
Debug.Print rs.[Default].[Default]("SomeField").[Default]
三个隐式默认成员调用 - 第一个针对 Recordset
对象的是 Recordset.Fields
属性,它产生一个 Fields
对象引用,它本身有一个默认值成员 Item
,它接受一个 String
参数 - !
bang 运算符将其后面的标识符作为此字符串参数的值传递(这就是为什么您需要将其括在方括号中,如果它不是一个有效的 VBA 标识符名称) - 这个 Item
成员产生一个 Field
对象, 也 有一个默认成员,Value
.因此,完整拼写的 bang 运算符符号变为:
Debug.Print rs.Fields.Item("FieldName").Value
现在, 参数化(/索引)的默认成员调用通常被认为是好的,所以这也完全可以:
Debug.Print rs.Fields("FieldName").Value
任何其他涉及隐式默认成员调用并使您的代码说一套......实际上做另一套。
请注意,您在该代码段中的这些不合格 Range
调用是 implicitly referring to whatever the ActiveSheet
is,这是极其常见的错误来源。
请参阅 Modern VBA Best Practices: Default Members 了解有关默认成员及其最佳实践的更多信息(我写了那篇文章)。