Beschleunigung einer If schleife zum Filtern von Tabellenzeilen

  • Excel

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Beschleunigung einer If schleife zum Filtern von Tabellenzeilen

    Hi zusammen,

    ich hätte da eine Frage zur Filterrung von Tabellenwerten und zwar Zeilenweise. Der Code läuft und macht das was von ihm verlangt ist, nur leider sollen der Viele Zeilen geprüft werden und denn ich das nun mit einer If-Verzweigung mache dauert es bei ca. 3000-5000 Zeilen schon sehr lange bzw. hört garnicht mehr auf zu arbeiten.

    Bisher bin ich soweit, dass ich:

    Visual Basic-Quellcode

    1. For i = 2 To Z
    2. For k = 1 To Z - 1
    3. If Sheets("Tabelle2").Cells(i, 5).Value <= Sheets("Tabelle1").Cells(3, 1) + Sheets("Tabelle1").Cells(3, 2) Then
    4. If Sheets("Tabelle2").Cells(i, 5).Value >= Sheets("Tabelle1").Cells(3, 1) - Sheets("Tabelle1").Cells(3, 2) Then
    5. If Sheets("Tabelle2").Cells(i, 6).Value <= Sheets("Tabelle1").Cells(7, 1) + Sheets("Tabelle1").Cells(7, 2) Then
    6. If Sheets("Tabelle2").Cells(i, 6).Value >= Sheets("Tabelle1").Cells(7, 1) - Sheets("Tabelle1").Cells(7, 2) Then
    7. If Sheets("Tabelle2").Cells(i, 2).Value <= (Sheets("Tabelle1").Cells(11, 1) + ((Sheets("Tabelle1").Cells(11, 1)) / 100) * (Sheets("Tabelle1").Cells(11, 2))) Then
    8. If Sheets("Tabelle2").Cells(i, 2).Value >= (Sheets("Tabelle1").Cells(11, 1) - ((Sheets("Tabelle1").Cells(11, 1)) / 100) * (Sheets("Tabelle1").Cells(11, 2))) Then
    9. If Sheets("Tabelle2").Cells(i, 1).Text = Sheets("Tabelle3").Cells(1, 1 + k).Text Then 'Überprüfung auf gewünschte Authoren
    10. Sheets("Tabelle3").Cells(i, 1 + k).Value = Sheets("Tabelle2").Cells(i, 11)
    11. End If
    12. End If
    13. End If
    14. End If
    15. End If
    16. End If
    17. End If
    18. Next k
    19. Sheets("Tabelle3").Cells(i, 1).Value = Sheets("Tabelle2").Cells(i, 6)
    20. Next i


    Und zwar werden 3 Spalten einer Zeile auf einen vorgegebenen Wert Kontroliert und dessen Toleranz berücksichtigt. Entspricht eine Zeile allen Ansprüchen so wird die letzte Zelle in der Zeile genommen und auf einem neuen Tabellenblatt kopiert.

    Kann ich das vieleicht irgendwie beschleunigen, dass diese Operation selbst bei 3000 Zeilen in einem eigenermaßen verträglichen Zeitramen abläuft ?
    Es muss leider jede Zeile kontroliert werden, weil mich nur bestimmte Zeilen interessieren (die, die den Ansprüchen genügen).

    Könnt ihr mir bitte helfen ?

    Gruß
    Hi.

    Dafür ist eine SQL-Abfrage besser geeignet. Suche dir den passenden ConnectionString für Excel, verbinde zur Arbeitsmappe mit ADO.NET und führe eine Abfrage in diesen Stil aus:

    SQL-Abfrage

    1. SELECT * FROM Tabelle WHERE spalte1 BETWEEN 1 AND 5 [...]

    (siehe dazu: 1keydata.com/sql/sqlbetween.html)

    Das liefert dir eine Auflistung passender Zeilen, aus denen du jeweils die letzte Zelle auslesen kannst. Die Zellliste kannst du dann mit einem INSERT-Befehl in eine andere Tabelle schreiben.

    Der Zeitaufwand für diese Abfrage ist erheblich geringer, da nicht für jeden Zugriff (= jede Abfrage!) ein neues Objekt benötigt wird. Das Durchsuchen der Tabelle übernimmt auch noch der Datenprovider, sodass du wirklich nur das Ergebnis verarbeiten musst.

    PS: Es gibt keine IF-Schleifen.
    Gruß
    hal2000