hallo reinhard
also, code für das automatisch erzeugen von serienbriefen habe ich massenweise, nur keinen davon darf ich dir weitergeben (firmeninterner code). da was passendes für dich zusammenzustellen ist etwas aufwand und so nebenbei nicht so leicht. wird ev. etwas dauern.
das mit dem bestimmten wort auf der xten seite ist gar nicht so leicht: seiten sind im word keine eigenständige einheit. wäre auch sinnlos, da bereits das wechseln des druckertreibers möglicherweise auswirkungen auf die seitenumbrüche hat. ausserdem gibt es etliche andere gründe, warum der seitenumbruch sich einfach so ändert, obwohl man nichts am text verändert hat.
word geht generell so vor: es gibt ein range-objekt, dass einen bestimmten textbereich markiert (mit beginn- und endposition). range-objekte können durchaus geschachtelt bzw. überlappend sein. etliche relevante range-objekte erkennt word automatisch und bietet diese komfortable an.
beispiel: den bereich des gesammten dokuments bekommst du mit
activedocument.range
automatisch untergliedert word das dokument in abschnitte (sections), abstätze (paragraphs), wörter (words) und Zeichen (characters). jedes dokument hat mindestens einen abschnitt und mindestens einen absatz. ein absatz ist definiert als bereich zwischen zwei absatzzeichen (ausnahme: der erste absatz des dokuments liegt zwischen dokumentbeginn und ersten absatzzeichen).
du kannst also so das 5. wort des 7. absatzes des dokuments holen:
set Wort = Activedocument.range.paragraphs(7).range.words(5)
„Wort“ ist dabei selbst wieder ein Range-Objekt. An den Text des Range-Objekts kommst du mit der .Text-Eingenschaft ran (also Wort.Text).
das 17 Wort des 2. Abschnittes bekommst du z.b. über
set Wort = ActiveDocument.range.Sections(2).range.words(17)
du musst dich also nicht entlang der „granularität“ der range-objekte entlanghanteln sondern nimmst je den bereich, der dich interessiert.
leider kommt man an seiten nicht so leicht ran. da ist etwas tricksen angesagt:
’ Die Range des Beginns der 4. Seite holen
Set SeiteStart = ActiveDocument.Range.GoTo(what:=wdGoToPage, Name:=„4“)
’ Den Range der aktuellen Seite zum vorigen Range holen
Set Seite = SeiteStart.GoTo(what:=wdGoToBookmark, Name:="\page")
’ das 4. Wort des 2. Absatzes der markierten Seite holen
Set Wort = Seite.Paragraphs(2).Range.Words(4)
msgbox "das wort ist " & Wort.Text
Das Problem dabei: als 1. Absatz einer Seite gilt der erste VOLLSTÄNDIGE Absatz! wenn also ein absatz über drei seiten geht, dann hat die zweite seite technisch keinen absatz (der gehört ja zur ersten seite). der obige code liefert also ev. nicht ganz das ergebnis, dass du dir erwartest.
um es halbwegs sauber hinzubekommen, musst du vergleichen, ob der beginn des ersten absatzes der beginn der ersten seite ist. wenn nicht, musst du die „differenz“ zwischen beginn der seite und beginn des ersten absatzes als „absatz ehrenhalber“ heranziehen. wird eine ganz schöne bastelei.
und vor allem: kaum nimmst du einen anderen druckertreiber oder ein spezielles absatzformat (zeilen zusammenhalte, absatzkontrolle etc.) schaut es komplett anders aus, ohne auch nur einen strich am dokument geändert zu haben.
wenn du also tatsächlich die (harte) forderung hast, das xte wort der xten seite ermitteln zu müssen und diese information irgendeine wichtigere relevanz hat, so musst du sicherstellen, dass alle beteiligten, die das word-dokument öffnen wollen, den selben druckertreiber verwenden und die selben formatvorlagen in den dokumentvorlagen drinnen haben. nebenbei sollte word noch absolut identisch konfiguriert sein. mit einem wort: sinnlos!
bleibt dir nur, an den anforderungen zu schrauben (das xte wort nach einer klar definierten marke im dokument oder so).
lg
erwin
ps: wie dringend ist dir der code für die serienbrieferstellung bzw. wie detailliert soll es sein? das simpleste ist ja, einfach die erstellung eines serienbriefes mit dem makrorekorder aufzuzeichen - das ist meist durchaus brauchbar.