Array und Workbooks
12.11.2019 20:01:06
Tobi@s
ich habe wieder mal ein Problem.
Ausgangslage:
Ich habe eine (oder mehrere) geöffnete Excel-Dateien mit mehreren Tabellenblättern.
Der Nutzer soll über eine UserForm eingeben, welche zwei Spalten er miteinander vergleichen möchte und bei einem entsprechendem Fund des Vergleiches, soll das "Ergebnis" wiederum in eine (freie) Spalte geschrieben werden.
Da es sich hier oft um Spalten mit 5000 - 10000 Zeilen handelt (und somit die Vergleiche in die Millionen gehen) wollte ich das Ganze über Arrays auswerten und am Ende wieder nur das "Ergebnis"-Array in die neue Spalte schreiben.
Der Nutzer sucht sich (Über die UserForm und in Klapplisten) eine (oder zwei verschiedene Datei(en) und dazu (jeweils) ein Tabellenblatt in dieser ausgewählten Datei aus. - (funktioniert).
Weiterhin schreibt er händisch die Spalte(n) hinein, die er ausgewertet haben möchte (alles sicher, dass keine Fehler passieren).
Nun komme ich zum Auswerten sobald der Nutzer auf "Start" klickt.
Mein Code dazu ist folgender:
Dabei ist zu beachten, dass die Variablen nicht auf diese Weise gefüllt werden sondern aus den Steuerelementen der UserForm. Ich habe es nur für den Test angepasst. Es funktioniert aber weder auf die eine noch auf die andere Weise.
Das Programm bricht bei der ersten Zeile (nach " 'Quell- und Ziel-Array erstellen") ab mit der Fehlermeldung 1004 (Anwendungs- oder Objektdefinierter Fehler).
Und ich sehe den Fehler einfach nicht.
Rein theoretisch könnten die Arrays auch eindimensional sein (da jeweils immer nur eine Spalte der Tabelle ins Array soll). Das hat aber auch irgendwie nicht geklappt.
Mit "Liste" und Msgbox - das ist nur Lückenfüller, damit er mir überhaupt etwas anzeigt :-)
Sub Test_Array()
'Q steht für Quelle, Z steht für Ziel, E steht für Ergebnis
Dim wbQ As Workbook, wsQ As Worksheet
Dim wbZ As Workbook, wsZ As Worksheet
Dim wbE As Workbook, wsE As Worksheet
Dim SpalteQ As Integer, EZeileQ As Integer, LZeileQ As Integer
Dim SpalteZ As Integer, EZeileZ As Integer, LZeileZ As Integer
Dim SpalteE As Integer
Dim i
Dim rngQ, rngZ, rngE
Datei = "Gesamt_neu_1007_V 102_25.07.2019.xlsm"
Tabelle = "Liste"
Set wbQ = Workbooks(Datei)
Set wsQ = wbQ.Worksheets(Tabelle)
Set wbZ = Workbooks(Datei)
Set wsZ = wbZ.Worksheets(Tabelle)
Set wbE = Workbooks(Datei)
Set wsE = wbE.Worksheets(Tabelle)
SpalteQ = 7
EZeileQ = 2
LZeileQ = 20
SpalteZ = 8
EZeileZ = 2
LZeileZ = 20
SpalteE = 35
ReDim rngQ(1 To LZeileQ - EZeileQ + 1, 1)
ReDim rngZ(1 To LZeileZ - EZeileZ + 1, 1)
'Quell- und Ziel-Array erstellen
rngQ = wsQ.Range(Cells(EZeileQ, SpalteQ), Cells(LZeileQ, SpalteQ)).Value
rngZ = wsZ.Range(Cells(EZeileZ, SpalteZ), Cells(LZeileZ, SpalteZ)).Value
rngE = rngZ 'Im Original wird noch abgeprüft, ob die Größe des Arrays mit rngQ oder rngZ ü _
bereinstimmen muss
Erase rngE
For i = LBound(rngQ, 1) To UBound(rngQ, 1)
Liste = Liste & vbCr & rngQ(i, 1)
Next
MsgBox Liste
End Sub
Wenn noch Fragen sind, einfach zu.
Ansonsten schon mal danke fürs durchlesen :-)
Gruß Tobi@s