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: Alles auswählen
Global:
Name DataType Length
FileName Text 250
TemplateName Text 250
- Code: Alles auswählen
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: Alles auswählen
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.