![](/img/trans.png)
[英]VBA: ADODB recordset - SQL query return value - convert to number returned in a function
[英]#Value Error in a vba function to return a recordset
我寫了下面的 vba function 旨在將 SQL 記錄集返回到單元格中。 使用此 function 時出現 #Value 錯誤。 它應該得到兩個 arguments,即兩個單元格,然后簡單地返回 Yes 或 No。我檢查了 SQL 查詢,它在編寫為子程序時工作正常。 所以請原諒用 * 替換一些 sql 命令
Public Function TrRe(No1 As String, No2 As String) As ADODB.Recordset
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim SourceText As String
Set cn = New ADODB.Connection
cn.ConnectionString = _
"Provider=MSOLEDBSQL;Server=****;Database=*****;Integrated Security=SSPI"
cn.Open
Set rs = New ADODB.Recordset
SourceText = " SELECT " & _
" CASE " & _
" WHEN ***** LIKE 'TEST%' OR *****=1 THEN 'Yes' " & _
" ELSE 'No " & _
" END " & _
" FROM *** "
" WHERE ****=" & No1 & _
" AND ****=" & No2
rs.ActiveConnection = cn
rs.Source = SourceText
rs.CursorType = adOpenForwardOnly
rs.LockType = adLockReadOnly
rs.Open
Set TrRe= rs
rs.Close
cn.Close
Set cn = Nothing
End Function
我會很感激你的意見/幫助。
更新:a)查詢總是返回一個 1x1 記錄集,這是或否。b)代碼應該寫為 Function,因為我想讓用戶選擇輸入。
正如@Rory 所說,您不能將記錄集寫入單元格。 RecordSet
是一個 object,包含所有類型的信息,例如字段名稱和類型、state、連接、以某種方式讀取有關當前行的信息等等。 您不能(也不想)將所有內容寫入單元格。
您的 sql 語句將返回一行,其中只有一個字段(包含字符串yes
或no
)。 在這種情況下,您可以簡單地編寫(注意此語句沒有Set
)
TrRe = rs(0)
這是一個快捷方式,獲取當前行的第一個字段。 當前行是第一行,假設 sql 語句執行成功並返回至少一行。 要移動到下一行,您將使用rs.MoveNext
。 要檢查是否還有更多行,請使用If rs.EOF Then
。
如果您發出 sql 的返回值不止於此,則有兩個方便的命令:
(1) 要將返回的完整數據寫入 Excel,請使用Range.CopyFromRecordset
ThisWorkbook.Sheets(1).Range("A2").CopyFromRecordset rs
(2) 要將所有數據讀入二維數組,請使用RecordSet.GetRows
Dim data as Variant
data = rs.GetRows
dim row as long, col as long
For row = 0 To UBound(data, 2) ' Index for rows = 2
For col = 0 to UBound(data, 1) ' Index for fields (columns) = 1
... (do your stuff here)
next col
Next row
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.