ADODB.Recordset的VBA excel中出现运行时错误91

ADODB.Recordset的VBA excel中出现运行时错误91,excel,ms-access,vba,Excel,Ms Access,Vba,尝试在excel应用程序中发送sql语句后,出现运行时错误91。以下是代码: 'Module Consts: Public rst1 As New ADODB.Recordset 'defined in a constants module 'Module Conn: Public Sub GetDynSQLQuery(ByVal strQuery$, ByVal rs As ADODB.Recordset) Set rs = Nothing If cn = "" Then

尝试在excel应用程序中发送sql语句后,出现运行时错误91。以下是代码:

'Module Consts:
Public rst1 As New ADODB.Recordset 'defined in a constants module
'Module Conn:
Public Sub GetDynSQLQuery(ByVal strQuery$, ByVal rs As ADODB.Recordset)   
    Set rs = Nothing
    If cn = "" Then Call ConnectToDb 'Sub set the variable "cn" with connectionstring to db and open the connection

    With rs
      .Source = strQuery       'Here comes the error
      .ActiveConnection = cn
      .CursorType = adOpenForwardOnly
      .LockType = adLockReadOnly
      .Open
    End With
End Sub

'Form1:
strSql = "SELECT * FROM tbl1"
Call GetDynSQLQuery(strSql, rst1)
错误消息:

对象变量或未设置块变量


我做错了什么,我看不出来。

在sub中,您要做的第一件事是清空刚才传递的参数(使用
设置rs=Nothing
),然后再次使用
rs

所以除非
rs
是一个类似公共的变量,并且它是在
ConnectToDb
中填写的,
在使用前保持为空,因此出错

首先,尝试删除
Set rs=Nothing
,如果这还不够,您需要查看
ConnectToDb

其次,您在子系统内部修改记录集,但尝试在外部使用它。
这里的问题是使用了
ByVal
,它传递了对象引用的副本,因此无法修改初始对象,因为记录集在子对象之外是空的!;)


当OP测试时,
rst1.RecordCount>0
为假(
rst1.RecordCount
等于-1),
他将
.CursorType
设置为
adOpenKeySet
而不是
adOpenForwardOnly



设置rs=Nothing``然后使用
rs
。因此,除非
rs`是一个类似于公共的变量,并且填充在
ConnectToDb
中,否则它在使用前将保持为空,从而导致错误@R3uK rs设置为
Nothing
,或者您的确切意思是什么?我对前面的格式不好,请参阅答案以便于解释!首先,您需要将
Option Explicit
粘贴在顶部。然后,应该打开连接,然后该过程可能是一个返回记录集的
函数。。。。尽管我会认真考虑这里的意大利面。使连接尽可能短,并使参数和返回值优于全局值。从1994年开始删除
Call
关键字,并且
ByVal sql As String
将比
strQuery$
更清晰-请参见Docs.SO。也可以参见Docs.SO。抱歉,对我来说,它不起作用。我没有得到任何响应数据。@yuro:如何使用
GetDynSQLQuery
?我使用
GetDynSQLQuery
只发送一条sql语句,说明如何查看上面的内容。@yuro:您仍然有错误吗?
cn
是公共/模块变量吗?是的。cn被定义为=>
Public cn作为公共模块
Consts
中的新ADODB.Connection
Public Sub GetDynSQLQuery(ByVal strQuery$, rs As ADODB.Recordset)   
    'Sub set the variable "cn" with connectionstring to db and open the connection
    If cn = vbNullString Then Call ConnectToDb

    With rs
      .Source = strQuery       'No more error!^^
      .ActiveConnection = cn
      .CursorType = adOpenKeySet
      .LockType = adLockReadOnly
      .Open
    End With
End Sub