Aus einer großen Exceltabelle was finden. _Excel_RangeFind zu langsam!

  • Guten Tag liebe Autoit Gemeinde,

    ich bin auf folgendes Problem gestoßen, vielleicht stand schon jemand von euch vor dem selben Problem.

    Das Programm sucht aus einer Exceltabelle (aktuell 8100 Zeilen lang und 4 Breit Bereich A1:D8100)
    In der ersten Spalte steht die ID, der Bereich in dem gesucht wird lautet A1:A10000 (Nicht A8100 weil die Tabelle pro Woche um 150-300 Zeilen länger wird)


    $idLPN_NR = Zu Suchender String - ca 14 chars lang +/- 3

    Local $aResult = _Excel_RangeFind($oWorkbook, $idLPN_NR,"A1:A10000",$xlValues)


    Ich benötige die Information z.B
    A10
    A1796
    A:242
    Eine ID kann mehrfach in dieser Exceltabelle vorhanden sein!

    Daraus mache ich
    A10:D10
    A1796:D1796
    A3242:D3242
    Um mir die benötigten Informationen anzeigen zu lassen. Das geht super schnell.


    Das dauert aktuell leider 7 Sekunden, ich benötige das aber in unter 1 Sekunde

    Hat jemand eine Idee wie das schneller gehen könnte?

    Ich liebäugle gerade mit ClipPut und ClipGet mit StringCompare was zu basteln....


    Ich verwende die Excel.au3 der AutoIt Version : 3.3.15.0 mit zwei Anpassungen

    $aResult[$iIndex][1] =$oMatch.Name.Name

    Macht folgenden Fehler
    \AutoIt3\Include\Excel.au3" (656) : ==> The requested action with this object has failed.:
    Geändert in -> $aResult[$iIndex][1] = 0;$oMatch.Name.Name


    $aResult[$iIndex][5] = $oMatch.Comment.Text

    Macht folgenden Fehler
    \AutoIt3\Include\Excel.au3" (660) : ==> The requested action with this object has failed.:

    Geändert in -> $aResult[$iIndex][5] = 0;$oMatch.Comment.Text


  • Viel interessanter wäre Dein Script. Denn ich glaube nicht, dass _Excel_RangeFind 7 Sekunden braucht.
    Außerdem: Welche Version von Excel verwendest Du?

  • Ich darf hier keine xlsx hochladen, deshalb die zip mit der Excel & Script

    Hab das Programm auf das wesentlich zusammengestrichen.

    Ich verwende Excel 2003 & 2013

  • Lass Dir mal anzeigen, wo das Skript die Zeit liegen lässt. Ich vermute die Schleife mit RangeRead.

  • 10000 Zeilen
    Local $aResult = _Excel_RangeFind($oWorkbook, $idLPN_NR,"A1:A10000",$xlValues)
    Rangefind: 9316.23515462834
    RangeRead: 180.090862213931

    1000 Zeilen
    Local $aResult = _Excel_RangeFind($oWorkbook, $idLPN_NR,"A1:A1000",$xlValues)
    Rangefind: 1192.39494928926
    RangeRead: 62.661755432355

    Einmal editiert, zuletzt von Romanow (1. April 2017 um 14:34) aus folgendem Grund: Timer2 für RangeRead erstellt

  • Es liegt an der Excel-Datei.
    Ich habe nur die Werte in eine andere Excel_Datei kopiert und schon läuft das Ding in weniger als 1/4 Sekunde durch.
    Habe aber noch keine Idee warum!

  • Danke, auf die Idee wäre ich niemals gekommen!

    Jetzt ist das Programm ca 155000 mal schneller xD

    Neue Zeiten
    Rangefind: 59.1207894321974
    RangeRead: 231.070919493418

  • @water

    Ich habe den Fehler in der Exceltabelle gefunden.

    Es wurde bereits mit Excel 2013 die gleichen IDs farbig Markiert.
    Mit STRG+A wählt man die Tabelle aus mit Rechtsklick auf Schnellanalyse und da wurde "Doppelte Werte" ausgewählt, das muss rückgängig gemacht werden.
    Es handelt sich um keine normale Formatierung, diese lässt sich nicht über die Formatierung löschen.

  • Danke für die Rückmeldung. Seltsam, dass sich eine Formatierung auf die Suchgeschwindigkeit auswirkt.