Problem bei Zugriff auf Kopfzeile aus Makro heraus

Hallo Leute

Ich habe da ein sehr spezielles Problem: In Dokumenten sollen automatisiert alle Felder aktualisiert werden. Soweit kein Problem: activedokuments.fields.update - fertig.

Denkste: Felder, die in der Kopfzeile vorkommen, werden dabei nicht aktualisiert.

Und jetzt das eigentliche Problem: Damit ich die Felder aktualisieren kann, muss ich alle headerfooter-Objekte aller sections meines Dokuments heraussuchen und dort im range die fields updaten. Geht ja noch.

Word fügt beim Zugriff auf das range-Objekt eines headerfooter-Objekts nun aber eine Kopfzeile ins Dokument ein - die ist zwar leer (leerer Absatz), braucht aber trotzdem Platz. Waren die Seitenränder recht klein, verschiebt sich nun der Text nach unten. Bei normalen Dokumenten egal, in diesem Fall geht es aber um komplex formatierte Formulare mit vielen Tabellen, die sich gerade noch so auf einer A4-Seite ausgehen.

Was ist jetzt brauche wäre:
entweder eine Möglichkeit, um herauszufinden, ob die Kopfzeile überhaupt befüllt ist OHNE eine Kopfzeile einzufügen. Meines Wissens nach muss man an das range-Objekt ran, um rauszufinden, ob die Kopfzeile befüllt ist - und genau da wird die leere Kopfzeile eingefügt.
oder eine Möglichkeit, mit der ich leere Kopfzeilen elegant wieder entfernen kann. Einfach nur den Inhalt zu entfernen, reicht offenbar nicht. Die einzige Möglichkeit, die ich bisher gefunden habe, ist das Umschalten in die Druckvoransicht - dabei scheinen leere Kopfzeilen entfernt zu werden.

Meine bisherige Lösung mit der Druckvoransicht läuft zwar, gefällt mir aber überhaupt nicht - gibt es da was besseres?

lg
Erwin

Hallo Erwin,

Denkste: Felder, die in der Kopfzeile vorkommen, werden dabei
nicht aktualisiert.

wäre ein Makro von Nutzen was du über einen Button aufrufst und daß auch diese Felder aktualisiert?
Dann lad mal mit FAQ:2606 eine Doc hoch wo so Felder sind.

Und jetzt das eigentliche Problem: Damit ich die Felder
aktualisieren kann, muss ich alle headerfooter-Objekte aller
sections meines Dokuments heraussuchen und dort im range die
fields updaten. Geht ja noch.

Word fügt beim Zugriff auf das range-Objekt eines
headerfooter-Objekts nun aber eine Kopfzeile ins Dokument ein

  • die ist zwar leer (leerer Absatz), braucht aber trotzdem
    Platz.

Wie kann ich da sehen daß da was Leeres eingefügt wurde? Beispieldoc?
Wenn ich das laufen lasse, sehe ich nix Eingefügtes.
Übersehe ich da was?

Sub check()
Dim N As Integer
For N = 1 To ActiveDocument.Sections.Count
 With ActiveDocument.Sections(N).Headers(wdHeaderFooterPrimary)
 If .Range.Text vbCr Then
 MsgBox .Range.Text
 Else
 MsgBox "Footer is empty"
 End If
 End With
Next N
End Sub

oder eine Möglichkeit, mit der ich leere Kopfzeilen elegant
wieder entfernen kann. Einfach nur den Inhalt zu entfernen,
reicht offenbar nicht.

Vielleicht reicht da (ungetestet) sowas, bezogen auf obigen Code,:
.Range.Text =replace(.Range.Text, vbCr, „“)

Gruß
Reinhard

Hallo Erwin,

Word fügt beim Zugriff auf das range-Objekt eines headerfooter-Objekts nun aber eine Kopfzeile ins Dokument ein - die ist zwar … (leerer Absatz), braucht aber trotzdem Platz.

wenn sie angezeigt wird…

…in diesem Fall geht es aber um komplex formatierte Formulare mit vielen Tabellen, die sich gerade noch so auf einer A4-Seite ausgehen …Einfach nur den Inhalt zu entfernen,:reicht offenbar nicht.

die Absatzmarke ist ja noch da…

Die einzige Möglichkeit, die ich bisher gefunden habe, ist das Umschalten in die Druckvoransicht - dabei scheinen leere Kopfzeilen entfernt zu werden.

und wird in der Seitenansicht nicht angezeigt.

Meine bisherige Lösung mit der Druckvoransicht läuft zwar, gefällt mir aber überhaupt nicht - gibt es da was besseres?

Ich würde das so lösen:

  1. Jede Kopfzeile bekommt automatisch die Formatvorlage „Kopfzeile“ zugewiesen. Diese Formatvorlage würde ich in allen Dokumenten auf Schriftgröße 1 Punkt und Zeilenabstand einfach (alternativ: Format - Zeichen: Effekt ausgeblendet bzw. verborgen) setzen. Dadurch verschwinden die Absatzmarken auch in der Normalansicht beinahe.

  2. Dann müßtest Du nur die Felder wieder „sichtbar“ machen, Das liegt in Deinem Ermessen: wenn in der Kopfzeile nur Felder sind, würde ich sie mit einer Zeichenformatvorlage formatieren, sonst würde ich dem Absatz eine Absatzformatvorlage zuweisen.

Im übrigen bleibt noch eine Frage offen:

In Extras - Optionen, Registerkarte Drucken kann man ankreuzen: Felder aktualisieren. Warum funktioniert das bei Dir nicht?
Wenn es doch funktionieren sollte, würde ich einfach folgenden Befehl verwenden:

With Options
 .UpdateFieldsAtPrint = True
 .MapPaperSize = False
End With

Die zweite Zeile schaltet „Anpassen an A4/US-Letter“ ab. Das hat bei mir schon viel Ärger verursacht, weil Word weder lesen noch denken kann (das ist wie auch das RGV-Verzeichnis etwas, was nur für amerikanische Rechtsanwaltskanzleien programmiert wurrde - und genauso qualitativ und inhaltlich gut und billig arbeitet wie letztere :smiley:).

HTH.

Markus

hab offenbar wesentliche Infos vergessen…
Hallo nochmal

Das wichtigste: Ich arbeite mit MS Office 2003 SP2 unter Windows XP.

Das Makro läuft nicht nur auf meinem PC sondern im Firmennetzwerk bei ca. 4000 Anwendern. Es soll Daten aus einer Anwendung automatisiert ins Dokument übernehmen. Diese Daten werden in Dokumentvariablen gespeichert und mittels DocVariable-Feldern visualisiert. Es geht dabei um mehrere Millionen Dokumente von verschiedensten Benutzern auf verschiedenste Art formatiert. Die Dokumente werden nur zu einem kleinen Teil tatsächlich gedruckt. In den meisten Fällen erfolgt die Verarbeitung vollelektronisch, d.h. sie werden nur am Monitor gelesen. Ich habe nur wenig Einfluss darauf, wie das Word genau eingestellt ist und praktisch keinen Einfluss darauf, in welcher Ansicht die Benutzer arbeiten. Abgesehen davon, dass es bei Word manchmal von Zufall abzuhängen scheint, in welcher Ansicht das Dokument geöffnet wird.

Demententsprechend fallen die Lösungsansätze flach: die Felder beim Druck zu aktualisieren, ist zu spät bzw. fällt komplett aus. Die Kopfzeile auf Verdacht hin umzuformatieren ist nicht so gut - immerhin wird die ja teilweise verwendet (daher kommt ja meine Erkenntnis, dass Felder in der Kopfzeile nicht einfach so aktualisiert werden können). Wie man über das Range-Objekt des HeaderFooter-Objekts rausfindet, ob die Kopfzeile befüllt ist, weiss ich eh - nur wird dann eben eine leere Kopfzeile eingefügt, die allerdings trotzdem Platz braucht.

Die Fragen sind daher:
Wie kann man OHNE Zugriff auf das Range-Objekt feststellen, ob die Kopfzeile tatsächlich verwendet wird. Word scheint ja sehr wohl zwischen einer leeren und gar keiner Kopfzeile zu unterscheiden.
ODER
Wie kann ich dem Word sagen, dass es die aktuelle Kopfzeile verwerfen soll. Einfach nur den Inhalt zu löschen, bringt nichts, da zumindest das letzte Absatzumbruchszeichen übrig bleibt.

Mein Workaround über die Druckvoransicht funktioniert eh - nur ist das meiner Meinung nach wenig elegant. Ich bekomm zwar keinen Preis für eleganten Makro-Code, würde aber gerne was dazulernen.

lg
Erwin

Hallo Erwin,

Diese Daten
werden in Dokumentvariablen gespeichert und mittels
DocVariable-Feldern visualisiert.

sorry, sagt mir wenig. Meinst du mit Dokumentvariablen CustomDocumentProperties?

Ich habe nur wenig Einfluss darauf, wie
das Word genau eingestellt ist und praktisch keinen Einfluss
darauf, in welcher Ansicht die Benutzer arbeiten.

Wenn Makros aktiviert sind kannste doch im Document_Open-Ereigniscode die Ansicht vorgeben und sogar unterbinden daß andere Ansichten gewählt werden können *denk*

Wie man über das
Range-Objekt des HeaderFooter-Objekts rausfindet, ob die
Kopfzeile befüllt ist, weiss ich eh - nur wird dann eben eine
leere Kopfzeile eingefügt, die allerdings trotzdem Platz
braucht.

Zeig mal den Code.

Wie kann man OHNE Zugriff auf das Range-Objekt feststellen, ob
die Kopfzeile tatsächlich verwendet wird. Word scheint ja sehr
wohl zwischen einer leeren und gar keiner Kopfzeile zu
unterscheiden.
ODER
Wie kann ich dem Word sagen, dass es die aktuelle Kopfzeile
verwerfen soll. Einfach nur den Inhalt zu löschen, bringt
nichts, da zumindest das letzte Absatzumbruchszeichen übrig
bleibt.

Ich habe (Word2000) ein neues leeres Dokument genommen, Zufallstext eingetragen bis alle zeilen des ersten Blattes gefüllt waren.
Dann über Ansicht Die Kopf- und Fußzeilen eingeblendet, dort was eingegeben, mit meinem Code geprüft ob was drinsteht, dann die Kofzeile manuell gelöscht, wieder den Code aufgerufen…

Ich kann da nicht feststellen daß sich durch die kopfzeile etwas am Text verändert/verschiebt.

Insofern, ohne eine Beispieldoc wo das auftritt kann ich dir nicht helfen.

Gruß
Reinhard

Hallo Erwin,

…Daten werden in Dokumentvariablen gespeichert und mittels DocVariable-Feldern visualisiert.

Daß das funktioniert, wundert mich. Mir liegen eher Informationen vor, daß Word regelmäßig bei {DocVariable}s in Kopfzeilen abschmiert.

Es geht dabei um mehrere Millionen Dokumente von verschiedensten Benutzern auf verschiedenste Art formatiert. Die Dokumente werden nur zu einem kleinen Teil tatsächlich gedruckt. In den meisten Fällen erfolgt die Verarbeitung vollelektronisch, d.h. sie werden nur am Monitor gelesen.

Wozu überhaupt Word? Word ist ein Textverarbeiter: der User gibt Text ein und formatiert ihn. Wenn die Textverarbeitung aber durch den Computer selbst stattfindet, halte ich das eher für eine Formulardarstellung einer Abfrage auf einer Datenbank.
Und wenn schon Word für so etwas malträtiert wird: Warum geht die Informationsübertragung dann über {DocVariable}s? Viel einfacher wären doch Seriendruckfelder bzw. das Range-Objekt.

Ich habe nur wenig Einfluss darauf, wie das Word genau eingestellt ist und praktisch keinen Einfluss darauf, in welcher Ansicht die Benutzer arbeiten.
Demententsprechend fallen Deine (A.d.B.) Lösungsansätze flach…

Deshalb kann ich nicht mehr viel 'zu sagen.

Wie man über das Range-Objekt des HeaderFooter-Objekts rausfindet, ob die Kopfzeile befüllt ist, weiss ich eh - nur wird dann eben eine leere Kopfzeile eingefügt, die allerdings trotzdem Platz braucht.

Konkret:
Word hat seine Macken, mit denen man einfach leben muß. Diese scheint dazuzugehören.
Ein grundlegend anderer Ansatz könnte diese Macke nicht auffällig werden lassen. Aber das ist ja undurchführbar.

Gruß

Markus

Hallo Reinhard,

sorry, sagt mir wenig. Meinst du mit Dokumentvariablen CustomDocumentProperties?

Ja. {DocVariable} greift auf beide Collections zu: BuiltIn… und Custom…, aber BuiltIn… kann der User nur befüllen, nicht benennen.

Ansonsten verweise ich auf meinen Post an Erwin.

Gruß

Markus

ich geb’s auf…
hallo

der einsatz von word ist nicht auf meinem mist gewachsen sondern entscheidung des managements.

dokumentvariablen haben NICHTS mit dokumenteigenschaften zu tun - sie funktionieren nur sehr ähnlich.

die anwendung ist in java geschrieben und kann nicht ohne weiters word über ole fernsteuern. die daten werden als xml-datei übergeben. ausserdem ändern sich die daten der anwendung immer wieder und müssen im dokument aktualisiert werden. serienbriefe o.ä. scheiden daher aus.

damit die anwendung nicht durch halblustige autoopen-makros halbgebildeter und selbsternannter word-gurus blockiert wird, werden beim öffnen des dokuments jegliche automatismen verhindert. daher kann ich eben nicht die ansicht fix vorgeben (was in diesem fall auch wenig bringen würde).

ok - schritt für schritt anleitung:

leeres dokument in seitenlayout-ansicht
alle sonderzeichen eingeschaltet
man sieht also das einsame absatzumbruchzeichen

nun folgenden code ausführen:
Sub headercheck()
MsgBox ActiveDocument.Sections(1).Headers.Item(1).Range.Characters.Count
End Sub

nun sieht man ein zweites absatzzeichen weiter oben - eben die leere kopfzeile. öffnet man die kopfzeile und schließt sie wieder, wird sie entfernt.

nochmal leeres dokument
seitenrand oben auf 0,5 cm stellen, alles andere gleich lassen
code nochmal ausführen
der beschreibbare bereich verschiebt sich nach unten, um der kopfzeile platz zu machen, die defaultmässig 1,25 cm + 10pt hoch ist.

wie schon erwähnt kann ich natürlich die kopfzeile kleiner machen - aber nur, wenn sie nicht gebraucht wird. um festzustellen, ob sie gebraucht wird, muss ich auf das range-objekt zugreifen…

wenn ich sie kleiner mache, nur weil sie JETZT nicht gebaucht wird, werden anwender, die SPÄTER eine kopfzeile brauchen, ordentlich verwirrt sein. wie erwähnt reden wir hier von millionen dokumenten auf mehreren tausend arbeitsplätzen in verschiedensten bearbeitungszuständen. mein makro muss für alle fälle gleich gut funktionieren.

ich hab mich inzwischen abgefunden, dass es keine schönere lösung geben wird. danke trotzdem für den hilfeversuch.

lg
erwin

Hallo,

mir ist noch 'was eingefallen. Was Du beobachtest, gab’s schon bei allen Vorgängerversionen. Die Bezeichnung dafür muß lauten:

It’s not a bug, it’s a feature!

Konkret:

  • Meine Dokumentvorlage für lange Briefe hat auf den Folgeseiten unter der Kopfzeile eine Linie, erzielt mit Format-Rahmen in der Formatvorlage Kopfzeile.
  • Bei Datei-SeiteEinrichten ist angekreuzt: gerade/ungerade anders, erste Seite anders.
  • Würde Word so arbeiten, wie normal denkende es erwarten, müßte auf der ersten Seite eine Linie auftauchen, obwohl die Kopfzeile nichts enthält (der Briefkopf ist im Haupttext verankert).
  • Diese Linie kommt aber nicht. Ich kann sie erzwingen, indem ich ein geschütztes Leerzeichen in die erste Kopfzeile setze.

Dieses Verhalten kenne ich seit Word für Windows 2.0. ich hab’s bis zu Deinem Post vollkommen unbewußt genutzt. Wie gesagt: It’s not a bug, it’s a feature.

Gruß

Markus