2 Spalten vergleichen über 250k Zeilen

  • Excel

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von affrop.

    2 Spalten vergleichen über 250k Zeilen

    Hallo zusammen,

    ich habe ein kleines Problem. Ich müsste 2 Spalten vergleichen. Beide Spalten haben ca. 250k Zeilen. Es ist ein Import aus einer Textdatei, die Dateinamen enthalten. Ich habe auch ei Code, der eigentlich funktioniert. Wahrscheinlich macht es die Größe, die Excel zum Absturz bringen. Excel reagiert nicht mehr, keine Fehlermeldung. Ich habe das Script auch schon 2 Stunden einfach weiterlaufen lassen, ohne Erfolg.

    Ich habe versuchsweise ein Haltepunkt auf Next x gesetzt und X per Hand 10-15 durchlaufen lassen. Da funktioniert das wunderbar. Ich wollte nur nicht 250k mal das per Hand starten.

    Habt Ihr da eine Idee ? Danke schon mal :)



    Vor dem folgenden Code wird das durch With Spalte a und Spalte b gefüllt und vorher screenupdating auf false gesetzt.

    Visual Basic-Quellcode

    1. listenda = Cells(Rows.Count, 1).End(xlUp).Row
    2. listendb = Cells(Rows.Count, 2).End(xlUp).Row
    3. For y = 1 To listendb
    4. For x = 1 To listenda
    5. If Left(Cells(y, 2), 30) = Left(Cells(x, 1), 30) Then
    6. Cells(y, 2).Interior.Color = RGB(255, 0, 0)
    7. End If
    8. Next x
    9. x = 1
    10. Next y
    11. Application.ScreenUpdating = True
    Das sind dann halt einfach 62 Milliarden Prüfungen.

    Anstatt der inneren Schleife solltest du mit .Find arbeiten.

    Visual Basic-Quellcode

    1. For r = 1 To a
    2. Set c = Range("B:B").Find(Cells(r,1).Value, Lookin:=xlValues, LookAt:=xlWhole) 'ggf auch LookAt:=xlPart
    3. If c Is Nothing Then
    4. 'not found
    5. Cells(r,1).Interior.Color=RGB(255,0,0)
    6. Else
    7. 'found
    8. c.Interior.Color=RGB(255,0,0)
    9. End If
    10. Next
    Wenn's dir auf die ersten 30 Stellen ankommt, dann mache 2 Hilfsspalten, die dir nur die ersten 30 Zeichen rausziehen.

    Ansonsten würde ich vermutlich eher versuchen, mit bedingter Formatierung die Duplikate zu suchen, was allerdings nur mit einer ausgeklügelten Formel möglich ist.

    Am performantesten geht es wahrscheinlich ganz ohne VBA über die zwei oben genannten Hilfsspalten und einer dritten, die eine Excel-LOOKUP-Formel (VERWEIS/SVERWEIS) enthält.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    sind denn in Spalte "A" und in Spalte "B" unterschiedlich viele Elemente aufgelistet, die du prüfen möchtest?
    wenn nein, reduziere es auf eine schleife:
    weil listenda und listendb wahrscheinlich von der anzahl der elemente gleich sind:

    Visual Basic-Quellcode

    1. dim listend as integer
    2. dim i as integer
    3. listend = Cells(Rows.Count, 1).End(xlUp).Row
    4. i=0
    5. do
    6. if left(worksheets("Tabelle1").range("A"&i).value)=left(Worksheets("Tabelle1").range("B"&i).value) then
    7. worksheets("Tabelle1").range("B"&i).Interior.Color=RGB(255,0,0)
    8. end if
    9. i=i+1
    10. Loop Until i>listend