繁体   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