ADODB.Recordset的VBA excel中出现运行时错误91
尝试在excel应用程序中发送sql语句后,出现运行时错误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
'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