MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Office > Microsoft Word
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 08.07.2019, 20:31   #1
Lichtwelle
Neuer Benutzer
Neuer Benutzer
Standard VBA - Seitenumbruch in einem Textbereich verhindern bzw. vorziehen

Hallo,

wie kann ich dafür sorgen, dass ein bestimmter Textblock (bestehend aus mehreren kleinen Absätzen) auf der gleichen Seite bleibt, ohne dass ein Seitenwechsel darein kommt? Der Seitenwechsel müsste also vorgezogen werden.

Zur Klarstellung: Es geht nicht darum, eine Überschrift an dem nächsten Absatz zu klammern (das Problem habe ich bereits dank Gerhards Hilfe gelöst) sondern mehrere Zeilen -mit Absatzzeichen- dürfen nicht getrennt werden.

Ich hatte bereits mit

.KeepWithNext = True
.KeepTogether = True
zu Beginn des Blocks und

.KeepWithNext = False
.KeepTogether = False
am Ende probiert aber es funktioniert leider nicht.

Die VBA-Befehle kommen aus Excel übrigens (und Excel steuert Word).

Ich bedanke mich im Voraus für eure Hilfe.
Lichtwelle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 08.07.2019, 22:11   #2
Gerhard H
MOF Guru
MOF Guru
Standard

Hallo Lichtwelle,

diese Einstellungen sind prinzipiell die richtigen.

KeepTogether (diesen Absatz zusammenhalten) verhindert einen Seitenumbruch innerhalb eines Absatzes und sollte also auf alle Absätze des Bereichs angewendet werden.

KeepWithNext (nicht vom nächsten Absatz trennen) verhindert, dass ein Seitenumbruch zwischen dem Absatz mit dieser Einstellung und dem Folge-Absatz stattfinden kann. Sie sollte auf alle Absätze mit Ausnahme des letzten angewendet werden, damit nicht der erste Folgeabsatz hinter dem Bereich mit einbezogen wird.

Das funktioniert auch von Excel aus. Die Schwierigkeit besteht wohl eher darin, von Excel aus den richtigen Bereich in Word anzusprechen.

Fragen:
  • Fügst du diese Absätze aus Excel heraus erst in Word ein oder willst du dich du dich auf bereits existierende Absätze beziehen?
  • Wodurch ist definiert, dass es sich bei diesen Absätzen um einen Bereich handeln soll, der gemeinsam beackert werden soll (z.B. durch eine Textmarke o.ä.)?
  • Und schließlich die beliebteste Frage: Was bedeutet: "funktioniert leider nicht"? Kriegst du kein Ergebnis / nicht das erwartete Ergebnis / eine Fehlermeldung (wenn ja: Wortlaut?)

Am einfachsten wäre es, wenn du zusätzlich zur Beantwortung dieser Fragen ein relevantes Stück Code zur Verfügung stellen würdest.

__________________

Gruß
Gerhard
Gerhard H ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 09.07.2019, 19:37   #3
Lichtwelle
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hallo Gerhard,

Danke für deine Antwort. So kommt man schon ein Stück weiter.

Anbei ein Stück von meinem Code:


'Baustein 11: AGBs

.Selection.ParagraphFormat.KeepTogether = True
.Selection.ParagraphFormat.KeepWithNext = True

.Selection.ParagraphFormat.SpaceAfter = 15
.Selection.Font.Bold = True
.Selection.TypeText Text:="9. Allgemeine Geschäftsbedingungen"
.Selection.Font.Bold = False
.Selection.TypeParagraph
.Selection.ParagraphFormat.KeepWithNext = False
.Selection.ParagraphFormat.SpaceAfter = 0
.Selection.TypeText Text:="Der Lieferant weist ausdrücklich darauf hin, dass ergänzend seine Allgemeinen Geschäftsbedingungen (AGB) Vertragsbestandteil sind."
.Selection.TypeParagraph
.Selection.TypeParagraph

'Baustein 12: Unterschriften

.Selection.TypeParagraph
.Selection.TypeParagraph
.Selection.TypeParagraph
.Selection.TypeParagraph
.Selection.TypeText Text:=vbTab & vbTab & vbTab & vbTab & vbTab & "____________________"
.Selection.TypeParagraph
.Selection.TypeText Text:="Ort, Datum" & vbTab & vbTab & vbTab & HauptFormular.Kunde_Name.Value

.Selection.TypeParagraph
.Selection.TypeParagraph
.Selection.TypeParagraph
.Selection.TypeParagraph
.Selection.TypeText Text:=HauptFormular.Standort.Value & " " & HauptFormular.Datum.Value & vbTab & vbTab & vbTab & "____________________"
.Selection.TypeParagraph
.Selection.TypeText Text:=vbTab & vbTab & vbTab & vbTab & vbTab & "Unterschrift Lieferant"
.Selection.TypeParagraph

.Selection.ParagraphFormat.KeepTogether = False
Wenn ich das mache, dann wird das KeepWithNext berücksichtigt (Überschrift vom nächsten Absatz nicht trennen) aber nicht KeepTogether (mehrere Absätze nicht voneinander trennen, also auf der gleichen Seite lassen und ggfs. den Seitenwechsel vorziehen). Die verschiedenen Absätze sind also nicht unbedingt auf der gleichen Seite. Es wird übrigens keine Fehlermeldung angezeigt.

Nun habe ich etwas ausprobiert: Zeile ".Selection.ParagraphFormat.KeepWithNext = False" einfach rausnehmen. Dann klappt es. Ich verstehe nicht warum aber es klappt.

Nun habe ich das gleiche Prinzip angewandt (also KeepTogether und KeepWithNext = True vor der Tabelle und 1 Zeile direkt danach KeepTogether = False), um die Splittung einer Tabelle auf 2 Seiten zu vermeiden. Die Tabelle wird zwar nicht gesplittet aber ein paar Absätze werden auch mit berücksichtigt, sodass der vorgezogener Seitenwechsel zu früh stattfindet.

Diese Lösung ist also nicht ganz sauber: ok am Ende eines Dokuments aber nicht mittendrin.

Hast du eine sauberere Lösung parat, die auch mitten in einem Dokument ohne unangenehme Nebenwirkungen benutzt werden kann?

Im Voraus vielen Dank.
Lichtwelle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 09.07.2019, 21:19   #4
G.O.Tuhls
MOF Meister
MOF Meister
Standard

Du hast das Prinzip nicht verinnerlicht.
KeepWithNext hält den so formatierten Absatz mit dem folgenden Absatz zusammen, egal ob Überschrift oder Textkörper.
KeepTogether verhindert, dass ein Absatz auseinandergerissen wird; der Seitenumbruch kommt vor diesem Absatz, aber wenn er noch auf die Seite passt, hat er keinen Zusammenhalt mit dem folgenden.
Bei Tabellen gilt das ebenso, allerdings kommt dort noch der interne Schutz
PHP-Code:

Selection.Tables(1).Rows.AllowBreakAcrossPages 
dazu, dass innerhalb einer Zelle nicht umbrochen werden darf.

Gruß
G.O.

__________________

Wer mehr über PowerPoint und Word wissen möchte, kann gern mal hier reinschauen.
G.O.Tuhls ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 09.07.2019, 22:36   #5
Gerhard H
MOF Guru
MOF Guru
Standard

Hallo Lichtwelle,

erstmal stimmt, was Thuls schreibt: KeepTogether bedeutet nicht: Mehrere Absätze zusammenhalten, sondern jeweils 1 Absatz zusammenhalten. Nur im Verein mit KeepWithNext kannst du so ganze Blöcke zusammenhalten. Was erklärt, warum KeepWithNext=False da fehl am Platz ist.

Aber mal ganz prinzipiell nebenbei:

Ein Vertragswerk quasi buchstabenweise zusammensetzen zu lassen halte ich nicht für die vornehmste Aufgaben von VBA. Da hab ich keine saubere Lösung.

Ich würde, soweit der Vertragstext konstant ist, ihn entweder sowieso schon im Dokument vorhalten oder als Autotext abspeichern und bei passender Gelegenheit einfügen.

In beiden Fällen kannst du deine Absatzeinstellungen vorher passend formatieren und musst es nicht zur Laufzeit tun. Für die variablen Elemente (Kunden- und Lieferantennamen) könntest du ebenfalls in beiden Fällen Platzhalter vorsehen, die dann vom Makro gefüllt werden.

__________________

Gruß
Gerhard
Gerhard H ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.07.2019, 21:03   #6
Lichtwelle
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hi G.O. Tuhls und Gerhard,

vielen Dank für euren Input. Nun habe ich es verstanden und es funktioniert ganz gut.

Viele Grüße

@ Gerhard: Der Vertragstext ist überhaupt nicht konstant. Je nachdem werden diese oder jene Textbausteine verwendet, gewisse Berechnungen oder Tabellen eingebaut usw. Es sind auch viele Dokumente, die erstellt werden müssen (aktuell bis zu 15 pro Fall, könnte aber noch ausgebaut werden). Platzhalter kann man auch vergessen, u.a. weil die Daten nicht immer die gleiche Länge oder gleich viele Worte haben (und das Ganze soll trotzdem tip top aussehen, ohne Leerzeichen oder Leerzeilen zu viel). Das Stückchen Code, was ich gepostet habe, ist nicht mal die Spitze des Eisbergs. Eigentlich ist das, was ich gemacht habe, ein sehr gewagtes Projekt aber es ist fast zu Ende (zumindest was die Technik angeht).
Lichtwelle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.07.2019, 12:57   #7
Lichtwelle
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hi,

ich habe doch ein Problemchen mit den Tabellen:

Wenn ich die Befehle

Vor dem Aufbau der Tabelle:
.Selection.ParagraphFormat.KeepTogether = True
.Selection.ParagraphFormat.KeepWithNext = True

[Befehle für den Aufbau und die Befüllung der Tabelle]
.ActiveDocument.Tables(1).Rows.AllowBreakAcrossPages = False

Nach den Tabellenanweisungen:
.Selection.ParagraphFormat.KeepTogether = False
.Selection.ParagraphFormat.KeepWithNext = False
Dann trennt der Rechner die erste Zeile der Tabelle vom Rest der Tabelle (1. Zeile auf eine Seite, Rest auf der nächsten), obwohl noch genug Platzauf der 1. Seite ist...


Ich habe auch folgendes ausprobiert:

For i = 1 to Zahl_der_Zeilen - 1
.ActiveDocument.Tables(1).Rows(i).KeepWithNext = True
Next i
funktioniert leider nicht: es kommt die Fehlermeldung 438: Objekt unterstützt diese Eigenschaft oder Methode nicht.

Könnt ihr mir helfen? Danke im Voraus.
Lichtwelle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.07.2019, 14:50   #8
G.O.Tuhls
MOF Meister
MOF Meister
Standard

Vermutlich hängt die zweite Zeile mit einem KeepWithNrxt an der folgenden.
Umbruchschutz in Tabellen sollte man immer nur händisch am Objekt erledigen, nicht auf automatisch.
Dein Bausteinmodell solltest Du auch noch mal überdenken.

Gruß
G.O.

__________________

Wer mehr über PowerPoint und Word wissen möchte, kann gern mal hier reinschauen.
G.O.Tuhls ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.07.2019, 20:45   #9
Lichtwelle
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Jetzt habe ich es!!!!!!

Die Befehle KeepTogether = False und KeepWithNext = False musste ich NACH dem folgenden Befehl platzieren:

.Selection.EndKey Unit:=6

(Mit diesem Befehl springt der Cursor aus der Tabelle raus, damit der weitere Text außerhalb der Tabelle geschrieben wird. Es entspricht STRG + Ende.)

Ich weiß nicht, warum es relevant ist aber das ist so.

Jetzt funktioniert die Tabelle, wie sie soll. Juhu!!!
Lichtwelle ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:02 Uhr.



Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.