簡體   English   中英

vba function 中的 #Value 錯誤以返回記錄集

[英]#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 語句將返回一行,其中只有一個字段(包含字符串yesno )。 在這種情況下,您可以簡單地編寫(注意此語句沒有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.

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