VBA中的运行时错误91适用于ADODB.Recordset

时间:2017-02-13 12:01:21

标签: excel vba excel-vba ms-access 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 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)

错误讯息:

  

未设置对象变量或With-block变量

我做错了什么我看不见。

1 个答案:

答案 0 :(得分:2)

你在sub中做的第一件事是你清空刚刚通过的Argument(Set rs = Nothing),然后再次使用rs

所以除非rs类似公众的变量并且已填入ConnectToDb , 在使用之前仍然是空的,错误的错误!

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

其次,你修改了sub中的Recordset,但你试着在外面使用它。
这里的问题是使用ByVal,它传递了Object的引用副本,所以你不能修改初始对象,因为RecordSet在Sub之外是空的! ;)

由于OP测试的rst1.RecordCount > 0是假的(rst1.RecordCount等于-1),所以 他通过将.CursorType设置为adOpenKeySet而非adOpenForwardOnly

来修复此问题
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