2017-02-13 3 views
1

Ich bekomme den Laufzeitfehler 91, nachdem ich versuche, eine SQL-Anweisung in meiner Excel-Anwendung zu senden. Hier ist der folgende Code:Laufzeitfehler 91 in VBA Excel für ADODB.Recordset

'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) 

Fehlermeldung:

Objektvariable oder With-Blockvariable nicht gesetzt

Was ich falsch mache ich es nicht sehen kann.

+1

'Einstellung Set rs = Nichts und dann 'rs'. Also, außer wenn 'rs' eine Public-like-Variable ist und' ConnectToDb' gefüllt ist, bleibt sie leer, bevor sie benutzt wird, also der Fehler! – R3uK

+0

@ R3uK rs ist auf 'Nothing' eingestellt oder was meinst du genau? – yuro

+0

Meine schlechte für die vorherige Formatierung, finden Sie in der Antwort zur einfacheren Erklärung! – R3uK

Antwort

2

Das erste, was Sie in dem Sub tun, ist, dass Sie das Argument (mit Set rs = Nothing), das Sie gerade übergeben haben, leeren und dann wieder rs verwenden.

So außer wenn rs ist ein Public wie variable und es in ConnectToDb gefüllt ist,
es leer bleibt vor, den Fehler ergo verwendet werden!

Zuerst versuchen Sie, Set rs = Nothing zu entfernen, und wenn es nicht genug ist, müssen Sie in ConnectToDb suchen!

Zweitens ändern Sie das Recordset innerhalb der Untergruppe, aber Sie versuchen, es außerhalb zu verwenden.
Und das Problem hier war die Verwendung von ByVal, die eine Kopie der Referenz des Objekts übergeben und so können Sie das ursprüngliche Objekt nicht ändern, ergo die Tatsache, dass das RecordSet außerhalb des Sub ist leer! ;)


Und als OP getestet rst1.RecordCount > 0, die falsch war (rst1.RecordCount gleich war) auf -1,
Er es fest von .CursorType-adOpenKeySet statt 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 
+0

Sorry, aber für mich funktioniert es nicht. Ich bekomme keine Antwortdaten. – yuro

+0

@yuro: Wie benutze 'GetDynSQLQuery'? – R3uK

+0

Ich benutze 'GetDynSQLQuery' nur, um eine SQL-Anweisung zu senden, wie Sie oben sehen können. – yuro

Verwandte Themen