Spalten aus 2 Tabellenblättern mit Array abgleichen
10.10.2025 11:38:53
StefanK
ich bräuchte ein wenig Nachhilfe zum Thema Arrays.
Aktuell habe ich eine Datei mit 3 Tabellen (Auswertung, Data1, Data2). In Tabelle Data1 und Data2 befinden sich u.a. jeweils eine Spalte mit Aktenzeichen. Ich möchte nun abgleichen, welche Aktenzeichen von Data1 in Data2 vorkommen (bzw. welche fehlen) und auch umgekehrt und das Ergebnis in „Auswertung“ darstellen (Vorhanden / nicht vorhanden).
Mit der Funktion „Eindeutig“ hole ich mir erst einmal alle eindeutigen Aktenzeichen aus Data1 in die Auswertung und frage diese per VBA-Schleife in Data2 ab. Funktioniert auch alles, da es sich aber jeweils um ca. 700.000 Zeilen handelt, dauert das entsprechend lange. Meine Idee: die Spalten mit den Aktenzeichen von Data1 und Data2 in jeweils ein Array laden, in der Hoffnung, dass dies schneller geht. Nachfolgen zeige ich euch meinen bisherigen Versuchs-Code. Jedoch scheint hier es noch optimierungspotential zu geben, da es auch hiermit sehr lange dauert (hier läuft ja auch wieder eine Schleife und frage nur ein Array ab). Habt Ihr eine Idee, wie der Abgleich anders / schneller erfolgen kann (evtl. ohne Schleife) ?
Kann man direkt 2 Arrays abgleichen ?
Besten Dank für eure Unterstützung und viele Grüße
Stefan
Sub DatenAbgleichen()
Dim Ausw, ws1, ws2 As Worksheet
Dim Data1, Data2 As Variant
Dim Start, Zeile, lRowA, lRowN, lRowW As Long
Dim Fundzeile As Range
' Tabellenblätter definieren
Set Ausw = ThisWorkbook.Sheets("Auswertung_Neu")
Set ws1 = ThisWorkbook.Sheets("Daten Nova")
Set ws2 = ThisWorkbook.Sheets("Daten WinFibu")
'Jeweils letzte Zeile ermitteln
lRowA = Ausw.Cells(Rows.Count, 1).End(xlUp).Row
lRowN = ws1.Cells(Rows.Count, 1).End(xlUp).Row
lRowW = ws2.Cells(Rows.Count, 1).End(xlUp).Row
' Daten in Arrays laden
Data1 = Ausw.Range("A10:A" & lRowA).Value
Data2 = ws2.Range("N1:N" & lRowW).Value
Start = 9
' Schleife zum Abgleich
For Zeile = 1 To UBound(Data1, 1) ' Zeilen
Set Fundzeile = ws2.Range("N:N").Find(Format(Data1(i, 1), "0"), LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext)
If Not Fundzeile Is Nothing Then
Ausw.Cells(Start + i, 5) = "Vorhanden"
Else
Ausw.Cells(Start + i, 5) = "Fehlt"
End If
Next Zeile
Set Ausw = Nothing
Set ws1 = Nothing
Set ws2 = Nothing
Set Fundzeile = Nothing
End Sub
Anzeige