Discussion:
Fußzeilen oder wie?
(zu alt für eine Antwort)
Lothar Geyer
2016-02-24 23:45:12 UTC
Permalink
Ich schreibe Rechnungen mit einem VB6-Programm, das eine Word-Vorlage
ausfüllt. In der Tabelle der Positionen ist eine Position mit den
Textmarken definiert. Diese Position kopiere ich mir so oft in das
Dokument, wie in der aktuellen Rechnung Positionen zu erstellen sind.
Das funktioniert auch alles einwandfrei.

Nun soll folgende Aufgabe gelöst werden: Am Ende jeder Seite soll die
Zwischensumme der bis dahin gedruckten Positionen ausgegeben werden. Wie
mache ich das am Besten?

Mein erster Ansatz: in der Vorlage wird eine zweite Zeile definiert, die
den Aufbau der Zwischensummen-Zeile wiedergibt. Die kopiere ich mir (so
wie die "normale" Positionszeile auch) und füge immer am Ende einer
Seite diese Zeile ausgefüllt in die Tabelle. Problem: wie erkenne ich
das Ende einer Seite? Und was mache ich bei Positionen, die über einen
Seitenwechsel gehen? Was wenn der Anwender im Nachhinein den
Seitenwechsel in der Position ausschließt?

Zweiter Ansatz: in der Vorlage wird für die Zwischensumme eine Textmarke
in der Fußzeile definiert. Aber auch hier muss ich einen Seitenwechsel
erkennen. Und wie gebe ich das dann an, denn die selbe Textmarke muss ja
auf den verschiedenen Seiten verschiedene Zwischensummen ausgeben.

Sonstige Ansätze?
Vielleicht gibt es ja sogar Funktionen in Word, die ich nur aufrufen muss...

Leider bin ich in VBA gar nicht bewandert (zumindest was die speziellen
Funktionen anbelangt) und bitte um Eure Hilfe.

Lothar Geyer
Bernhard Sander
2016-02-25 15:13:13 UTC
Permalink
Hallo Lothar,
Post by Lothar Geyer
Ich schreibe Rechnungen mit einem VB6-Programm, das eine Word-Vorlage
ausfüllt. In der Tabelle der Positionen ist eine Position mit den
Textmarken definiert. Diese Position kopiere ich mir so oft in das
Dokument, wie in der aktuellen Rechnung Positionen zu erstellen sind.
Das funktioniert auch alles einwandfrei.
Nun soll folgende Aufgabe gelöst werden: Am Ende jeder Seite soll die
Zwischensumme der bis dahin gedruckten Positionen ausgegeben werden. Wie
mache ich das am Besten?
Mein erster Ansatz: in der Vorlage wird eine zweite Zeile definiert, die
den Aufbau der Zwischensummen-Zeile wiedergibt. Die kopiere ich mir (so
wie die "normale" Positionszeile auch) und füge immer am Ende einer
Seite diese Zeile ausgefüllt in die Tabelle. Problem: wie erkenne ich
das Ende einer Seite? Und was mache ich bei Positionen, die über einen
Seitenwechsel gehen? Was wenn der Anwender im Nachhinein den
Seitenwechsel in der Position ausschließt?
Zweiter Ansatz: in der Vorlage wird für die Zwischensumme eine Textmarke
in der Fußzeile definiert. Aber auch hier muss ich einen Seitenwechsel
erkennen. Und wie gebe ich das dann an, denn die selbe Textmarke muss ja
auf den verschiedenen Seiten verschiedene Zwischensummen ausgeben.
Sonstige Ansätze?
Vielleicht gibt es ja sogar Funktionen in Word, die ich nur aufrufen muss...
Zwischensummen in Word einzubauen ist eine echte Herausforderung.

Gerade um solche Unwägbarkeiten abzufangen, dass der Anwender nachträglich noch was ändert und sich damit alles verschiebt, würde ich die Behandlung der Zwischensummen durch ein Makro in Word erledigen. Das kann der Anwender nach seinen Änderungen nochmal aufrufen und die Zwischensummen sind wieder sauber. Der Programmieraufwand ob in VB oder in VBA ist wohl auch sehr ähnlich.

Der Ansatz mit der Fußzeile funktioniert nicht wirklich, weil die Fußzeilen innerhalb eines Abschnitts immer identisch sind. Es gibt zwar ein Feld StyleRef, das setzt aber voraus, dass die Zwischensummen im Text schon vorkommt. Du müsstest allenfalls dafür sorgen, dass jede Seite in einem eigenen Abschnitt steht... (nicht sehr sinnvoll, siehe oben, Änderungen durch den Anwender).

Das Selection- und das Range-Objekt haben die Eigenschaft .Information. Damit kann man abfragen, auf welcher Seite im Dokument sich das Ende der Range oder der Selection befindet. Range.Information(wdActiveEndPageNumber). Weiteres siehe Word-Hilfe. Darüber bekommst Du heraus, wo der Seitenwechsel stattfindet. Dann musst Du "nur noch" vorher die Zwischensummenzeile einfügen, nachprüfen, ob die Zwischesumme immer noch auf der alten Seite steht und falls nicht, entsprechend nach vorne verlegen. Problem wird sein, wenn eine Position länger als eine Seite wird. Hier muss man rein vom Layout drüber nachdenken. Um die Zwischensumme trotz des langen Positionstextes unterzubringen muss rein technisch gesehen dieser Text auf zwei Tabellenzeilen aufgeteilt werden.
Da hätte ich noch die Idee, dass die Zwischensumme auf jeder Seite in einem Positionsrahmen untergebracht wird, das irgendwo auf der Seite verankert ist, die gewünschte Position bekommen und den Umbruch "oben und unten" hat. Ein Textfeld nutzt nichts, weil es nur innerhalb der Tabellenzelle, nicht jedoch im Rest der Tabellenzeile den Text verdrängt.

Beim Abklappern der Tabellenzeile wegen dem Seitenwechsel kannst Du nebenbei gleich aufsummieren.

Die Zwischensummezeile (als Tabellenzeile) würde ich entweder als Textbaustein in der Vorlage hinterlegen oder programmatisch aufbauen.

Soweit ein paar Gedanken zu diesem Thema. Beschäftigt hat es mich gelegentlich schon, ausgeführt habe ich es bisher noch nicht.

Gruß
Bernhard Sander
Rainer H. Rauschenberg
2016-03-19 19:15:29 UTC
Permalink
Problem: wie erkenne ich das Ende einer Seite?
Als Ansatz zur Recherche ein Schnipsel aus einem Makro, mit dem ich bei
einem bestimmten Absatzformat den "Abstand nach" so lange erhöht habe,
bis der letzte Absatz der Seite bis zum unteren Ende ging:

'jetzt der gummieffekt
'MsgBox Selection.Bookmarks("\page").End & vbNewLine & myrange.End
'MsgBox myrange.Information(wdActiveEndPageNumber) & vbNewLine & ActiveDocument.Range(myrange.Start, myrange.Start).Information(wdActiveEndPageNumber)
While myrange.Information(wdActiveEndPageNumber) = ActiveDocument.Range(myrange.start, myrange.start).Information(wdActiveEndPageNumber)
Selection.Paragraphs(1).format.SpaceAfter = Selection.Paragraphs(1).format.SpaceAfter + 1
'ActiveDocument.Repaginate
Wend
'das war einer zuviel, wieder reduzieren
While myrange.Information(wdActiveEndPageNumber) > ActiveDocument.Range(myrange.start, myrange.start).Information(wdActiveEndPageNumber)
Selection.Paragraphs(1).format.SpaceAfter = Selection.Paragraphs(1).format.SpaceAfter - 1
'ActiveDocument.Repaginate
Wend

Rainer "Witz ist die 'magische' Textmarke '\page', die die aktuelle
Seite umfasst" Rauschenberg

Loading...