Funktion in While-Schleife

  • Hey, mein Script liest mir Daten aus einer Excel Datei aus und funktioniert soweit auch, allerdings kann ich es nicht in eine While Schleife packen, obwohl ich dies dringend für mein Script benötige. Weiß jemand von euch, wie ich das Problem mit der Funktion in einer While-Schleife umgehen kann, sodass es dennoch funktioniert?

    [autoit]


    While 1
    #Include <Excel.au3>
    $sFilePath1 = @ScriptDir & "\BlaBla.xls"
    $oExcel = _ExcelBookOpen($sFilePath1)
    $i=$i+1
    $nummer = _ExcelReadCell($oExcel, $i, 14)
    $anzahl = _ExcelReadCell($oExcel, $i, 2)
    ProcessClose("excel.exe")
    ProcessWaitClose("excel.exe")
    WEnd

    [/autoit]

    Lg Pago

  • Du arbeitest mit einer GUI oder liege ich da falsch?

  • Was macht der Befehl #include ?
    Bevor das Skript richtig abgearbeitet wird bewirkt #include das die zu inkludierende Datei 1:1 an dieser Stelle in das Skript eingetragen wird.
    Wenn man sich die Excel.au3 nun anschaut wird man feststellen das dort u.A. Funktionen definiert werden.
    Also würdest du in einer While-Schleife eine Funktionsdefinition haben.
    Da Funktionen nur einmal definiert werden dürfen führt dies in AutoIt verständlicherweise aber zu einem Fehler um dies zu verhindern.

  • So...
    1. Ein #include hat nichts in einer Schleife verloren, weil schon vor dem ausführen des eigentlichen Scripts hier der Code der entsprechenden Datei eingefügt wird. Somit hättest du alle Funktionen der Excel.au3 unnötigerweise in einer Endlosschleife.
    2. $sFilePath bekommt immer den selben Wert zugewiesen, somit kann es auch vor die Schleife.
    3. _ExcelBookOpen öffnet bei jedem Aufruf ein Excel Objekt und hat auch nichts in der Schleife verloren.
    4. Was soll Process(Wait)Close("excel.exe") bewirken, wenn du das Excel Sheet sowieso aus einer Datei ausließt?
    5. Kannst du statt der While Schleife mit der Variable $i, auch einfach eine For Schleife benutzen, sofern du weißt wie oft die Schleife sich wiederholen soll.
    6. Es ist unsinnig den Variablen $nummer und $anzahl immer neue Werte zuzuweisen, ohne sie während des selben Schleifendurchgangs auch in irgendeiner Form zu verwenden, da bei jeder neuen Wertzuweisung der alte Wert der Variable überschrieben wird.

  • Hey, vielen Dank, ich habs jetzt so hinbekommen, dass es funktioniert.
    Ich habe eingestellt, dass es mir gleich die ganze Spalte aus Excel in einem Array speichert. Somit muss all dies nicht mehr in der While-Schleife passieren.
    Damit die While-Schleife immer den richtigen Array ausliest, habe ich einfach am Ende immer $i=$i+1, so:

    [autoit]

    #Include <Excel.au3>
    #include <Array.au3>
    $sFilePath1 = @ScriptDir & "\Bla.xls"
    $oExcel = _ExcelBookOpen($sFilePath1)
    $anummer = _ExcelReadArray($oExcel,2,14,17,1)
    $aanzahl = _ExcelReadArray($oExcel,2,2,17,1)
    ProcessClose("excel.exe")
    ProcessWaitClose("excel.exe")
    $i=0
    $nummer=$anummer[$i]
    $anzahl=$aanzahl[$i]

    [/autoit][autoit]

    While $anzahl<>1
    #Include<Aktion.au3>
    $i=$i+1
    $nummer=$anummer[$i]
    $anzahl=$aanzahl[$i]
    WEnd

    [/autoit]

    Vielen Dank nochmal für die Hilfe :D

  • Du scheinst nicht verstanden zu haben was dir oben erklärt wurde. Du verwendest schon wieder ein include innerhalb einer Schleife. Includes gehören an den Scriptanfang. Ausserdem bezweifel ich, dass deine while Schleife korrekt arbeitet, denn deine Abbruchbedingung wird vermutlich nie erreicht, ausser einer der Werte des Arrays ist zufälligerweise eine 1. Andernfalls wird dein Programm wohl abstürzen weil du einen Index ansprichst der garnicht existiert.