动态添加数据到 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 了解有关默认成员及其最佳实践的更多信息(我写了那篇文章)。