![](/img/trans.png)
[英]Using Excel VBA, How do I limit the results of a query using ADODB.connection & 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.