Text mit AutoIt in Word einfügen in unterschiedlichen Schriftarten

  • Hallo,

    gegeben sind 3 Variablen

    $Text1 = "Text 1" ; Calibri 11
    $Text2 = "Text 2" ; Windings 14
    $Text3 = "Text 3" ; Arial 12


    Der Inhalt der 3 Variablen soll in Word 2013 unter Windows 8 / 64 in eine Zeile eingefügt werden in der jeweiligen Schriftart und Schriftgröße wie im Kommentar angegeben. Das Word-Dokment ist geöffnet.


    Habt Ihr eine Idee, wie man das umsetzen kann?

    Über die Zwischenablage kann ich den Text einfügen, aber wie ändere ich gleichzeitig Schrifttyp und Schriftgröße mit AutoIt?

    Ich habe in die Word UDF geschaut, aber in meiner Version fand ich dafür keine Lösung.

    ; Title .........: Microsoft Word Function Library (MS Word 2003 and later)
    ; AutoIt Version : 3.3.14.2


    Danke :)

  • Hallo @AutoMit
    Ich kenne mich nicht aus und kenne das echte Szenario ja nicht. Aber wenn du eine Vorlage hast, in die du das einfügst (alles was ich bisher gemacht habe), dann kannst du einen eindeutigen Platzhalter im Text nutzen und mit den Stilen versehen, die du brauchst. Dann genügt _Word_DocFindReplace um den Platzhalter mit mit dem neuen Text ersetzen.
    (Ansonsten warte auf @water :P ).

    Grüße autoiter

  • Water, bitte melden :)

    Hallo autoiter,

    es gibt keine Platzhalter (und es kann wohl auch keine geben), weil ich mit AutoIt zwischen 2 bis 30 Zeilen aus einer anderen Anwendung einlese, in einer Schleife zerlege und die in Word als neue Zeilen einfügen möchte. Die Besonderheit - jede Zeile beinhaltet 3 Schriftarten und Größen, in Abhängigkeit vom Textinhalt (siehe unten).

    Es wird also immer eine neue Leerzeile mit Inhalt erstellt. Es ist neuer Text an unterschiedlichen Stellen im Word-Dokument (die Stellen zum Einfügen finde ich über die Word-Textsuche).

    Da ich die Anzahl der einzufügenden Elemente in Word und deren Position in Word nicht vorher kenne, bevor AutoIt diese nach Regeln zugewiesen hat, kann ich auch nicht die notwendige Anzahl und Position der Platzhalter vorher in Word erzeugen.

    Meine Idee - Wechseln der Schriftarten in Abhängigkeit von dem, was AutoIt in der Schleife erkennt und über eine Selectanweisung die Schriftarten festlegt.

    Beispiel: AutoIt erkennt Banane in $Text1, dann hat der String eine entsprechende Formatierung = gelber Hintergrund, Schriftgrad 12 ... (soweit bekomme ich das in AutoIt definiert) ... nur wie bekomme ich das nach Word, dass in Word $Text1 in dieser Formatierung eingefügt wird?

    Ich hoffe, ich konnte das erklären. :)

    7 Mal editiert, zuletzt von AutoMit (20. Februar 2017 um 21:07)

  • Sollte sich einrichten lassen - muss ich aber noch testen.

  • So in etwa:

  • So in etwa:

    Hallo water,

    vielen Dank - das klappte schon recht gut. Ziel in Sichtweite :)

    Kannst Du mir bitte bei den folgenden 2 Punkten noch helfen?

    (a)

    (1) Ich habe eine offene, nicht gespeicherte Word-Datei namens "Dokument 4 - Word" laut Titelzeile.
    (2) ich habe eine geöffnete Word-Datei namens "Testdatei.docx".

    Wie erstelle ich jeweils eine Objektreferenz, die sozusagen anstelle folgender Variablen tritt?

    (In der Hilfe fand ich, wenn ich die Datei öffne, kann ich _Word_DocOpen nehmen, aber wie mache ich das bei (1) und (2)?)

    AutoIt
    Global $oWord = _Word_Create()								;	erstellt ein Microsoft Office Word Objekt
    Global $oDoc = _Word_DocAdd($oWord)					;	Gibt eine Objektvariable zu einem neu erstellten Dokument zurück


    (b)

    AutoIt
    $oRange = _Word_DocRangeSet($oDoc, -2)                ;    Text einfügen
    $oRange.Insertafter(" Text2" & @CR)                        ;    weicher Zeilenumbruch (in Word-Gliederungsansicht als ein Punkt)
    $oRange.Font.Name = "Calibri "
    $oRange.Font.Size = 11


    Wenn ich in Word per Hand "shift Enter" eingebe, sieht man entweder über die Gliederungsansicht oder durch das Einblenden aller Zeichen, dass es ein weicher Zeilenumbruch ist.
    Wie kann ich die in Zeile 2 senden? mit @CR oder @LF hat es nicht geklappt.


    Danke und ein schönes Wochenende

  • Mit _Word_DocAttach verbindet sich das Skript mit einem bereits geöffneten Dokument.

    Verwende $oRange.InsertBreak(6) (vermute ich zumindest).

  • Mit _Word_DocAttach verbindet sich das Skript mit einem bereits geöffneten Dokument.


    Hallo Water,

    wo könnte der Fehler in meinem Script liegen?

    Habe es mit Word 2013 mit
    Test.doc
    Test.docx
    Test.docm
    Dateien versucht.

    Datei ist jeweils offen.

    @error: = 0
    $Word_Referenz =

    Sollte eigentlich laut Hilfe ergeben:
    a variable pointing to the document object.
    (eine Nummer?)

    AutoIt
    $Name_der_Word_Datei = "Test.doc"
    Local $oWord = _Word_Create()
    ;~ $Word_Referenz = _Word_DocAttach ($oWord,  $Name_der_Word_Datei , "FileName")
    $Word_Referenz = _Word_DocAttach ($oWord,  "Test.doc" , "FileName")
    ConsoleWrite (@ScriptLineNumber & @TAB & "@error: = " & @error & @CRLF)
    ConsoleWrite (@ScriptLineNumber & @TAB & "$Word_Referenz = " & $Word_Referenz & @CRLF)


    (2)

    Ich habe auch folgendes versucht - erfolglos:

    To access the corresponding Word application use: $oAppl = $oDoc.Application.

    $Word_Referenz = _Word_DocAttach ( $oDoc.Application , "Test.doc")

    Wie muss man dass dann schreiben?


    Danke und ein schönes Wochenende :)

  • @error = 0 steht für: Alles OK.
    Die Referenz kannst Du Dir nicht mit ConsoleWrite ausgeben lassen, da es ein Objekt ist. Besser ist: IsObj($Word_Referenz)

  • Mit _Word_DocAttach verbindet sich das Skript mit einem bereits geöffneten Dokument.

    Verwende $oRange.InsertBreak(6) (vermute ich zumindest).


    Fast geschafft :) Danke Water :)


    (1)

    Wo findet man eine Übersicht über Variablen und Tastencodes, wie $wdLineBreak, die man ohne Fensterfocus an Word als Eingbe senden kann?

    Habe in der Hilfe und der word UDF geschauft unb bin leider nicht fündig geworden.

    Also sowas wie
    Echter Zeilenumbruch
    Pfeiltasten 3x nach links
    und vergleichbares.

    (2)

    Gibt es (eventuell von Dir) ein (deutschsprachiges) gutes Tutorial für die Word.au3?

    Es ist erstaunlich, welche Möglichkeiten es gibt :)

  • Du mischt da zwei Dinge.
    Fensterfocus, Pfeiltasten klingen nach Automatisierung des GUI. Da kommst Du mit dem Benutzer über Kreuz, der ja auch in der GUI rumfummelt = Ergebnisse unvorhersehbar.
    Die Word UDF verwendet COM um direkt auf die Applikation (ohne Umweg über die GUI) zuzugreifen = keine Probleme mit dem Benutzer.

    Die in der UDF verwendeten Konstanten findest Du in der Datei WordConstants.au3 oder bei MSDN: https://msdn.microsoft.com/en-us/library/…office.14).aspx

  • Pfeiltasten klingen nach Automatisierung des GUI


    Guten Abend Water,

    das möchte ich natürlich nicht.

    Ich komme noch nicht klar mit "_Word_DocRangeSet".

    Text einfügen am Ende:
    $oRange = _Word_DocRangeSet($oDoc, -2)
    ... das geht

    Mir erschließt sich die Syntax aus der englischen Hilfe nicht.

    _Word_DocRangeSet ( $oDoc, $vRange [, $iStartUnit = Default [, $iStartCount = Default [, $iEndUnit = Default [, $iEndCount = Default]]]] )

    Wenn ich das richtig verstehe, wird ein Bereich (Range) definiert. Und dann kann man davor oder danach was einfügen. Ich schaffen gedanklich den Bogen nicht von der Range zu dem Ziel:

    "Text 1" einfügen, ausgehend von der aktuellen Position ...

    2 Worte weiter nach links / rechts - in der aktuellen Zeile
    2 Zeilen höher / tiefer
    an den Anfang / Ende der aktuellen Zeile
    an den Anfang / Ende des aktuellen Absatzes
    2 Absätze höher / tiefer

    Wie mache ich das unter Verwendung der Word.au3?

  • $vRange = Der Range der angepasst werden soll.
    $iStartUnit = Einheit um die der Start des Range verändert werden soll (Zeichen, Wort, Absatz etc.)
    $iStartCount = Anzahl der Einheiten. Positive Werte nach rechts, negative Werte nach links
    $iEndUnit = Einheit um die das Ende des Range verändert werden soll (Zeichen, Wort, Absatz etc.)
    $iEndCount = Anzahl der Einheiten. Positive Werte nach rechts, negative Werte nach links

    Die Einfügemarke (aktuelle Position) ist wenn Start und Ende des Range an der selben Position sind.

  • Vielen Dank Water, grünen Haken gesetzt :)

    Jetzt geht's ans Testen.

    PS: im Forum steht relativ wenig über AutoIt und Word (im Vergleich zu anderen Themen), scheint eher ein Nischenthema zu sein?

  • Ich habe den Eindruck, dass primär nach Excel, dann nach Outlook und relativ wenig nach Word gefragt wird.
    Jetzt weiß ich nur nicht, ob Word mein bestes (=fehlerfreistes) UDF ist oder ob es bloss kein Mensch benutzt ^^

  • Ich weiß ja nicht wie lange du hier bist aber ich habe hier schon ziemlich häufig Threads zu Outlook, Excel und Word gesehen.

    Ich bezog mich nur auf Word und die Forensuche :)

    _Word_DocRangeSet

    21 Fundstellen (und noch wesentlich weniger Threads) .... das ist für mich subjektiv wenig.

    Ein weiteres Indiz - niemand außer Water hat fachlich was zum Thema Word UDF hier geschrieben.

    Wenn ein Thema nur wenige Spezialisten anlockt, ist es meiner Meinung nach ein Nischenthema.

    Wie dem auch sei, letztendlich ist das subjektiv und unwichtig.

    Ich bin dankbar dafür, dass die UDF so gut funktioniert.

    Jetzt weiß ich nur nicht, ob Word mein bestes (=fehlerfreistes) UDF ist oder ob es bloss kein Mensch benutzt

    Oh - das ging unter, dass die UDF von Dir ist.

    Die Möglichkeiten mit Deiner Word-UDF sind faszinierend.

    Die Einstiegshürden waren für mich sehr hoch (Anfänger eben :) ... mittlerweile kann ich über den dauerhaften Titel schmunzeln.

    Als nächstes versuche ich mich dann mit der Excel UDF.

    Langfristiges Ziel ist es, aus Excel aus den Spalten J bis O alle Zellwerte zu kopieren für die aktuelle Woche (Datum steht in einer Spalte), diese in AutoIt aufzuarbeiten und in Word an unterschiedlichen Stellen datumsabhängig einzufügen.

    Aber das ist ein anderes Thema mit gefühlt vielen Hürden.

  • Excel arbeitet auch mit Ranges, die sind aber in Excel - da hier mit Zellen gearbeitet wird - leichter zu verstehen. Außerdem gibt es im engl. wiki einen umfangreichen Artikel bzw. mehrere Seiten dazu.