# Worttrennung bei Zeilenumbruch im Word-Makro verhindern



## richard32 (21. März 2010)

Hi,

wie kann ich im folgenden script (word 2007 makro) die harte worttrennung nach dem 25.zeichen verhindern ? 

_Sub test4()
'
' test4 Makro
' Makro aufgezeichnet am 19.03.2010 von uubbs
'
    Selection.MoveRight Unit:=wdCharacter, Count:=25
    Selection.TypeParagraph
    Selection.TypeText Text:="    "

End Sub_

sollte das 25.zeichen ein wort treffen, so sollte der umbruch am zuvorgehenden freizeichen erfolgen um 
die worttrennung zu vermeiden.

freue mich über jede hilfe.


----------



## DrSoong (21. März 2010)

Am einfachsten wäre es, wenn du den gesamten Text erstmal in eine Variable kopiertst und damit arbeitest.

Dann zählst du einfach 25 Zeichen ab, ab hier kannst du mit InStr() das nächste bzw. mit InStrRev() das vorhergehende Leerzeichen suchen. Dann kopierst du einfach den Text mit einem nachfolgenden Zeilenumbruch in eine neue Variable (bzw. hängst ihn an, so kriegst du in der neuen Variable den Text mit Umbrüchen) und zählst wieder deine 25 Zeichen weiter nach vorn (und immer so weiter, bis zu am Ende des Textes bist).

Ist auch die Lösung für deine andere Frage weiter unten, so bist du beim Trennen nicht stur auf eine gewisse Zeichenanzahl begrenzt.


Der Doc!


----------



## richard32 (21. März 2010)

hi doc,

danke für deine schnelle antwort.

da ich mich ab vergangenem donnerstag erst mit den makros angefangen habe zu beschäftigen, habe ich von
basic null ahnung, sorry. ich kann erahnen, was du meinst, aber mit der praktischen umsetzung in ein funktionierendes
skript scheitere ich kläglich. 

was heisst "in eine variable kopieren" ? meinst du damit das deklarieren einer objektvariablen mit der dim-anweisung ?
in welcher umgebung "zähle ich 25 zeichen ab" ? meinst du damit die ausführung des word-makros ?

nur wenn es nicht zu viel verlangt ist: wäre ich dir möglich die von dir beschriebenen schritte als ausführbares script 
niederzuschreiben ?


----------



## DrSoong (22. März 2010)

Ich hab dir hier mal einen Code geschrieben, den du einfach als Makro in deine Word-Datei einfügst.

```
Sub Trenne()
 Dim sFrom As String, sTo As String, NoCut As Boolean, iLimit As Integer, cnt
 
 iLimit = 25 'Anzahl der Zeichen
 
 Selection.HomeKey Unit:=wdStory 'An den Anfang
 Selection.EndKey Unit:=wdStory, Extend:=wdExtend 'Alles wählen
 sFrom = Selection.Text 'Text in Variable kopieren
 
 Do 'Schleife
  cnt = InStr(iLimit, sFrom, " ") 'Anzahl der Zeichen zählen
  'Wenn du nich das nächste sondern das vorherige Leerzeichen willst, müsste die Zeile
  'cnt = InStrRev(iLimit, sFrom, " ")
  'heißen.
  If cnt < 1 Then cnt = Len(sFrom): NoCut = True 'nächstes Leerzeichen suchen
  sTo = sTo & Left(sFrom, cnt) & vbNewLine 'Text in neuen String kopieren & Zeilenumbruch anhängen
  If NoCut = False Then sFrom = Right(sFrom, Len(sFrom) - cnt) 'ursprünglichen Text verkleinern
 Loop Until NoCut = True 'bis Urspung kleiner als festgelegte Zeichenanzahl
 
 Selection.Text = sTo 'Ergebnis wieder in Dokument kopieren
End Sub
```

Ist kommentiert, also zum lernen für dich.


Der Doc!


----------



## richard32 (22. März 2010)

...danke 

bin am testen (und lernen).

klappt nicht auf anhieb:

problem 1 mit InStrRev: 
es kommt zur fehlermeldung
Laufzeitfehler '13':
Typen unverträglich
debugger weist auf zeile
cnt = InStrRev(iLimit, sFrom, " ") 'Anzahl der Zeichen zählen

problem 2 mit zeilenumbruch:
skript bricht zeilen, die länger als 25 zeichen sind, und setzt den "rest" der zeichen (>25) in die nächste zeile
mit anschl. umbruch. die nächste abarbeitung erfolgt in der zeile darunter.  eigentlich sollte der "rest" aus der 
zeile mit dem text der folgezeile wieder die bedingung erfüllen:
"umbruch nach 25 zeichen am freizeichen davor/danach" .

problem 3 habe ich erst jetzt erkannt:
beim zählen der zeichen (25) gibt es scheinbar probleme mit zeilen, die <25 zeichen haben. die sollten eigentlich
ignoriert werden.
idealerweise sollte das kommando lauten
(a) suche zeile  mit >25 zeichen 
(b) gehe zurück zu nächstmöglichem freizeichen
(c) mache zeilenabsatz
[da in den "langen" passagen zeilenumbrüche fehlen, wird die zeile nach dem umbruch in der regel wieder >25 zeichen]
(d) prüfe die "neue" zeilenlänge auf die bedingung >25 zeichen, falls ja, weiter mit (b)

problem 4 (ausnahmen):
was ist, wenn in einer langen zeile keine freizeichen vorkommen ?
hier sollte harter umbruch erzwungen werden.
beispiel: 
Internet: https://beispielseite.für.mögliche.überlängen.de/archiv/doc.pc?uri=consleg:20101611:20071321:de:pdf).

ich teste weiter und berichte.


----------



## DrSoong (22. März 2010)

Zu 1) Sorry, hab hier die Argumente falsch gereiht: Muss

```
cnt = InStrRev(sFrom, " ", iLimit)
```
heißen.

Zu 2) Eigentlich nicht, der Code nimmt eine Zeile so wie gewünscht und zählt dann wieder bis 25 Zeichen weiter. Bei so geringen Werten wie 25 sieht das teilweise komisch aus, da manchmal schon ein bis 2 Wörter diese 25 Zeichen erreichen, wenn du das ganze z.B. mit 50 bis 60 Buchstaben testest, wirst du sehen dass der Code ohne weiters das tut, was er soll.

Zu 3) Ich hab hier natürlich einen generellen Code geschrieben, um Anpassungen wirst du ja nicht herum kommen. Eventuell musst du für die Zeilenweise abarbeitung eine weitere Schleife einbinden.

Zu 4) Du kannst für solche Fälle ja auch nach anderen Trennzeichen (Komma, Semikolon, Bindestrich, ...) suchen und halt notfalls (cnt = 0 -> kein Leerzeichen gefunden) einen harten Umbruch machen.


Der Doc!


----------

