VBA - 使用 Typeof ... ADODB.Recordset 导致编译错误

VBA - Using Typeof ... Is ADODB.Recordset Results in Compile Error

我正在构建一个包含一组支持子函数的函数来创建 ADOX.Catalog 对象,以帮助我构建 Access 数据库生成的自动化。

我喜欢对我的应用程序使用后期绑定,因为我的用户群并不总是拥有相同版本的办公应用程序,所以我不能总是依赖他们拥有与我正在使用的相同版本的库打电话。

我的 public 函数接受多个对象作为参数,但在我开始处理它们之前,我需要确保它们实际上是 ADODB.Recordset 对象。我参考了位于 https://msdn.microsoft.com/en-us/library/s4zz68xc.aspx 的 msdn 文章开始,我尝试根据文章的建议使用 If TypeOf ... Is ADODB.Recordset,但它会生成以下错误:

Compile error:
User-defined type not defined

这是我的代码片段。第一个违规行是 TypeOf adoRsColumns Is ADODB.Recordset:

Public Function ADOX_Table_Factory( _
ByVal strTblName As String, _
Optional ByVal adoRsColumns As Object, _
Optional ByVal adoRsIndexes As Object, _
Optional ByVal adoRsKeys As Object _
) As Object

'Init objects/variables.
Set ADOX_Table_Factory = CreateObject("ADOX.Table")

'Begin interactions with the new table object.
With ADOX_Table_Factory
    .Name = strTblName

    'Check if we've received an ADO recordset for the column(s).
    If TypeOf adoRsColumns Is ADODB.Recordset Then
        'Check that the recordset contains rows.
        If Not (adoRsColumns.BOF And adoRsColumns.EOF) Then
            'Loop through the column definitions.
            Do
                .Columns.Append ADOX_Column_Factory(adoRsColumns.Fields(0), adoRsColumns.Fields(1), adoRsColumns.Fields(2), adoRsColumns.Fields(3))
            Loop Until adoRsColumns.EOF
        End If
    End If

我的谷歌搜索没有产生任何帮助我解决这个错误的结果。如果我设置对 ADO 库的引用,我已经确认此代码有效。我还通过 TypeName 函数确认了对象的名称是 Recordset。但是,如果我将 TypeOf adoRsColumns Is ADODB.Recordset 替换为 TypeOf adoRsColumns Is Recordset,则测试评估为 false,并且不会执行所需的代码。我没有求助于与 TypeName 的输出进行字符串比较,因为如 MSDN 文章所述,TypeOf ... Is 更快。

在此先感谢您的帮助!

回顾一下,如果您的项目中没有包含 ADO 引用,您会在这一行收到编译错误:

If TypeOf adoRsColumns Is ADODB.Recordset Then

没有引用,VBA 无法识别 ADODB.Recordset 这种情况基本上与您试图在没有引用的情况下声明 Dim rs As ADODB.Recordset 相同。该声明将触发相同的编译错误。

没有引用就无法将 ADODB.Recordset 用作可识别的类型。

作为替代方法,您可以创建自定义函数来检查对象是否支持方法或 属性,它在 ADODB.Recordset 中可用但在 DAO.Recordset[ 中不可用=20=]

这个检查记录集是否包含 Supports 方法。该方法在 ADODB 中可用,但在 DAO Recordset 中不可用。

Public Function IsAdoRecordset(ByRef pObject As Object) As Boolean
    Const adAddNew As Long = 16778240
    Dim lngTmp As Long
    Dim blnReturn As Boolean
    Dim strMsg As String

On Error GoTo ErrorHandler

    blnReturn = False
    If TypeName(pObject) = "Recordset" Then
        lngTmp = pObject.Supports(adAddNew)
        blnReturn = True
    End If

ExitHere:
    On Error GoTo 0
    IsAdoRecordset = blnReturn
    Exit Function

ErrorHandler:
    Select Case Err.Number
    Case 438  ' Object doesn't support this property or method
        ' leave blnReturn = False
    Case Else
        ' notify user about any other error
        strMsg = "Error " & Err.Number & " (" & Err.Description _
            & ") in procedure IsAdoRecordset"
        MsgBox strMsg
    End Select
    Resume ExitHere

End Function