AutoIt vs Excel-VBA Geschwindigkeitsunterschied

  • Hi zusammen,
    für einige Anwendungen in der Firma habe ich teilweise recht umfangreiche Programme erstellt, u.a. in Verbindung mit recht großen (~10k Zeilen) Excel-Tabellen. In AutoIt kein Thema^^
    Da Excel aber auch mit VBA zu steuern ist, habe ich, um nur ein System zu nutzen, die AutoItscripte durch VBA-Scripte ersetzt.

    Im Großen und Ganzen funktioniert alles, allerdings mit einem gravierenden Nachteil. Die VBA-Scripte laufen teilweise extrem langsam, teilweise um Faktor 10 ! ?(
    Da timern nicht zu den großen Stärken von VBA gehört ( genau wie viele andere Sachen auch 8o ) habe ich zwei einfache FOR/TO Schleifen erstellt, sowohl in VBA als auch in AutoIt und mit der Hand ausgestoppt.
    Innerhalb der Schleife wird einfach der Zelleninhalt einer Zeile ausgelesen:

    Code
    wert=oExcel.Activesheet.Cells($sRangeOrRow, $iColumn).Value

    Der Counter läuft einfach zeilenweise durch das sheet.

    Wieso ist AutoIt vielfach schneller als VBA?
    Bzw. gibt es ggf in VBA einen "Turbo"-Schalter, um ggf Debugging o.ä. auszuschalten?

    Weil einige VBA-Anwendungen so unendlich langsam sind, habe ich heute angefangen, wieder auf AutoIt umzustellen, aber ein Zustand ist das nicht!
    Ein Excel-sheet mit 10K Zeilen mit je 50 Spalten speichere ich als CSV, lese diese per AutoIt in ca. 1/2 Sekunde in ein 2D-Array und kann dann wiederum diese Daten in andere Tabellenblätter einfügen... ;(


    //EDIT gelöst!
    Excel hat ein massives Problem mit mehreren Tabellen in einer Instanz. Öffnet man die sheets in einer neuen Instanz, dann gibt es keinerlei Geschwindigkeitsproblem!
    Die neue Instanz wird beim doppelklick auf ein sheet geöffnet, indem der Schalter /n (in neuer Instanz öffnen ) anstatt /e (in der aktuellen Instanz öffnen) in der Verknüpfung mit der EXCEL.EXE verwendet wird.
    EXCEL.EXE /n
    AutoIt hat deshalb kein Problem, weil es standardmäßig das sheet in einer neuen Instanz öffnet...

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    2 Mal editiert, zuletzt von Andy (5. Dezember 2013 um 13:15)

  • Was ich festgestellt habe: AutoIt (in Form des Excel UDFs) ist ja auch sehr langsam, da dort Bereiche ebenfalls Zelle für Zelle verarbeitet werden.
    In meinem rewrite des Excel UDFs verwende ich nur mehr Ranges und dann geht die Post ab.

  • Zitat

    In meinem rewrite des Excel UDFs verwende ich nur mehr Ranges und dann geht die Post ab.


    Imho habe ich keinen Unterschied festgestellt, ob eine einzelne Zelle nun per Range() oder Cells() ausgelesen wird.

    Was ich überhaupt nicht verstehe ist, wieso AutoIt (sehr viel) schneller ist. Da die leeren Schleifen ca. gleich schnell sind, MUSS es am Auslesen der Zellen liegen. Und da sowohl AutoIt als auch VBA das Objektmodell nutzen, kapiere ich den Unterschied nicht ;(
    Das einzige was ich mir noch vorstellen kann ist, dass in VBA noch irgendein Flag einen wie auch immer "Sicherheitsmodus" schaltet...
    Allerdings ist Excel ja M$ pur....viel schlimmer wird man woanders Software kaum programmiert haben :rolleyes:

  • Sollte AutoIt wirklich so viel effizienter programmiert sein als VBA?
    Aber wer weiss, seit wie lang sich bei VBA nichts mehr geändert hat.

  • Hi,
    könntest du das Problem ggf. nachvollziehen?
    Also eine einfache For/To-Schleife und dort einfach die Zellen A1 bis A10000 auslesen...
    Ggf. schiesst uns in der Firma der Terminalserver dazwischen, obwohl ich das "Problem" lokal auf der Maschine auch habe...

    Zitat

    Sollte AutoIt wirklich so viel effizienter programmiert sein als VBA?

    DER war richtig gut :thumbup: , made my day!

  • Wenn Du beide test codes hier posten kannst, dann prüfe ich das mal.

  • Das ist ja cool....
    Ich habe hier zuhause auf dem Rechner einen Test geschrieben, da ist es genau umgekehrt^^ Excel ist 3-4x schneller!

    Spoiler anzeigen
    [autoit]

    #include <Excel.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $oExcel = _ExcelBookNew() ;Create new book, make it visible

    [/autoit] [autoit][/autoit] [autoit]

    $t=timerinit()
    for $i=1000 to 1 step -1
    $sCellValue = $oExcel.Activesheet.Cells($i, 3).Value ;_ExcelReadCell($oExcel, $i, 3)
    _ExcelWriteCell($oExcel, $i, 1, 1) ;Write to the Cell
    next
    $m=timerdiff($t)
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$m' & @lf & @lf & 'Return:' & @lf & $m) ;### Debug MSGBOX

    [/autoit] [autoit][/autoit] [autoit]

    _ExcelBookClose($oExcel) ; And finally we close out

    [/autoit]
    Spoiler anzeigen

    Sofort dieselben Scripte auf dem Firmenrechner laufen lassen.... Excel um LÄNGEN langsamer...wtf...werde wohl mit dem Admin mal sprechen müssen ?(

  • Lösung im Startpost