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
我正在构建一个包含一组支持子函数的函数来创建 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