[gelöst] Mit Word Textmarken arbeiten

18. Mai 2016 16:05

Hi all,
da ich mich mit VBA ziemlich gut auskenne und aus Navision heraus eine Vorlage mit Textmarken so befüllen möchte, dass nichts schief gehen kann und im Forum das Thema nur 'halb' gelöst war (für Office-Nerds), habe ich hier mal das richtige Vorgehen dokumentiert:

1. Eine Word-Vorlage erstellen (.dot oder .dotx oder .dotm).
2. An die Stellen, wo Text übergeben werden soll, unbedingt einen Mustertext schreiben.
3. WICHTIG: In den Word-Optionen unter Erweitert bei Ansicht die Textmarken anzeigen lassen (Haken an).
4. Den Mustertext markieren (und wirklich nur den Text der ersetzt werden soll).
5. Im Reiter Einfügen findet man den Befehl Textmarke. Hier nun für den markierten Text die Textmarke definieren (am Besten ohne Leerzeichen und Sonderzeichen etc).
6. Man kann diesen Vorgang beliebig oft wiederholen.
7. Vorlage speichern und schließen.

Nun benötigt man in Navision folgende Variablen:
Code:
Global:
Name           DataType   Length
FileName       Text       250   
TemplateName   Text       250


Code:
Lokal(die Application-Objekte unbedingt als lokale Variablen deklarieren, damit man keine Fehlermeldungen bekommt):
Name        DataType    Length    Subtype
WordApp     Automation            'Microsoft Word 14.0 Object Library'.Application   
WordDoc     Automation            'Microsoft Word 14.0 Object Library'.Document   
WordRange   Automation            'Microsoft Word 14.0 Object Library'.Range   
Textmarke   Text        30


Und SO füllt man Textmarken richtig in ein neues Dokument, basierend auf einer Word-Vorlage:
Code:

TemplateName := 'F:\EureVorlage.dotx';

IF ISCLEAR(WordApp) THEN
  IF NOT CREATE(WordApp, FALSE) THEN
    ERROR('Konnte keine Word-Instanz erstellen!');

IF NOT EXISTS(TemplateName) THEN
  ERROR('Wordvorlage %1 existiert nicht!', TemplateName);

WordDoc := WordApp.Documents.Add(TemplateName);


Textmarke:='ErsteTM';
IF WordDoc.Bookmarks.Exists(Textmarke) THEN BEGIN        // Überprüfung, ob es die Textmarke überhaupt gibt
  WordRange:=WordDoc.Bookmarks.Item(Textmarke).Range;
  WordRange.Text('Hier wird der erste Text übergeben');  // Word überschreibt hierbei die Textmarke 
  WordDoc.Bookmarks.Add(Textmarke,WordRange);            // Textmarke neu erstellen
End;

Textmarke:='ZweiteTM';
IF WordDoc.Bookmarks.Exists(Textmarke) THEN BEGIN
  WordRange:=WordDoc.Bookmarks.Item(Textmarke).Range;
  WordRange.Text('Hier wird der zweite Text übergeben');
  WordDoc.Bookmarks.Add(Textmarke,WordRange);
End;

//...usw...

FileName := STRSUBSTNO('X:\%1.docx','NeueDatei');
WordDoc.SaveAs(FileName);
WordApp.ScreenUpdating(TRUE);
WordApp.Visible := TRUE;
WordApp.Activate;


Natürlich solltet ihr am Ende für die Application-Objekte dann auch noch ein CLEAR einbauen.