VBA Excel Recordset - Abfrage auf SQL-Server
Hallo,
ich habe ein neuerliches Problem.
Mitarbeiter sollen in einem Excel-Sheet die Artikelnummern ihrer benötigten Produkte runterschreiben.
Ich ermittle die Anzahl der Zeilen und möchte jetzt für die Anzahl der Zeilen eine Abfrage gegen den SQL-Server starten.
For intzeile = 2 to z (z= Gesamtanzahl der Zeilen, beginnt bei 2 weil in Zeile 1 Überschrift)
strArtikelnummer = Daten.Cells(intzeile, 1).Value
Select Bezeichnung from XYZ where Artikelnummer = strArtikelnumme
Daten.Cells(intzeile, 2) = rst.Fields("Bezeichnung").Value (Zeile intzeile, Spalte 2 = Wert Bezeichnung aus dem Recordset
next intzeile
Mein Problem dabei ist, dass ich in der Schleife zwar zur nächsten Zeile mit der nächsten Artikelnummer komme, aber dann den Fehler 3021, BOF oder EOF = True oder Datensatz gelöscht bekomme.
Wobei BOF und EOF False sind und daher nur "gelöschter Datensatz" in Frage kommt?
Was ich in der Schleife mache:
For intzeile = 2 to z
Dim rst As New ADODB.Recordset
rst.ActiveConnection = conDB
rst.Open strSQLQuery
Daten.Cells(intzeile, 2) = rst.Fields("Bezeichnung").Value
rst.close
next intzeile
Das klappt eben nur bei dem ersten Durchlauf. Warum?
Gibt es eine andere Lösungsmöglichkeit, dass ich eine variable SQL-Abfrage durchführe die in Abhängigkeit der in den Zeilen niedergeschriebenen Artikelnummern steht?
ich habe ein neuerliches Problem.
Mitarbeiter sollen in einem Excel-Sheet die Artikelnummern ihrer benötigten Produkte runterschreiben.
Ich ermittle die Anzahl der Zeilen und möchte jetzt für die Anzahl der Zeilen eine Abfrage gegen den SQL-Server starten.
For intzeile = 2 to z (z= Gesamtanzahl der Zeilen, beginnt bei 2 weil in Zeile 1 Überschrift)
strArtikelnummer = Daten.Cells(intzeile, 1).Value
Select Bezeichnung from XYZ where Artikelnummer = strArtikelnumme
Daten.Cells(intzeile, 2) = rst.Fields("Bezeichnung").Value (Zeile intzeile, Spalte 2 = Wert Bezeichnung aus dem Recordset
next intzeile
Mein Problem dabei ist, dass ich in der Schleife zwar zur nächsten Zeile mit der nächsten Artikelnummer komme, aber dann den Fehler 3021, BOF oder EOF = True oder Datensatz gelöscht bekomme.
Wobei BOF und EOF False sind und daher nur "gelöschter Datensatz" in Frage kommt?
Was ich in der Schleife mache:
For intzeile = 2 to z
Dim rst As New ADODB.Recordset
rst.ActiveConnection = conDB
rst.Open strSQLQuery
Daten.Cells(intzeile, 2) = rst.Fields("Bezeichnung").Value
rst.close
next intzeile
Das klappt eben nur bei dem ersten Durchlauf. Warum?
Gibt es eine andere Lösungsmöglichkeit, dass ich eine variable SQL-Abfrage durchführe die in Abhängigkeit der in den Zeilen niedergeschriebenen Artikelnummern steht?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 305786
Url: https://administrator.de/forum/vba-excel-recordset-abfrage-auf-sql-server-305786.html
Ausgedruckt am: 14.04.2025 um 03:04 Uhr
4 Kommentare
Neuester Kommentar
Hi,
erstens: Bitte benutze Code-Tags!
Zweitens
Wo und wie legst Du "strSQLQuery" fest?
E.
VBA kann meines Wissens kein Dim innerhalb von Schleifen. bzw. immer nur ein Mal. Beim zweiten Mal steigt es dann aus. Wenn Du "on error resume next" aktiviert hast, dann verwendet er "rst" erneut, welches aber bereits geschlossen ist und nicht wiederverwendet werden kann.
Deshalb: Hol die Dim's aus der Schleife raus.
erstens: Bitte benutze Code-Tags!
Zweitens
Wo und wie legst Du "strSQLQuery" fest?
E.
VBA kann meines Wissens kein Dim innerhalb von Schleifen. bzw. immer nur ein Mal. Beim zweiten Mal steigt es dann aus. Wenn Du "on error resume next" aktiviert hast, dann verwendet er "rst" erneut, welches aber bereits geschlossen ist und nicht wiederverwendet werden kann.
Deshalb: Hol die Dim's aus der Schleife raus.
Dim rst as ADODB.Recordset
dim strSQLQuery as string
dim strArtikelnummer as Integer
For intzeile = 2 to z
strArtikelnummer = Daten.Cells(intzeile, 1).Value
strSQLQuery = "Select Bezeichnung from XYZ where Artikelnummer = " & strArtikelnumme
set rst = new ADODB.Recordset
rst.ActiveConnection = conDB
rst.Open strSQLQuery
Daten.Cells(intzeile, 2) = rst.Fields("Bezeichnung").Value
rst.close
next intzeile
Nimm Code-Tags! Dann lese ich das vielleicht ...