AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Serienbrieffelder auslesen

Ein Thema von Nightjacket · begonnen am 28. Feb 2013 · letzter Beitrag vom 1. Mär 2013
Antwort Antwort
Benutzerbild von Nightjacket
Nightjacket

Registriert seit: 28. Feb 2013
7 Beiträge
 
Delphi 7 Professional
 
#1

Serienbrieffelder auslesen

  Alt 28. Feb 2013, 14:45
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:
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;
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).

Allerdings entnahm ich das Vorgehen hierfür direkt vom MSDN: http://msdn.microsoft.com/en-us/libr...ice.11%29.aspx

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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Serienbrieffelder auslesen

  Alt 28. Feb 2013, 14:58
Die Enumeration befindet sich in der Eigenschaft Item

BookMarks.Item(i).Name
Markus Kinzler
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: Serienbrieffelder auslesen

  Alt 28. Feb 2013, 15:05
Ist schon etwas her, aber m.E. sind MailMergefields etwas anderes als Bookmarks, ggF. immerhin eine Teilmenge der Bookmarks...
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Nightjacket
Nightjacket

Registriert seit: 28. Feb 2013
7 Beiträge
 
Delphi 7 Professional
 
#4

AW: Serienbrieffelder auslesen

  Alt 28. Feb 2013, 15:16
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.

Die Enumeration befindet sich in der Eigenschaft Item

BookMarks.Item(i).Name
Ja auch das stimmt, nur wie oben beschrieben, bekomme ich eine Meldung, dass Item nicht bekannt ist (weder als Eigenschaft noch als Methode). Genau da liegt nun mein Problem. Ich weiß nicht wie ich meine MailMerge-Fields ansprechen kann um ihren "Namen" zu erhalten.

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.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: Serienbrieffelder auslesen

  Alt 28. Feb 2013, 16:48
versuch mal
Code:
.MailMerge.DataSource.DataFields('myMMfield').Value
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Nightjacket
Nightjacket

Registriert seit: 28. Feb 2013
7 Beiträge
 
Delphi 7 Professional
 
#6

AW: Serienbrieffelder auslesen

  Alt 1. Mär 2013, 07:21
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:
word := CreateOleObject('Word.Application');
Könnte es vielleicht damit zu tun haben und es gibt noch eine andere einfache Möglichkeit auf Word zuzugreifen (ohne OLE)?

Geändert von Nightjacket ( 1. Mär 2013 um 07:25 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: Serienbrieffelder auslesen

  Alt 1. Mär 2013, 08:11
Mailmerge.Datafields gehört zu Documents.

http://msdn.microsoft.com/en-us/libr...ice.10%29.aspx
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Nightjacket
Nightjacket

Registriert seit: 28. Feb 2013
7 Beiträge
 
Delphi 7 Professional
 
#8

AW: Serienbrieffelder auslesen

  Alt 1. Mär 2013, 08:49
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 hier, versucht und stoße auch dabei wieder auf Probleme:
Code:
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;
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..
Wie im verlinkten Beispiel beschrieben sollte es aber genau so funktionieren:
Code:
cnt := wordApp.ActiveDocument.Fields.Count;
Ich verzweifel langsam daran und hab keine Ahnung wieso er die eigentlich vorhandene Funktion nicht kennt.

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:
wordApp.ActiveDocument.Fields.Item(i).Result.Text
Also vielen Dank nochmal an euch!

Geändert von Nightjacket ( 1. Mär 2013 um 09:07 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz