copy & paste und Aufruf eines VB-Scriptes mit AutoIT möglich?

  • eigentlich muss du nur anstelle von $txt_Edit = GUICtrlRead($Edit) deinen Teil $text = ControlGetText($wintitle,"","[CLASS:TwwDBRichEdit; INSTANCE:1]") einsetzen ...


    hab grad keine zeit, sonsdt würde ich mir das nochmal ansehen...

  • Ich würde das über die GUI machen.

    Einen Lese Button und einen für Speichern. (siehe Anhang)

    Du möchtest ja sicher auch noch eine Fehlerbehandlung mit einbauen.

    Ist aber noch nicht kommplett umgesetzt ...


    Gruß gmmg

  • Danke Dir... sieht gut aus.

    Habe im Moment eine Lösung, die (fast) auch funktioniert.
    Der Text wird ausgelesen und in ein Word-Dokument kopiert.
    Dann öffnet sich der "speichern-unter"-Dialog... aber es wird nicht das von mir angegebene Verzeichnis geöffnet (S:\Archiv\Mittelvergabe\Memos).
    Und das Eingabefeld für den Dateinamen ist auch nicht leer...

    Hier der Code:


    Aber ich versuche zunächst mal Dein Script... bin gespannt :)

    P.S.:
    Habe jetzt das Script mal getestet, aber verstehe den Ablauf nicht so recht.
    Wenn ich auf "Lesen" klicke, weiß ich nicht so recht, was passiert. Dann werde ich 2 x nach der Nummer gefragt und daher irritiert mich das.

    Wenn in meinem Script die beiden oben beschriebenen Problemchen noch gelöst werden (Speicherndialog im richtigen Verzeichnis und Dateinamenfeld leer), dann funktioniert alles gut!

    LG
    imebro

    Einmal editiert, zuletzt von imebro (8. September 2015 um 15:48)

  • Wenn du in meinen Script auf lesen klickst, wird der Text des Elementes [CLASS:TwwDBRichEdit; INSTANCE:1]") ausgelesen.
    1. Grundsätzlich müsstest du uns mal noch sagen, ob sich das Programm wie in deinem SScript bei jedem aufruf wieder beenden soll oder die GUI, wie in meinem Script offen bleibt.

    Dafür ist die While 1 - Wend Schleife vorhanden. In dieser Steuert man nun die Switch Case Abfragen.

    Wenn man nun z.B. den Speichern Button drückt, wird der Quellcode bei Case $Save ausgeführt.
    Drückt man den Lesen Button, wird der Quelltext von Case $Read ausgeführt, das ist in dem Fall, dass die Variable $text geleert wird und es wird die Funktion zum auslesen des Textes deiner Stiftungsanträge / Einzelfallhilfen ausgeführt.

    Das mal zum Verständnis ...

    Gruß gmmg

  • Hallo nochmal und danke für die Erklärung.

    Ich beschreibe jetzt mal Schritt für Schritt, was passiert, wenn ich Deinen Code ausführe:

    1) Klick auf lesen --> Die GUI wird in die Taskleiste minimiert (ob der Text aus dem Programm-Textfenster eingelesen wurde, weiß ich zu diesem Zeitpunkt noch nicht)

    2) Ich klicke die GUI in der Taskleiste an, damit sie wieder nach vorne kommt und gebe die Nummer ins Feld "Bitte Nummer eingeben!" ein
    --> Es öffnet sich ein weiteres Fenster mit dem Titel "Info". Darin steht "Bitte Nummer + Name eingeben".
    Darunter befindet sich ein Textfeld. Darunter ein Button "OK" und ein Button "Cancel".

    3) Ich gebe nun auch dort nochmals die Nummer ein und klicke auf OK.

    4) Nun öffnet sich ein neues Word-Dokument und der eingelesene Text wird eingefügt.
    Das zweite Fenster "Info", wo ich zum 2. Mal die Nummer eingetragen hatte, hat sich geschlossen.
    Das erste Fenster (GUI), mit Lesen und Speichern Button, ist noch sichtbar.

    5) Ich klicke im GUI-Fenster nun auf "Speichern" (die zuvor eingetragene Nummer steht dort noch drin)

    6) Es erscheint wieder das zweite Fenster mit dem Titel "Info", wo darunter "Bitte Nummer + Name eingeben" steht...

    7) Ich gebe dort nochmal die Nummer ein und klicke dann wieder auf OK

    8.) Es öffnet sich ein zweites Word-Dokument... usw... scheint eine Schleife zu sein.


    Der Ablauf sollte folgender sein:

    1) Öffnen Deiner GUI (diese soll im Vordergrund bleiben).
    --> möglichst den Button "Lesen" ändern in "Memo einlesen".
    Beim Klick auf "Memo einlesen" soll der Text eingelesen werden aus dem Programm-Textfenster.

    2) Darunter sollte in der GUI einfach nur der Text stehen "Bitte Nummer + Namen eingeben" und darunter ein Eingabefeld dafür...

    3) Darunter sollte der Text "Memo speichern" stehen und darunter der Button "Speichern".

    4) Mit einem Klick auf "Speichern" soll der anfangs eingelesene Text gespeichert werden im Verzeichnis
    "S:\ARCHIV\Mittelvergabe\Memos\" und zwar als ".doc"
    Toll wäre noch eine Prüfung, ob die Datei bereits existiert mit der Frage, ob diese überschrieben werden soll, falls sie existiert.

    So wäre es perfekt!! :)

    Danke und schöne Grüße,
    imebro

    6 Mal editiert, zuletzt von imebro (9. September 2015 um 09:43)

  • Hallo,

    habe ja zu meinem Script geschrieben, das es noch nicht kommplett umgesetzt ist.
    Das solltest du ja entsprechend abändern, das du auch was lernst :)

    Teste mal das Script ... Die Namen der Button kannst du selbst abändern. ($Read = GUICtrlCreateButton("Lesen", 50, 20, 100, 25)) usw.

    Gruß gmmg

    2 Mal editiert, zuletzt von gmmg (9. September 2015 um 14:19)

  • Hallo und danke nochmals...

    Ja, ich hatte schon die Buttons umgeändert. Hat prima geklappt.
    Auch ansonsten hatte ich schon mit dem Code herum probiert... leider ohne Erfolg.

    Jetzt - mit Deinem neuen Code - passiert folgendes:

    Das GUI-Fenster öffnet sich
    Ich klicke auf "Memo einlesen"
    Dann verschwindet das GUI-Fenster (minimiert sich in die Taskleiste)
    Ich hole es von dort wieder hervor
    Dann gebe ich in das Eingabefeld die Nummer und Name ein
    Jetzt klicke ich auf "Memo speichern"
    Dann öffnet sich ein neues Word-Dokument und der Inhalt des Textfeldes wird korrekt eingefügt
    Nun erscheint die folgende Fehlermeldung:

    ---------------------------
    AutoIt Error
    ---------------------------
    Line 54 (File "C:\Users\imebro\Desktop\NEU.au3"):

    _Word_DocSaveAs($oDoc, "d:\"& $txt_Filename,12)
    _Word_DocSaveAs($oDoc, "d:\"& ^ ERROR

    Error: Variable used without being declared.
    ---------------------------
    OK
    ---------------------------

    Ich frage mich, wieso dort zusätzlich auf "d:\" gespeichert wird... ist das vielleicht der Fehler?

    Danke und Gruss,
    imebro

  • 1. die Zeile _Word_DocSaveAs($oDoc, "d:\"& $txt_Filename,12) solltest du auskommentieren und ist es auch in meinem letzten Script! mit dem Parameter 12 _Word_DocSaveAs($oDoc, "d:\"& $txt_Filename,12) speichert man die datei im docx format

    2. dein Code WinActivate($wintitle) aktiviert das Fenster mit dem Titel "Stiftungsanträge / Einzelfallhilfen"

    den Bereich im Quelltext kann ich nicht testen, da ich die Anwendung nicht habe ...


    • ; Titel of Window
    • $wintitle = "Stiftungsanträge / Einzelfallhilfen"
    • ; activate window
    • WinActivate($wintitle)
    • ; wait max 10 seconds for window to become active
    • If WinWaitActive($wintitle,"",5) = 0 then
    • Msgbox(16,"Timeout","Konnte Fenster nicht finden!")
    • Exit 1
    • EndIf
    • ; retrieve text of control
    • $text = ControlGetText($wintitle,"","[CLASS:TwwDBRichEdit; INSTANCE:1]")


    gruß gmmg :)

  • Hallo,

    klar verschwindet das Word wieder, weil es mit dem Befehl _Word_Quit($oWord) geschlossen wird.

    Hast du mal ein gespeichertes Dokument überprüft, ob die Daten drin stehen?

    Ursprünglich hast du ja mal erwähnt, dass du für jedes Memo was du aus deinem Hauptprogramm ziehst ein einzelnes Word abspeichern willst.
    Wenn das nicht so ist, müsste das Script umgebaut werden, das der Text aus mehreren Memos angefügt wird.

    Die Autoit GUI aus meinem Quelltext bleibt offen, bis man es über das Kreuz schließt.
    Du kannst daher so oft du möchtest den Text aus deinem Hauptprogramm auslesen.
    Du drückst den Lesen Button (Text wird aus dem anderen Programm gelesen), danach wieder Speichern usw. So kannst du das wiederholen, bis die Tasten glühen :)

    zu 2. kann ich nicht testen, weil ich eure Anwendung nicht habe, die auf den Fenstertitel reagiert. Da der Text aber ausgelesen wird, sollte das ja funktionieren.

    Gruß gmmg

  • Kurze Rückmeldung:

    Die Kollegen sind begeistert und ich soll einen Dank ausrichten :)

    Nur aufgefallen ist, dass die Formatierungen aus dem Memofenster nicht in das Word-Dokument übernommen werden (war mir gar nicht aufgefallen).
    Liegt das am Speicherprozess über AutoIT?

    Z.B. sehe ich in Zeile 53 den Eintrag: $oWord.Selection.TypeText ($text)
    Bedeutet der, dass quasi reiner Text kopiert wird?
    Gibt es vielleicht hier eine Möglichkeit, aus Text = Doc zu machen? :)

    Ist jetzt nur eine Vermutung...

    Und es erscheint keine Abfrage, wenn der Dateiname schon existiert.
    Ist aber in unserem Fall nicht so schlimm, da eh immer überschrieben werden soll

    LG
    imebro

    2 Mal editiert, zuletzt von imebro (9. September 2015 um 16:11)

  • Hallo imebro,

    eigentlich sollte die Abfrage im folgenden Abschnitt kommen.

    AutoIt
    If $iFileExists Then
        $ja_nein = MsgBox(4, "", "The file exists." & @CRLF & "Überschreiben Ja/Nein")
        IF $ja_nein = 6 Then _Word_DocSaveAs($oDoc, "S:\ARCHIV\Mittelvergabe\Memos\" & $txt_Number) ; save as doc"
        IF $ja_nein = 7 Then MsgBox(0,"","Datei wird nicht gespeichert!")
        Else


    Wegen dem Format musst du mal im Internet schauen, ob es da Beispiele gibt ...
    Hast du denn mal den Code aus deinem Script genommen?

    Gruß gmmg

  • Hallo "gmmg",

    habe das gerade mal getestet.
    Leider wird auch damit nicht die Formatierung übernommen.
    Zusätzlich bleibt das Word auch offen und wird nicht geschlossen.

    Die Abfrage nach überschreiben (ja/nein) erscheint auch da nicht.

    Das mit der Abfrage ist nicht ganz so schlimm, da eh in 99% der Fälle überschrieben werden soll.
    Aber komisch ist es ja schon, dass dieser Code-Teil nicht funktioniert.

    Mit dem formatieren ist schon schlimmer, da nicht nur fett markierte Sätze nicht übernommen werden, sondern auch Aufzählungen nicht als solche formatiert werden.

    Im Internet habe ich gestern schon nach Lösungen dafür gesucht, aber noch nichts gefunden. Werde mal weiter suchen.
    Seltsam ist, dass es manuell ja funktioniert - nur eben mit dem AutoIT-Script nicht...

    Danke und Gruss,
    imebro

  • Habe gerade mal mit den Zielformaten herum getestet.
    Dazu habe ich einfach mal die 0 eingegeben im Code. Aber auch das brachte keine Veränderung.
    Ebenso der Test, die Tatei als RTF abzuspeichern (mit dem Zusatz 6 im Code) brachte kein formatiertes Dokument.
    Zwar wurde tatsächlich ein ".rtf" erzeugt, aber leider auch unformatiert.

    Hier mal die Zielformate, die ich in einem Thread hier im Forum gefunden hatte:

    Zielformate im _WordDocSaveAs sind u.a.:
    0 = .doc
    3 = .txt
    6 = .rtf
    8 = .htm
    11 = .xml
    12 = .docx
    17 = .pdf

    Merkwürdig ist ja, dass es problemlos funktioniert, wenn ich den Text manuell (Strg A / Strg C / Strg V) kopiere und speichere.

    Vielleicht noch wichtig:
    Meine SCI-TE-Version ist die 3.4.1
    Denn in einem Thread steht folgender Hinweis:

    reinhardt1julian verwendet die 3.3.10.2 Version von AutoIt. Dort wurde die Word UDF durch die WordEX ersetzt.
    Daher heissen alle Funktionen nun _Word_* statt _Word*.

    Meine Version ist zwar neuer, aber vielleicht hilft Dir das weiter... :)

    LG
    imebro

  • dann probiere es doch mal so ...

    in der Funktion _Save_to_Word() ist das "$oWord.Selection.TypeText ($text)" ist durch "$oWord.Selection.Paste" ersetzt ...
    Eingelesen wir der Text über die Send("^a") = alles Markieren und Send("^c") kopieren Funktion.

    eventuell kannst du die Sleep (pause) rausnehmen oder verringern..

    gruß gmmg

  • ...da kommt schon beim Klick auf LESEN die Meldung "Konnte Fenster nicht finden"...
    Ich finde aber jetzt auf Anhieb auch keinen Schreibfehler o.ä.

    Der Code dieser Meldung steht in Zeile 83

    In Zeile 78 im neuen Code steht "$wintitle = "Dokument1 - Microsoft Word""
    Im alten Code stand "$wintitle = "Stiftungsanträge / Einzelfallhilfen"", was vom Fenstertitel her auch richtig ist.


    LG
    imebro

    2 Mal editiert, zuletzt von imebro (10. September 2015 um 11:23)

  • Aaaah, Du hast das jetzt mit Strg A, C, V gelöst :)

    Aber müßten die Zeilen

    Sleep (2000)
    Send("^a"); alles markieren
    Sleep (1000)
    Send("^c"); kopieren
    $text = ClipGet()

    nicht weiter hoch stehen... denn in Zeile 73 wird Word ja schon geschlossen...

    *** hoffe die Frage ist jetzt nicht total doof ***

    LG
    imebro

  • Sorry... nochmal ich.

    Ich glaube, ich hab´s.

    Habe einfach die Textzeile 77 statt 78 wieder aktiviert und jetzt klappt es... inkl. Formatierung :)

    Also diese hier habe ich aktiviert:
    $wintitle = "Stiftungsanträge / Einzelfallhilfen"

    Klappt jetzt auch durchgehend mit Aufzählungen etc.

    Danke und Gruss,
    imebro

  • ja, gibt sicher auch noch eine andere möglichkeit, aber auf die schnelle, kenne ich da auch nichts.

    die Zeilen haben nichts damit zu tun ..

    es gibt ja einaml die funktion _get_Text() und einmal die _Save_to_Word() und werden jeweils in dem Case zweig aufgerufen.
    in der _get_Text() steht alles, was mit dem auslesen des textes zu tun hat. in der _Save_to_Word() alles, vom word öffnen bis speichern.
    dabei ist es egal, ob die eine weiter oben oder unter der anderen funktion im quelltext steht.

    als erklärung...
    du startest das autoit script. wenn alles geladen ist, bleibt das in der While1 Wend schleife (durchläuft diese permanent) klickst du nun den Button lesen, welcher im case zweig Case $Read ist, wird alles ausgeführt was darunter in dem Case steht unter anderem die Funktion _get_Text(). Praktisch ruft das Script die Funktion auf, spring zu dem Quelltext der funktion arbeitet die befehle ab und springt wieder zurück, um den rest Sleep (1000) usw. abzuarbeiten.


    AutoIt
    Case $Read
    			$text = "" ; leert Variable
    			_get_Text()
    			Sleep(1000)
    			If $text <> "" Then
    				GUICtrlSetData($ok1, "OK")
    				GUICtrlSetState($Save, $GUI_ENABLE)	; Aktiviert den Speichern Button
    				GUICtrlSetState($Read, $GUI_DISABLE)	; Deaktiviert den LeseButton
    			EndIf


    man könnte die Funktion jetzt an einer beliebigen anderen stelle zum aufruf einbauen.
    Die Befehle innerhalb der Funktion könntest du auch im Case rein schreiben, zum einen Wird das bei einem großen Script unübersichtlich und man könnte aus einem weiteren Case zweig diese nicht nochmal aufrufen.

    gruß gmmg