Schleife mit fortlaufendem read-befehl aus Excel.

  • Hi Leute,

    ich habe letzte Woche meine ersten Skripte in Autoit geschrieben und komme jetzt nicht weiter.

    Ich möchte Daten aus einer Exceltabelle auslesen und war auch schon mit dem Skript fertig, nur musste ich für jede neue Zeile einen ganzen Block von Befehlen immer wieder nach dem Modus cpoy/paste einfügen und anpassen. Sobald ich etwas an dem Skript anpassen will, muss ich das ganze im Prinzip wieder von vorne beginnen.

    Vielleicht gibt es hier ja eine einfache Lösung per Schleife?

    Im Prinzip habe ich also einen Read-Befehl für die Zeile 1 meiner Tabelle:

    send($_read1)

    und nun soll nach jedem Schleifendurchlauf die Zeile um eine Konstante X (z.B. 10) nach unten verschoben werden. Also:

    send($_read11)

    Ich würde mich sehr über Lösungsvorschläge freuen oder Tutorials zu dem Thema freuen.

    Danke

  • Hallo LordMONSTER !

    Ich würde mich sehr über Lösungsvorschläge freuen oder Tutorials zu dem Thema freuen.

    AutoIt wird standardmäßig mit einer Excel.au3 UDF ausgeliefert.

    Eine Befehlsübersicht erhältst Du z.B. , wenn Du folgende Datei im SciTE-Editor öffnest :

    C:\Program Files (x86)\AutoIt3\Include\Excel.au3

    Falls Du unter einem anderen Basisverzeichnis installiert hast, z.B. C:\AutoIt , dann in

    C:\AutoIt\AutoIt3\Include\Excel.au3

    Du darfst diese Datei aber KEINESFALLS ändern und speichern - nur lesen :!:

    Diese Befehle (Funktionen) werden in der internen Hilfe beschrieben :

    Binde am Anfang Deines Skriptes folgende Zeile ein (im SciTE-Editor) :

    #include <Excel.au3>

    Dann schreibst Du z.B. die Zeile :

    Global $oExcel = _Excel_Open()

    -> Gehe mit der Maus auf _Excel_Open und markiere den Namen mit einem Doppelklick.

    Anschließend die F1-Taste drücken, dann öffnet sich die Hilfe (das geht bei fast allen Befehlen).

    Ansonsten siehe auch : https://www.autoitscript.com/wiki/Excel_UDF

    Im Prinzip habe ich also einen Read-Befehl für die Zeile 1 meiner Tabelle:


    send($_read1)

    und nun soll nach jedem Schleifendurchlauf die Zeile um eine Konstante X (z.B. 10) nach unten verschoben werden. Also:

    send($_read11)

    Den Variablennamen fest mit der Zeilennummer zu versehen, ist wirklich denkbar ungünstig.

    Poste bitte mal ein komplettes Skript, selbst wenn es nicht läuft (muss Dir nicht peinlich sein :P), dann kann man mehr bzgl. Schleifen, Arrays etc. empfehlen.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hallo Musashi ,

    vielen Dank für deine Hilfe.

    Ich sende hier gleich mal den betroffenen Auszug aus dem Skript. Soweit hat das bisher eigentlcih ganz gut funktioniert, nur jedes mal wenn ich Änderungen vornehmen will, muss ich das ganze Skript über die "Ersetzen" Funktion anpassen und das ist lästig. Ich würde gerne alles ab "Start" in einer Schleife laufen lassen, in dann je nach Schleifendurchlauf die passende Excelzeile ausgelesen wird.

    #include <Excel.au3>

    Local $oExcel_1 = _Excel_Open()

    Local $var = "C:\Users\....xlsx"

    Local $oWorkbook = _Excel_BookOpen($oExcel_1,$var)

    Local $_read1 = _Excel_RangeRead($oWorkbook, Default , "B3")

    Local $_read2 = _Excel_RangeRead($oWorkbook, Default , "C3")

    Local $_read3 = _Excel_RangeRead($oWorkbook, Default , "D3")

    Local $_read4 = _Excel_RangeRead($oWorkbook, Default , "B4")

    Local $_read5 = _Excel_RangeRead($oWorkbook, Default , "C4")

    Local $_read6 = _Excel_RangeRead($oWorkbook, Default , "D4")

    Local $_read7 = _Excel_RangeRead($oWorkbook, Default , "B5")

    Local $_read8 = _Excel_RangeRead($oWorkbook, Default , "C5")

    Local $_read9 = _Excel_RangeRead($oWorkbook, Default , "D5")

    .

    .

    .

    usw.


    WinActivate("Haufe - Powerhaus")

    ; Start

    MouseClick("left" , 482 , 115 , 1)

    Sleep(51)

    MouseClick("left" , 339 , 189 , 1)

    Sleep(51)

    MouseClick("left" , 252 , 332 , 1)

    sleep(101)

    ; Objektmenu


    MouseClick("left" , 1256 , 200 , 1)

    Sleep(202)

    MouseClick("left" , 893 , 478 , 1)

    Sleep(502)


    MouseClick("left" , 405 , 460 , 1)

    sleep(1002)

    MouseClick("left" , 1083 , 567 , 1)

    Sleep(102)

    MouseClick("left" , 934 , 667 , 1)

    Sleep(7002)


    MouseClick("left" , 910 , 704 , 1)

    Sleep(3502)

    ; WE - Anschriften


    MouseClick("left" , 314 , 314 , 3)

    sleep((53))

    send("{backspace}")

    sleep(53)

    send($_read1)

    sleep(53)

    send("{tab}")

    sleep(53)

    send($_read2)

    sleep(53)

    send("{tab}")

    sleep(53)

    send("{backspace}" 25)

    sleep(53)

    send($_read3)

    sleep(53)


    MouseClick("left" , 823 , 704 , 1)

    Sleep(53)

    ; Ende

    Ist recht simpel gehalten ^^

    Grüße Franz

    Einmal editiert, zuletzt von LordMONSTER (5. Dezember 2018 um 18:48)

  • Hallo Franz,

    Du kannst bei _Excel_RangeRead auch direkt einen Bereich angeben. Dann bekommst du praktisch eine Tabelle als Ergebnis, bei der du auf jedes Feld zugreifen kannst. Es sind also keine weiteren Variablen nötig. Wenn sie der Bereich in der Excel-Datei verändert genügt es das anzupassen. Das wäre schon ein großer Fortschritt.

    Du stehst noch ganz am Anfang und das sieht man auch im Skript. Das ist kein Problem. Führt mich aber zu der Frage, ob die Software eine Java-Anwendung ist und du keine Adminrechte hast? Statt blinde Mausklicks und blinde Wartezeiten, könntest du andernfalls mit AutoIt viel besser automatisieren. Dafür ist die Sprache (Automatisiere Es) mal geschrieben worden.. Was gibt dir denn das Programm AutoIt Window Info als Informationen zurück (kennst du es überhaupt)?

    Hier habe ich aber dennoch mal deinen Code so umgeschrieben, dass er wenigstens dann noch funktioniert, wenn du einfach nur mehr Zeilen einlesen willst - das ist aber sicher auch das, was du willst...

    Dennoch kann ich dir nur raten, Verbesserungen anzustreben und nicht den PC aus den Augen zu verlieren, solange du auf diese Weise Daten eingibst....

    Spoiler anzeigen

    Grüße autoiter

  • hallo Autoiter,

    danke für das feedback und die mühe mit dem selbst erstellten code!

    ich kenne Autoit Window, damit habe ich die mausklicks "vermessen", was man damit sonst noch machen kann weiß ich aber nicht.

    was die Haufe-software angeht, kann ich nicht viel dazu sagen, außer dass es eine verwaltungssoftware ist, die bei uns neuerdings auf dem rechner läuft. Ich verusche die datenpflege zu beschleunigen, weil wir unsere daten dort leider nicht einfach importieren können.

    ich nehme deinen ratschlag gerne an und würde das auch risikoärmer automatisieren. ich bin auf jeden fall lernwillig und könnte mir noch andere anwendungsmöglichkeiten vorstellen. Programmiererfahrung habe ich aber nicht.

  • danke für das feedback und die mühe mit dem selbst erstellten code!

    Das war jetzt nicht so viel Arbeit. Ich konnte es nicht testen und hoffe nur, dass es überhaupt funktioniert 8o

    ich kenne Autoit Window, damit habe ich die mausklicks "vermessen", was man damit sonst noch machen kann weiß ich aber nicht.

    Klicke einfach mal den Reiter Control an und nimm dann das Zielkreuz und fahre damit über die einzelnen Controls der Haufe-Software. Siehst du wechselnde Angaben, wenn du über die Buttons, Eingabefelder e.t.c. fährst?

    EDIT: Wenn ja, dann hättest du viel bessere Möglichkeiten den Feldinhalt zu setzen. Plötzlich könntest du statt einen Mausklick zu simulieren und zu hoffen, dass das entsprechende Control den Fokus hat, auch direkt den Feldinhalt setzen. (Das ist dann immer noch nicht ausreichend, bringt dich aber schon mal sehr viel weiter.)

    Grüße autoiter

  • autoiter ,

    es scheint, dass der code nur bis

    "EndFunc ;==>_Start"

    läuft, da das skript bereits nach unter einer sekunde beendet ist.

    ich habe dein skript im prinzip einfach kopiert, den namen der excel eingefügt und in der schleife für $i = einen beliebigen Zahlenwert gewählt. sollte doch dann eigentlich funktionieren oder?

    Zitat

    Klicke einfach mal den Reiter Control an und nimm dann das Zielkreuz und fahre damit über die einzelnen Controls der Haufe-Software. Siehst du wechselnde Angaben, wenn du über die Buttons, Eingabefelder e.t.c. fährst?

    Das scheint nicht zu funktionieren. aber würde das auch in meinem brwoser (firefox oder chrome) gehen? dann könnte ich mir immerhin die eingabe in die exceltabelle ersparen..

    Einmal editiert, zuletzt von LordMONSTER (5. Dezember 2018 um 21:31)

  • $i = einen beliebigen Zahlenwert gewählt.

    Hehe, da haben wir eines deiner Probleme. Lass den Wert von $i doch mal bei Null. Schau dir dann das Array an, dass angezeigt werden sollte. Dann könnte dir klar werden, warum $i zu Anfang den Wert Null hat.

    Grüße autoiter

  • Klicke einfach mal den Reiter Control an und nimm dann das Zielkreuz und fahre damit über die einzelnen Controls der Haufe-Software. Siehst du wechselnde Angaben, wenn du über die Buttons, Eingabefelder e.t.c. fährst?

    funktioniert leider nicht, aber wenn das mit meinem browser gehen würde, dann könnte ich mir den zwischenschritt mit der excel tabelle ersparen.

    Hehe, da haben wir eines deiner Probleme. Lass den Wert von $i doch mal bei Null. Schau dir dann das Array an, dass angezeigt werden sollte. Dann könnte dir klar werden, warum $i zu Anfang den Wert Null hat.

    dass array erscheint unabhängig vom zahlenwert immer gleich die felder werden korrekt angezeigt, jedoch passiert danach nichts. nach schließen mit esc erscheint:

    (14) : ==> Unbalanced brackets in expression.:

    _SchreibeSehrRisikoreichInProgramm($aRead[$i][0], $aRead[$i][1], $aRead[$i][2)]

    _SchreibeSehrRisikoreichInProgramm($aRead[$i][0], $aRead[$i][1], $aRead[$i][^ ERROR

    was bedeutet "unbalanced brackets"?

    Einmal editiert, zuletzt von LordMONSTER (5. Dezember 2018 um 22:05)

  • was bedeutet "unbalanced brackets" ?

    ...

    lol

    hab mehrmals nachgesehen, ob das passt. ich brauch nen größeren Bildschirm (11") :D:D

    Oder bessere Englischkenntnisse :P.

    unbalanced brackets frei übersetzt in etwa unsymmetrische/unausgewogene Klammern , sagt doch bereits vieles aus, oder ? ;)

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • unsymmetrische

    Unsymmetrisch ist hier wohl das falsche Wort, unausgewogen, wie du es danach genannt hast, passt besser.

    hab mehrmals nachgesehen, ob das passt. ich brauch nen größeren Bildschirm (11") :D:D

    Du kannst die Schriftart in deinem Editor größer stellen.

    Temporär indem du Strg hälst und mit dem Mausrad in SciTE scrollst, permanent wenn du Strg+1 drückst und die Standardschriftart für AutoIt in SciTE anpasst.

    Letzteres ist nur möglich wenn du SciTE4AutoIt.exe installiert hast.

  • auf unsymmetrisch kam ich leider überhaupt nich XD.

    mit unausgewogen konnte ich nichts anfangen, aber jetzt weiß ichs ^^

    habe mal einen testlauf gemacht und es funktioniert. also noch mal danke an alle.

  • Unsymmetrisch ist hier wohl das falsche Wort, unausgewogen, wie du es danach genannt hast, passt besser.

    OT, aber egal.

    Ich finde unsymmetrische Klammern (besser wäre wohl Klammersetzung) im Grunde ganz gut geeignet, da eine Reihe von geöffneten und korrekt geschlossenen Klammern schon eine Form von Symmetrie darstellt. Aber lass' uns darüber, im Himmels willen, keine Diskussion starten ;).

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Für so einen Anfänger wie dich, ist das vielleicht nicht klar. Die anderen sehen den Fehler aber sofort. Denn die Fehlerzeile wird ja angezeigt (obwohl ich nicht verstehe, warum 14 davor steht). Bei der Zeile mit dem Funktionsaufruf, der mit einer offenen Kalmmer ( beginnt, fehlt die schließende Klammer ).

    Edit: Ich kann gar nicht ausschließen, dass es das damit war. Du solltest wirklich wissen, dass man mir die rote Farbe wahrscheinlich wegen meiner Präsenz aber auf keinen Fall wegen meiner Fähigkeiten gegeben hat. :whistling:

    Grüße autoiter

    2 Mal editiert, zuletzt von autoiter (5. Dezember 2018 um 22:53)

  • Edit: Ich kann gar nicht ausschließen, dass es das damit war. Du solltest wirklich wissen, dass man mir die rote Farbe wahrscheinlich wegen meiner Präsenz aber auf keinen Fall wegen meiner Fähigkeiten gegeben hat. :whistling:

    unabhängig davon, ob es deiner präsenz oder deinem können geschuldet war, hat es mir weiter geholfen.

    es macht auf jeden fall spaß zu sehen, dass es funktioniert.

    also noch mal danke.