![]() |
Serienbrieffelder auslesen
Hallo,
zuallerst möchte ich erwähnen, dass ich heut wirklich stundenlang mit dieser Problematik zugebracht habe, eine Lösung aber nicht in Reichweite zu sein scheint. Die Umsetzung meines Problems ist vermutlich trivial, nun bin ich aber Delphi-Neuling und verstehe vielleicht einfach nicht, was mir die Fehlermeldungen sagen wollen und wie das Ganze zu beheben ist. Folgende Aufgabe: Ich möchte einen Word-Serienbrief nach den vorhanden Serienbrieffeldern durchsuchen und mir deren "Namen" ausgeben lassen. Dazu habe ich bis jetzt diese Prozedur:
Code:
Das funktioniert soweit wie gewollt, die Datei wird geöffnet und auf die Anzahl der vorhandenen Serienbrieffelder durchsucht. Nur das Problem ist, dass sobald ich versuche Felder anzusprechen (siehe letzte auskommentierte Zeile), Fehlermeldungen erscheinen, dass Fields keine Methode sei bzw. dass das Automatisierungsobjekt Fields als Eigenschaft nicht kennt (wenn ich die Klammerung von Fields(1) in eckige Klammern ändere).
procedure anzMergeFields();
var word: Variant; dir: string; begin word := CreateOleObject('Word.Application'); dir := edtUser.Text; // Dateipfad word.Documents.Open(dir); // word.visible := True; try ShowMessage('MailMerge: ' + IntToStr(word.ActiveDocument.MailMerge.Fields.Count)); // ShowMessage(word.ActiveDocument.MailMerge.Fields(1).Result); finally word.Quit; end; end; Allerdings entnahm ich das Vorgehen hierfür direkt vom MSDN: ![]() Im Beispiel für Fields(index) wird es auf eben diese Weise beschrieben. Ich wäre sehr dankbar, wenn mich jemand auf meinen Fehler aufmerksam macht oder mir anderweitig weiterhilft. Auch andere Beispiele, bei denen es auf ähnliche Weise funktioniert haben soll (Bookmarks(i).Name,..) haben bei mir nicht zum Erfolg geführt. Ich bedanke mich im Voraus schonmal für eure Hilfe. MfG Nightjacket |
AW: Serienbrieffelder auslesen
Die Enumeration befindet sich in der Eigenschaft Item
Delphi-Quellcode:
BookMarks.Item(i).Name
|
AW: Serienbrieffelder auslesen
Ist schon etwas her, aber m.E. sind MailMergefields etwas anderes als Bookmarks, ggF. immerhin eine Teilmenge der Bookmarks...
|
AW: Serienbrieffelder auslesen
Ja du hast Recht, Bookmarks sind etwas anderes. MailMerge-Felder kann man entweder über MailMerge.Fields ansprechen oder nur über Fields, wobei letzteres nicht wirklich nur Serienbrieffelder zählt, daher nicht zu empfehlen.
Zitat:
Sagen wir in der Vorlage steht: "Sehr geehrter Herr <<Name>>," In diesem Fall soll mein Programm mir (ursprünglich geplant) über word.ActiveDocument.MailMerge.Fields(i).Result (bzw. Name/Text/..) den Namen des Feldes, also <<Name>>, ausgeben. |
AW: Serienbrieffelder auslesen
versuch mal
Code:
.MailMerge.DataSource.DataFields('myMMfield').Value
|
AW: Serienbrieffelder auslesen
Leider bekomme ich auch dabei wieder folgende Meldung:
Es ist eine Exception der Klasse EOleException aufgetreten. "'DataFields' ist keine Methode." Was mir jetzt dabei "ins Auge stach", war EOleException. Laut Quellcode weise ich dem Variant 'word' ein Ole-Objekt zu:
Code:
Könnte es vielleicht damit zu tun haben und es gibt noch eine andere einfache Möglichkeit auf Word zuzugreifen (ohne OLE)?
word := CreateOleObject('Word.Application');
|
AW: Serienbrieffelder auslesen
|
AW: Serienbrieffelder auslesen
Ja das stimmt, löst aber leider mein Problem nicht, dass ich Fields bzw. DataFields keinen Namen oder Index übergeben darf ohne einen Fehler zu erhalten.
Trotzdem dank' ich dir erstmal! Ich hab es zwischenzeitlich noch auf andere Weise, nach diesem Beispiel ![]()
Code:
Eingebunden habe ich dafür OleServer und WordXP (um TWordApplication bekannt zu machen). Nun hatte ich gehofft, dass er damit vielleicht keine Probleme bekommt, aber angeblich gibt es für Fields kein Count! Er kennt lediglich ..ActiveDocument.Field.Application..
procedure testMerge2();
var wordApp: TWordApplication; dir: OleVariant; begin wordApp := TWordApplication.Create(nil); wordApp.Connect; dir := edtUser.Text; wordApp.Documents.OpenOld(dir,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam); // ShowMessage(wordApp.ActiveDocument.Fields.Count); <-- Count nicht bekannt end; Wie im verlinkten Beispiel beschrieben sollte es aber genau so funktionieren:
Code:
Ich verzweifel langsam daran und hab keine Ahnung wieso er die eigentlich vorhandene Funktion nicht kennt. :oops:
cnt := wordApp.ActiveDocument.Fields.Count;
Danke an alle die bis hierher so geduldig mitgelesen haben und versuchen zu helfen. EDIT - Problem gelöst! Diesmal vergaß ich einfach IntToStr() um den Ausdruck in der ShowMessage... nunja ich verbuche das unter Anfängerfehler! :) Vielleicht gab es bei der ersten Testfunktion ein ähnliches Problem, das werde ich jetzt überprüfen, aber zumindest klappt es mit der zweiten nun, den Namen der Felder auszugeben über
Code:
Also vielen Dank nochmal an euch! ;)
wordApp.ActiveDocument.Fields.Item(i).Result.Text
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz