#Value返回记录集的vba函数出错



我编写了下面的vba函数,旨在将SQL记录集返回到单元格中。当我使用此函数时,我得到#Value错误。它应该得到两个参数,即两个单元格,并简单地返回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( 代码应该写成一个函数,因为我想让用户选择输入。

AS@Rory指出,不能将记录集写入单元格。RecordSet是一个对象,包含所有类型的信息,例如字段名称和类型、状态、连接、以某种方式读取的当前行的信息等等。你不能(也不想(将所有这些都写入一个单元格。

sql语句将返回一行,其中只有一个字段(包含字符串yesno(。在这种情况下,您可以简单地编写(注意,该语句没有Set(

TrRe = rs(0)

这是一个快捷方式,获取当前行的第一个字段Current行是第一行,假设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

最新更新