Teilbereich aus Recordset mit ADO GetRows
19.07.2019 09:52:01
Mikkey
ich bin ratlos und muss deshalb wieder mal auf Eure geschätzte Hilfe hoffen.
Ich versuche aus einer Access-Datenbank verschiedene Reports zu erstellen. Dazu rufe ich die Daten per ADO ab. Da die Anordnung des Reports sehr dynamisch ist (inkl. Kalkulationsspalten, die in der Datenbank natürlich nicht vorhanden sind) und grundsätzlich die Ausführungszeit sekundär wichtig ist, möchte ich den gefundenen Recordset zunächst in ein Array überführen, dieses wie benötigt manipulieren und das Endresultat danach in das Datenblatt ausgeben.
Das funktioniert soweit generell auch ganz gut für kleine Ergebnismengen, nur: Die Ergebnismenge geht je nach Abrufkriterien sehr schnell über die Grenzen hinaus und Excel bricht wegen einem Speicherfehler ab, egal ob ich die Daten per CopyFromRecordset oder mit getRows abrufe. Ich habe versucht, die Daten zunächst mal ins Datenblatt zu schreiben, aber auch dann kein Erfolg.
Meine Idee: Mit GetRows kann ja mittels Parameter ein Teilbereich aus einem Recordset abgerufen werden. Nun wollte ich Teil für Teil das Recordset auslesen und laufend an ein Array anhängen (im Code durch Aufruf der Funktion Copy_Array, diese funktioniert auch) oder alternativ schlimmstenfalls zumindest fortlaufend in das Datenblatt kopieren. Leider scheine ich aber die Parameter irgendwie falsch zu interpretieren. Der erste Aufruf mit Parameter 0, dh. ab erstem resp. aktuellem Record, funktioniert, bei der 2. Schleife gibt es leider einen Fehler.
Sieht einer von Euch gleich, was mein Denkfehler ist? Habe ich was grundsätzlich nicht verstanden? Danke im Voraus für Eure Hilfe!
Lg Mikkey
Info zur Funktion: Aufruf mittels Parameter rs = Recordset und MaxImport = Anzahl der gleichzeitig zu importierenden Records.
Public Function Recordset_to_Array(rs As Object, MaxImport As Long) As Variant
Dim Start As Long
Dim TotalRows As Long
Dim arrTemp As Variant
Dim arrTemp2 As Variant
ReDim arrTemp2(0, 0)
rs.movefirst
Start = 0
TotalRows = rs.RecordCount
Do While TotalRows - Start > MaxImport
arrTemp = rs.GetRows(MaxImport, Start)
Start = Start + MaxImport
arrTemp2 = Copy_Array(arrTemp, arrTemp2)
Loop
arrTemp = rs.GetRows(-1, Start)
arrTemp2 = Copy_Array(arrTemp, arrTemp2)
Recordset_to_Array = arrTemp2
Erase arrTemp
Erase arrTemp2
End Function