Word-Tabelle (VBA) KeepTogether

Hallo,

Ich habe eine Word (2002)-Tabelle welche einen Kopfbereich hat und eine "Buchungs"Zeile. Die Buchungszeile (um welche es geht) besteht aus mehreren Zeilen (erst mal 2, welche dann noch mal teilweise aufgeteilt sind).

Nun habe ich ein Programm geschrieben, welches folgendes macht:
um diese erste (und bis jetzt einzige) Buchungszeile ist eine Textmarke. Das Programm markiert die Textmarke (= Buchungszeile), kopiert sie in die Zwischenablage und - je nach dem wie viele Buchungen zu tun sind - fügt er unterhalb der Buchungszeile1 diesen Bereich wieder ein.

Dies klappt auch wunderbar und ohne Probleme.

Nun kann es jedoch sein, dass so viele Buchungszeilen sind, dass diese mehrere Seiten beansprucht. Dadurch passiert es, dass eben zb von Buchungszeile 9 die (Abbuchungs)Zeile auf Seite 1 steht und die (Zubuchungs)Zeile auf Seite 2, was nicht schön aussieht und sich für die Buchungsstelle auch nicht so prickelnd macht.
Deshalb kam ich auf die Idee die (zusammenhängenden) Tabellenzeilen (welche eine Buchungszeile darstellen) mit „Format/Absatz/Absätze nicht trennen“ zu verbinden, was auch - wenn ich nur Buchungszeile 9 damit bestücke - funktioniert und diese zusammenhängend auf Seite 2 präsentiert. Jetzt möchte ich aber nicht auszählen welche Buchungszeile ich damit bestücke sondern sagen: ich markiere Buchungszeile 1 (die mit der Textmarke), stelle dort den Befehl ein und fertig. Und sobald das obige Programm ausgeführt wird werden die jeweils zusammenhängenden Zeilen (welche jeweils 1 Buchungszeile darstellen) auch zusammenhängen.
Leider ist nix mit „und fertig“, da er nun ALLE Buchungszeilen auf Seite 2 ff packt *g*

Wo ist mein Denkfehler bzw. was kann man tun damit es funktioniert?

LG Tobias

Hallo Tobias,

ich verstehe dein problem kaum, liegt aber an meinen Wordkenntnissen/-nichtkenntnissen.

Zeige doch mal deinen programmcode. Vielleicht auch eine Beispiel.doc hochladen wo man z.B. in den Blättern 1-3 sieht was vorliegt und in den Blättern 7 ff sieht man wie es nach einem Code aussehen soll.

Hochladen mit file-upöoad.net o.ä. s. FAQ:2606

Oder zwei Docs, für mich bitte nicht als zip zusammenpacken.

Gruß
einhard

Hallo Reinhard,

ich verstehe dein problem kaum, liegt aber an meinen
Wordkenntnissen/-nichtkenntnissen.

das macht nix :smile:

Zeige doch mal deinen programmcode. Vielleicht auch eine
Beispiel.doc hochladen wo man z.B. in den Blättern 1-3 sieht
was vorliegt und in den Blättern 7 ff sieht man wie es nach
einem Code aussehen soll.

Der Code ist hier nicht so wild da es nur um „Selection.Copy“ geht.

Also, mal ganz von vorn:
ich habe eine Word-Tabelle mit x Spalten (auch unwichtig) und 4 Zeilen. Also in Wirklichkeit sind es 2 Zeilen, welche (nur in einigen Spalten) noch einmal unterteilt wurden. Diese „vier“ Zeilen gehören zu einer „Buchungszeile“. Sprich: in den oberen beiden soll die Abbuchung stehen, in den unteren beiden die Zubuchung.
Nun habe ich um diesen Tabellenbereich eine Textmarke gelegt. Diese Textmarke bewirkt dass mein Programm diesen Bereich in die Zwischenablage packen kann und dann wieder - bei Bedarf (sprich: wenn weitere Buchungszeilen benötigt werden) - eingefügt werden können (mit Selection.Copy).
Das klappt auch einwandfrei und dort ist auch nicht mein Problem.
Mein Problem liegt im Seitenwechsel. Word bricht (bei einer langen Tabelle) jede Zeile einzeln um, was auch - als solches - kein Problem ist. Nun ist es aber so dass meine „Buchungszeile“ immer 4 ( ! ) Word-Tabellen-Zeilen beinhaltet. Wenn der Zeilenumbruch jetzt kommt tut er (dürfte sich nicht ändern) die erste von den zusammenhängenden 4 Zeilen auf Seite 1 schreiben und die restlichen 3 Zeilen auf Seite 2 des Dokuments. Das möchte ich nicht, da diese 4 Zeilen ja zusammenhängend sind. Und ich wette, dass die Damen in der Datenerfassung dann Probleme hätten diese Buchungszeile gut zu lesen.

Deshalb möchte ich mir ein Feature von Word zu Nutze machen: „Absätze nicht trennen“. Wenn ich jetzt (im fertigen Dokument) die entsprechend „komische“ Buchungszeile markiere und mit dem Befehl formatiere rutscht die erste Zeile automatisch auf die 2. Seite - genau so wie ich es möchte. Nur möchte ich das nicht händisch tun sondern eben automatisch. Deshalb hatte ich folgende Idee: ich sage für die erste Buchungszeile (welche immer da ist und eben kopiert wird) dass hier gelten soll „Absätze nicht trennen“. Mein Gedanke war, dass ich eben dann Abschnitt für Abschnitt (also die jeweiligen 4 Buchungszeilen als „Gesamtes“) mit „Absätze nicht trennen“ belege um dann zu erreichen dass - sobald das Programm eine neue Buchungszeile einfügt (selection.copy) diese automatisch (durch den Word-Befehl) auf die neue Seite geschrieben werden (so sie nicht mehr auf die aktuelle Seite passen).
Das passiert aber nicht: jetzt packt er ALLE Zeilen auf Seite 2 ff.
Sprich: Word findet jetzt nicht 10 „Einzelbereiche a 4 Tabellenzeilen“ sondern würgt die irgendwie zusammen und findet nur noch 1 Einzelbereich mit (9 * 4=) 40 Zeilen (oder so). Und das ist nicht das was ich will *g*.

Ich hoffe die Beschreibung war jetzt besser :smile:

LG

Hallo Tobias,

Zeige doch mal deinen programmcode.

Der Code ist hier nicht so wild da es nur um „Selection.Copy“
geht.

*seufz*, dann ohne Code und ohne beispieldocs, *noch mehr seufz* ._)

ich habe eine Word-Tabelle mit x Spalten (auch unwichtig)

Warum erwähnst du es dann? Müllt doch nur mein Kleinhirn zu *gg*

und 4 Zeilen. Also in Wirklichkeit sind es 2 Zeilen, welche (nur
in einigen Spalten) noch einmal unterteilt wurden. Diese
„vier“ Zeilen gehören zu einer „Buchungszeile“. Sprich: in den
oberen beiden soll die Abbuchung stehen, in den unteren beiden
die Zubuchung.

Okay, du hast in Word 4 Zeilen, die zusammen eine sogenannte Buchungszeile darstellen, korrekt?

Nun habe ich um diesen Tabellenbereich eine Textmarke gelegt.

Diese Buchungszeile entspricht nun einer Textmarke, korrekt?

Diese Textmarke bewirkt dass mein Programm diesen Bereich in
die Zwischenablage packen kann und dann wieder - bei Bedarf
(sprich: wenn weitere Buchungszeilen benötigt werden) -
eingefügt werden können (mit Selection.Copy).

Bei „Selection“ krieg ich immmer Pickel in Excel *lach*, naja Word ist da anders, ich gehe davon aus, diese Textmarke=Buchungszeile kann man kopieren und wo man will einfügen.

Das klappt auch einwandfrei und dort ist auch nicht mein
Problem.

Aha, wir kommen zum Thema.

Mein Problem liegt im Seitenwechsel. Word bricht (bei einer
langen Tabelle) jede Zeile einzeln um,

Warum das? Sind die Zeilen zu breit/lang oder was? Entweder passt die Zeile noch unten auf die Seite, wenn nicht, halt zuoberst auf die nächste.
Was genau meinst du mit „bricht um“?

was auch - als solches - kein Problem ist.

Schön, was Erfreuliches :smile:

Nun ist es aber so dass meine
„Buchungszeile“ immer 4 ( ! ) Word-Tabellen-Zeilen beinhaltet.
Wenn der Zeilenumbruch jetzt kommt tut er (dürfte sich nicht
ändern) die erste von den zusammenhängenden 4 Zeilen auf Seite
1 schreiben und die restlichen 3 Zeilen auf Seite 2 des
Dokuments.

Okay, ich verstehe das so, entweder passt da die 4zeilige Buchungszeile noch unten auf Blatt1, wenn nicht soll da nix stehen, sondern alle vier zeilen der Buchungszeile oben auf Blatt2, korrekt?

Das möchte ich nicht, da diese 4 Zeilen ja
zusammenhängend sind. Und ich wette, dass die Damen in der
Datenerfassung dann Probleme hätten diese Buchungszeile gut zu
lesen.

Es wird doch gesagt damen sind Multitaskingfähig, dann können sie ja wohl gleichzeitig auf Seite1 und Seite2 lesen *lächel*

Deshalb möchte ich mir ein Feature von Word zu Nutze machen:
„Absätze nicht trennen“.

Kenne ich nicht. ist mir aber egal.
So vage habe ich ja manches verstanden. Du hast da eine sagen wir mal leere Tabelle, die über mehrere Seiten geht.
In den ersten 4 zeilen trägst du etwas ein, das ist dann eine Buchungszeile.
Dann willst du das kopiert haben in die zeilen 5-8, 9-12, 13-16, usw.
Ein Seitenwechsel soll nie einen vierzeiligen Block trennen, korrekt?

Gruß
Reinhard

Hallo Reinhard,

*seufz*, dann ohne Code und ohne beispieldocs, *noch mehr
seufz* ._)

naja, auf Arbeit agiere ich in Word mit Handschellen, da möchte ich mich nicht in die Nesseln setzen und Docs online stellen *g*

Okay, du hast in Word 4 Zeilen, die zusammen eine sogenannte
Buchungszeile darstellen, korrekt?

genau

Diese Buchungszeile entspricht nun einer Textmarke, korrekt?

genau, die Textmarke umschließt die kompletten 4 Zeilen

Bei „Selection“ krieg ich immmer Pickel in Excel *lach*, naja
Word ist da anders, ich gehe davon aus, diese
Textmarke=Buchungszeile kann man kopieren und wo man will
einfügen.

Klar, bei Excel und „Select“ - ne, dat geit net *g*. Aber bevor ich Word sage dass er unter der ersten (vorhandenen) Buchungszeile eine 4 zeilige Buchungszeile einfügen soll und bitte mit diesen und jenen Maßen … Ne, da ist „kopieren“ doch einfacher. Das Programm braucht dann nur noch die Daten in die leere Zeile einfügen.

Mein Problem liegt im Seitenwechsel. Word bricht (bei einer
langen Tabelle) jede Zeile einzeln um,

Warum das? Sind die Zeilen zu breit/lang oder was? Entweder
passt die Zeile noch unten auf die Seite, wenn nicht, halt
zuoberst auf die nächste.
Was genau meinst du mit „bricht um“?

Also - gehen wir nochmal zum Urschleim :smile: Word hat Fließtext. Wenn also auf Zeile 1 nichts mehr hinpasst schreibt er automatisch auf Zeile 2 weiter. Passt was nicht meur auf Seite 1 schreibt er es automatisch auf Seite 2 ff. Also wird der Text am Zeilen- und Seitenende „umgebrochen“ (kommt aus dem Druckereibereich).
Und Word macht das selbe bei Tabellenzeilen. Auch da wird die nächste Zeile auf die nächste Seite genommen wenn sie nicht draufpasst. Da jetzt aber 4 Zeilen „zusammen“ gehören sollen - macht Word das nicht richtig *g*.

Okay, ich verstehe das so, entweder passt da die 4zeilige
Buchungszeile noch unten auf Blatt1, wenn nicht soll da nix
stehen, sondern alle vier zeilen der Buchungszeile oben auf
Blatt2, korrekt?

richtig

Deshalb möchte ich mir ein Feature von Word zu Nutze machen:
„Absätze nicht trennen“.

Kenne ich nicht. ist mir aber egal.
So vage habe ich ja manches verstanden. Du hast da eine sagen
wir mal leere Tabelle, die über mehrere Seiten geht.

Nein, ich habe nur eine Tabelle mit 4 Zeilen (dazu noch Kopfbereich, ignoriere ich jetzt mal).

In den ersten 4 zeilen trägst du etwas ein, das ist dann eine
Buchungszeile.

genau, dies geschieht programmtechnisch.

Dann willst du das kopiert haben in die zeilen 5-8, 9-12,
13-16, usw.

Nein, mein Programm tut „Guthaben“ und „schulden“ (die der Nutzer über ne UserForm eingeben kann) solange umbuchen bis entweder keine Schulden mehr da sind oder das Guthaben aufgebraucht ist. Deshalb kann es mal eine Buchung sein, mal 15. Deshalb sage ich dem Programm: wenn die erste Buchungszeile nicht ausreicht füge die (bereits vorher in die Zwischenablage kopierte leere Buchungszeile 1) unter die Buchungszeile 1 ein und trage dort eben die nächste Buchung ein. Reicht das wieder nicht aus füge darunter wieder eine Buchungszeile ein etc. Solange bis eben nix mehr zu tun ist. Deshalb kann der Vordruck mal eine, mal zwei oder auch (in den seltensten Fällen) 3 Seiten lang sein.

Ein Seitenwechsel soll nie einen vierzeiligen Block trennen,
korrekt?

korrekt

LG Tobi@s

Hallo,

hab jetzt eine Lösung gefunden. Ob das die optimalste ist, ich weiß es nicht, aber sie funktioniert :smile:

Die ersten beiden Zeilen lesen das Ende der (jetzigen) letzten Zeile aus. Das „Rows.Count - 3“ ist hier (nur) notwendig, da die Tabelle so verschachtelt ist und in der ersten Spalte der letzte Zeile eben 3 weniger ist als Rows.Count.

Danach fügt er die (vorher in die Zwischenablage kopierte) leere Buchungszeile ein - könnte man bestimmt auch mit „insertAfter“ irgendwie klären, ich lass es aber jetzt so :smile:

Anschließend kommt die „richtige“ Prüfung. Erneut prüft er die jetzt letzte Tabellenzeile. Wenn sich die Seite vorher und jetzt geändert hat (Seitenwechsel) markiert er den Bereich mit „Range“ und „pos“ und „pos2“ (pos und pos2 sind wieder wegen der komischen Tabellenform zwingend so notwendig) und weise der Markierung jetzt den Befehl „Zeilen nicht trennen“ („Absätze nicht trennen“ war falsch) zu.

Habs getestet - funktioniert supi.

'Einfügen einer neuen Buchungszeile
'Absatzkontrolle wg. Seitenwechsel
ActiveDocument.Tables(2).Cell(ActiveDocument.Tables(2).Rows.Count - 3, 1).Select
AktSeite1 = Selection.Information(wdActiveEndPageNumber) 'aktuelle Seite des Beginns der Buchungszeile

'Einfügen der neuen Buchungszeile
TZ = TZ + 1
Selection.GoTo What:=wdGoToBookmark, Name:=„TEnde“
Selection.MoveUp Unit:=wdLine, Count:=1
Selection.Paste

'prüfen, ob Seitenwechsel
ActiveDocument.Tables(2).Cell(ActiveDocument.Tables(2).Rows.Count - 3, 1).Select
AktSeite2 = Selection.Information(wdActiveEndPageNumber)
If AktSeite1 AktSeite2 Then
pos = ActiveDocument.Tables(2).Cell(6 + (TZ - 1) * 4, 1).Range.Start
pos2 = ActiveDocument.Paragraphs(108 + (TZ - 1) * 34).Range.End
Set myRange = ActiveDocument.Range(Start:=pos, End:=pos2)
myRange.Select
Selection.ParagraphFormat.KeepWithNext = True 'Zeilen nicht trennen
End If

Danke für´s mit denken.
LG Tobi@s