_WordDocFindReplace und IF - Script bleibt bei Ausführung stehen

  • Hallo

    Ich hab ein kleines Problem, bei dem ich auf eure Hilfe hoffe.

    In meinem Script starte ich per Hotkeyset eine Funktion zur Bearbeitung eines Word-Dokuments.
    Vor der Bearbeitung frage ich unter anderem einen Termin und die Anzahl an folgenden Terminen ab.
    Der vom Benutzer eingegebene Termin wird anhand der Punkte zwischen Tag, Monat und Jahr geteilt und in eine Variable geschrieben.

    Da der Benutzer nur die Anzahl der folgenden Termine angibt und der Abstand genau ein Monat ist, werden diese Termine vom Script generiert und in ein eigenes Array $termin geschrieben.

    Spoiler anzeigen
    [autoit]

    Do
    $day = $faell[1]
    If $faell[2] = 12 Then
    $faell[2] = 1
    $faell[3] = $faell[3] + 1
    Else
    $faell[2] = $faell[2] + 1
    EndIf
    If $faell[2] = 2 And $faell[1] > 29 Then $day = 29
    If $faell[2] = 4 And $faell[1] > 30 Then $day = 30
    If $faell[2] = 6 And $faell[1] > 30 Then $day = 30
    If $faell[2] = 9 And $faell[1] > 30 Then $day = 30
    If $faell[2] = 11 And $faell[1] > 30 Then $day = 30
    _ArrayAdd($termin, _Pad($day) & ". " & _Monat($faell[2]) & " " & ($faell[3]))
    $atermine = $atermine - 1
    Until $atermine = 1

    [/autoit]

    Anschließend wird per _WordDocFindReplace der 1. Termin und alle weiteren Termine aus dem Array $termin in das Word-Dokument eingesetzt.
    Hierbei passiert es nun ab und zu, dass das Script nach dem 2. Termin einfach stehen bleibt - scheinbar. Es passiert nichts sichtbares, das Script stürzt auch nicht mit einer entsprechenden Fehlermeldung ab.

    Hat jemand eine Idee woran dies liegen kann oder noch besser, wie man diesen "Aufhängen" im Script erkennen und das Abarbeiten erneut anstoßen kann ? ?(

    Zur Verständnis der entsprechende Script-Code ab dem 2. Termin

    Spoiler anzeigen
    [autoit]

    $countarray = UBound($termin)
    _WordDocFindReplace($oDoc, "2. Termin am TT. Monat JJJJ", "2. Termin am " & $termin[1])
    If $countarray > 2 Then _WordDocFindReplace($oDoc, "3. Termin am TT. Monat JJJJ", "3. Termin am " & $termin[2])
    If $countarray > 3 Then
    _WordDocFindReplace($oDoc, "4. Termin am TT. Monat JJJJ", "4. Termin am " & $termin[3])
    EndIf
    If $countarray > 4 Then
    $nrtermin = 5
    $x = 4
    Send("^f")
    WinWait("Suchen und Ersetzen")
    Send("am " & $termin[3] & "{ENTER}")
    Sleep(500)
    If WinExists("Microsoft Office Word", "Der Suchvorgang innerhalb des Dokuments ist abgeschlossen. Das gesuchte Element konnte nicht gefunden werden.") Then
    WinActivate("Microsoft Office Word", "Der Suchvorgang innerhalb des Dokuments ist abgeschlossen. Das gesuchte Element konnte nicht gefunden werden.")
    Send("{ENTER}")
    Send("{ESC}")
    Else
    Send("{ESC}")
    WinWaitClose("Suchen und Ersetzen")
    Sleep(300)
    Send("{RIGHT}{ENTER}")
    Sleep(50)
    ;Send("{ENTER}")
    While $x < $countarray
    Send($nrtermin & ". Termin am " & $termin[$x] & " ")
    Sleep(100)
    $nrtermin = $nrtermin + 1
    $x = $x + 1
    If $x < $countarray Then Send("{ENTER}")
    WEnd
    EndIf

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

    EndIf

    [/autoit]

    Einmal editiert, zuletzt von SmilingStar (26. Mai 2012 um 22:28)

  • Du kannst ja zwischen den Zeilen ein paar ConsoleWrite machen oder MsgBoxen. Dann weißt du ja wo er hängt oder in eine schleife stecken bleibt. Warum hast du eigentlich bei der While-Schleife keine For-Schleife genommen? Wenn du sowieso eine Variable hochzählst.

  • Du kannst ja zwischen den Zeilen ein paar ConsoleWrite machen oder MsgBoxen. Dann weißt du ja wo er hängt oder in eine schleife stecken bleibt. Warum hast du eigentlich bei der While-Schleife keine For-Schleife genommen? Wenn du sowieso eine Variable hochzählst.

    Korrigiere mich wenn ich falsch liege aber ConsoleWrite hilft mir bei einem kompilierten Script recht wenig?!
    Und das Problem des aufhängen tritt wie gesagt nicht dauerhaft auf. Den Benutzer dann pauschal bei jeder Zeile mit einer MsgBox zu beglücken, sorgt vermutlich auch für mehr Ärger als alles andere. ;)
    Würde ich eine Stelle im Array abfragen die leer ist, müsste das Script ja eigentlich abschmieren. Und da er, wenn es passiert, immer nach dem 2. Termin stoppt, wäre er ja am If $countarray > 2 hängen geblieben. Eine Schleife in der er stecken geblieben ist, sollt man eigentlich ausschließen können. Ebenso müsste er das If ganz Dezent ignorieren, wenn meine Variable $countarray aus irgend einem Grund leer und damit Null ist.
    Braucht _WordDocFindReplace das Word-Dokument dauerhaft als aktives Fenster ?

    Für die While-Schleife statt einer For-Schleife gibts eigentlich keinen bestimmten Grund, höchstens Unwissenheit das etwas anderes besser funktionieren könnte.

  • Die MsgBoxen & ConsoleWrites sollen ja auch nur dir helfen, den Fehler zu finden, danach mchst du sie einfach wieder weg. ;)

    Lg chess

    Der Gedanke hinter der Verwendung von MsgBox bzw ConsolWrite, den m-obi hatte, ist mir schon verständlich, trotzdem Danke.
    Wie ich ja schrieb, kompiliertes Script und unregelmäßiges Auftreten des Fehlers.

  • Anstelle der unsicheren Send-Methode solltest du dein Skript komplett auf die _Word...-Finktionen (in der Word.au3) aufbauen,

    mfg auoBert

    Würd ich gern, da aber für die Termine nur 4 "Vorlage-Zeilen" existieren und es gern mal deutlich mehr werden können, muss ich die entsprechenden Zeilen dann selbst Schreiben. Und eine Möglichkeit die Word-Suche per _WordDoc-Funktion zu bedienen bzw die Cursor-Position damit zu setzen, hab ich noch nicht gefunden.
    Davon abgesehen scheint mein Problem ja gerade bei einem _WordDocFindReplace aufzutauchen.

    Einmal editiert, zuletzt von SmilingStar (26. Mai 2012 um 22:22)

  • Mein Vorschlag ist:

    • Nur _WordDocFindReplace verwenden
    • Mehr Fehlerprüfungen einbauen (so nach dem Motto: Hat der letzte Befehl auch funktioniert? etc.)
    • Die Protokollierung in eine Datei durchführen (_FileWriteLog). Das nervt den Benutzer nicht, bringt Dir aber eine saubere Aussage, wo der Fehler liegt.

    Sehe ich das richtig, dass die zu ersetzten Zeile immer nach dem selben Muster aufgebaut ist: "n. Termin am TT. Monat JJJJ" wobei n ab 1 hochgezählt wird?
    Das Skript wäre relativ leicht entsprechend anzupassen.

  • Mein Vorschlag ist:

    • Nur _WordDocFindReplace verwenden
    • Mehr Fehlerprüfungen einbauen (so nach dem Motto: Hat der letzte Befehl auch funktioniert? etc.)
    • Die Protokollierung in eine Datei durchführen (_FileWriteLog). Das nervt den Benutzer nicht, bringt Dir aber eine saubere Aussage, wo der Fehler liegt.

    Sehe ich das richtig, dass die zu ersetzten Zeile immer nach dem selben Muster aufgebaut ist: "n. Termin am TT. Monat JJJJ" wobei n ab 1 hochgezählt wird?
    Das Skript wäre relativ leicht entsprechend anzupassen.

    Grundsätzlich ist die zu ersetzende Zeile nach diesem Muster aufgebaut und wird entsprechend mit den Variablen für n. Termin und Datum ersetzt.
    Aber wie bereits gesagt, die zu ersetzende Zeile "n. Termin am TT. Monat JJJJ" ist nicht immer in der gleichen Anzahl wie die zu schreibenden Termine vorhanden.
    Anders gesagt:
    - n. Termin am TT. Monat JJJJ ist maximal 4 mal in dem Text vorhanden
    - die Anzahl der zu schreibenden Termine kann sich aber auch auf 6,8,10 etc. belaufen

    Für alle Termine ab dem 5. Termin bietet sich _WordDocFindReplace also nicht mehr an.
    Für genauere Erklärung wie ich solche Fehlerprüfungen wie "Hat der letzte Befehl auch funktioniert?" umsetze und per _FileWriteLog dokumentiere wäre ich dankbar.

    Die theoretischen Gedankengänge was ich alles prüfen sollte, hatte ich ja auch schon..

  • _WordDocFindReplace ersetzt per default alle gefundenen Text im Dokument, also nicht nur 1x.
    Wenn die Funktion erfolgreich war, dann wird der Rückgabewert auf 1 gesetzt und @error = 0. Ist @error <> 0, dann trat ein Fehler auf.

    [autoit]

    #include <File.au3>
    ...
    _WordDocFindReplace(...)
    If @error <> 0 Then _FIleWriteLog(@ScriptDir & "\log.txt", "Fehler " & @error & "aufgetreten bei _WordDocFindReplace!")

    [/autoit]