簡體   English   中英

VBA - 使用 Typeof ... 是 ADODB.Recordset 導致編譯錯誤

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

我正在構建一個帶有一組支持子功能的函數來創建 ADOX.Catalog 對象,以幫助我構建 Access 數據庫生成的自動化。

我喜歡對我的應用程序使用后期綁定,因為我的用戶群並不總是擁有相同版本的辦公應用程序,所以我不能總是依賴他們擁有我正在調用的相同版本的庫。

我的公共函數接受多個對象作為參數,但在開始處理它們之前,我需要確保它們實際上是 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用作可識別的類型。

作為替代方法,您可以創建一個自定義函數來檢查對象是否支持在ADODB.Recordset可用但在DAO.Recordset不可用的方法或屬性

這個檢查記錄集是否包含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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM