joe2017
Goto Top

Bedingte Formatierung für einen Text in Word 2013

Das ist jetzt zwar keine Administrative Frage aber vielleicht hat trotzdem jemand eine Idee.

Ich habe einen sehr langen Text in Word (mehrere 100 Seiten lang). Hierbei handelt es sich um einen Verlauf eines Schriftverkehrs zweier Personen.

Bsp.:
Datum Uhrzeit Herr Maier: text
Datum Uhrzeit Herr Maier: text
Datum Uhrzeit Frau Müller: text
Datum Uhrzeit Herr Maier: text
Datum Uhrzeit Frau Müller: text
Datum Uhrzeit Frau Müller: text
Datum Uhrzeit Herr Maier: text

Ich würde gerne automatisch die zeile bzw. den gesamten Text von Frau Müller einfäben. Evtl. funktioniert dies auch mit einem Makro.
Ich habe leider keinen Ansatz hierfür finden können.

Content-Key: 279042

Url: https://administrator.de/contentid/279042

Printed on: April 18, 2024 at 06:04 o'clock

Member: colinardo
colinardo Aug 02, 2015 updated at 11:23:02 (UTC)
Goto Top
Hallo SauerJochen,
das könnte mit einem Makro so aussehen:
Ich bin jetzt einfach mal davon ausgegangen das dein Datum in dieser Weise formatiert ist TT.MM.YYYY.

Also eine Zeile bspw. so aussieht:
10.06.2015 09:00 Frau Müller: BlaBlaBla Bla
back-to-topTemporäres Highlighting
Sub FindAndColor()
    Dim regex As Object, matches As Object, match As Object, strName As String
    'Regex Objekt und Optionen  
    Set regex = CreateObject("vbscript.regexp")  
    regex.IgnoreCase = True: regex.Global = True
    ' Zur Eingabe des Namens auffordern  
    strName = InputBox("Geben sie den Namen ein:", "Abschnitte hervorheben", "Frau Müller")  
    ' Wenn Name leer oder Abbrechen, Prozedur beenden  
    If strName = "" Then Exit Sub  
    'Suchpattern setzen  
    regex.Pattern = "(" & strName & ":[\s\S]*?)(\d{2}\.\d{2}\.\d{2,4}|$)"  
    ' Vorherige markierung entfernen  
    Selection.Find.ClearHitHighlight
    With ActiveDocument
        'SUche ausführen  
        Set matches = regex.Execute(.Content.Text)
        If matches.Count > 0 Then
            ' Für jeden Treffer die betreffende Stelle markieren  
            For Each match In matches
                Selection.HomeKey Unit:=wdStory
                Selection.Find.HitHighlight FindText:=match.Submatches(0), HIghlightColor:=wdColorYellow, MatchCase:=False, MatchWholeWord:=False, MatchWildcards:=False, MatchAllWordForms:=False, MatchSoundsLike:=False
            Next
        End If
    End With
    Set regex = Nothing
End Sub
Die Markierung ist in dieser Variante temporär, d.h bei einer Änderung am Dokument verschwindet sie wieder (Es ist wie das Highlighting bei einer Suche). Soll der Text permanent eigefärbt werden muss das Makro so abgeändert werden.
back-to-topPermanente Markierung
Sub FindAndColor()
    Dim regex As Object, matches As Object, match As Object, strName As String
    'Regex Objekt und Optionen  
    Set regex = CreateObject("vbscript.regexp")  
    regex.IgnoreCase = True: regex.Global = True
    ' Zur Eingabe des Namens auffordern  
    strName = InputBox("Geben sie den Namen ein:", "Abschnitte hervorheben", "Frau Müller")  
    ' Wenn Name leer oder Abbrechen, Prozedur beenden  
    If strName = "" Then Exit Sub  
    'Suchpattern setzen  
    regex.Pattern = "(" & strName & ":[\s\S]*?)(\d{2}\.\d{2}\.\d{2,4}|$)"  
    ' Vorherige markierung entfernen  
    With ActiveDocument
        'Suche ausführen  
        Set matches = regex.Execute(.Content.Text)
        If matches.Count > 0 Then
            Selection.HomeKey Unit:=wdStory
            ' Für jeden Treffer die betreffende Stelle markieren  
            For Each match In matches
                With Selection.Find
                    .ClearFormatting
                    .Text = match.Submatches(0)
                    .Forward = True
                    .Wrap = wdFindContinue
                    .MatchCase = False
                    .MatchWholeWord = False
                    .MatchAllWordForms = False
                    .MatchWildcards = False
                    .MatchSoundsLike = False
                    .Execute
                    Selection.Range.HighlightColorIndex = wdYellow
                End With
            Next
        End If
    End With
    Set regex = Nothing
End Sub

Grüße Uwe
Member: joe2017
joe2017 Aug 02, 2015 at 15:31:35 (UTC)
Goto Top
Hallo colinardo,

danke schon mal für das Makro. Ich hab das letztere Makro mal eingebunden. Es wird auch nach "Abschnitt hervorheben" geftagt, jedoch wenn ich dies mit OK bestätige tut sich leider nichts.

Mein Datum hat folgendes Format. Ich weiß nicht ob dies eine Rolle spielt.

26. Okt. 2014 22:15 - Frau Müller: blablabla
Member: colinardo
colinardo Aug 02, 2015 updated at 16:11:31 (UTC)
Goto Top
Zitat von @joe2017:
Mein Datum hat folgendes Format. Ich weiß nicht ob dies eine Rolle spielt.

26. Okt. 2014 22:15 - Frau Müller: blablabla
Das spielt eine sehr wichtige Rolle, denn ich muss ja für jeden Block das Ende bestimmen können. Für diese Art Datum musst du den Regex-Pattern in Zeile 11 so anpassen:
regex.Pattern = "(" & strName & ":[\s\S]*?)(\d{1,2}\.? \w{3}\. \d{4}|$)"   
Member: joe2017
joe2017 Aug 03, 2015 at 07:16:54 (UTC)
Goto Top
Hallo colinardo,

danke für die Info. Jedoch tut sich mit dem Makro überhaupt nichts?

Anbei das Makro:

Sub FindandColor()
Dim regex As Object, matches As Object, match As Object, strName As String
'Regex Objekt und Optionen
Set regex = CreateObject("vbscript.regexp")
regex.IgnoreCase = True: regex.Global = True
' Zur Eingabe des Namens auffordern
strName = InputBox("Geben sie den Namen ein:", "Abschnitte hervorheben", "Frau Müller:")
' Wenn Name leer oder Abbrechen, Prozedur beenden
If strName = "" Then Exit Sub
'Suchpattern setzen
regex.Pattern = "(" & strName & ":[\s\S]*?)(\d{1,2}\.? \w{3}\. \d{4}|$)"
' Vorherige markierung entfernen
With ActiveDocument
'Suche ausführen
Set matches = regex.Execute(.Content.Text)
If matches.Count > 0 Then
Selection.HomeKey Unit:=wdStory
' Für jeden Treffer die betreffende Stelle markieren
For Each match In matches
With Selection.Find
.ClearFormatting
.Text = match.Submatches(0)
.Forward = True
.Wrap = wdFindContinue
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchWildcards = False
.MatchSoundsLike = False
.Execute
Selection.Range.HighlightColorIndex = wdYellow
End With
Next
End If
End With
Set regex = Nothing
End Sub
Member: colinardo
colinardo Aug 03, 2015 updated at 07:25:57 (UTC)
Goto Top
danke für die Info. Jedoch tut sich mit dem Makro überhaupt nichts?
Geht hier problemlos ... oder sind die Datumwerte "Felder" ? Bitte hinter dem eingegebenen Namen keine Leerzeichen einfügen.

Lad doch mal dein Dokument anonymisiert irgendwo hoch, ansonsten ist das Raten mit der Glaskugel was bei dir anders ist...Danke
Member: joe2017
joe2017 Aug 03, 2015 at 10:05:23 (UTC)
Goto Top
Hallo colinardo,

ich habe herausgefunden, dass es an dem ":" nach dem Namen lag. Sobald ich diesen entferne funktioniert es bestens. face-smile
Jedoch würde ich gerne die ganze Zeile einfärben. Aktuell wird das Vorangestellte Datum nicht eingefärbt.

Aber vielen Dank schon mal hierfür!
Member: colinardo
colinardo Aug 04, 2015 at 13:54:17 (UTC)
Goto Top
Hi,
sorry das es so lange gedauert hat, aber ich bin im Moment ziemlich eingespannt.
Jedoch würde ich gerne die ganze Zeile einfärben. Aktuell wird das Vorangestellte Datum nicht eingefärbt.
Um das gewünschte zu erreichen fügst du noch folgende Zeile zwischen Zeile 30 und 31 ein:
Selection.MoveStartUntil vbNewLine, wdBackward
Grüße Uwe
Member: joe2017
joe2017 Aug 05, 2015 at 07:50:01 (UTC)
Goto Top
Hallo Uwe,

vielen Dank! Jetzt hat alles bestens funktioniert.
Bei über 1000 Seiten wäre das nicht machbar gewesen. face-wink
Member: joe2017
joe2017 Aug 07, 2015 at 07:48:23 (UTC)
Goto Top
Hallo Uwe,

ich habe das jetzt mal in meiner großen Datei getestet und habe folgende Fehlermeldung erhalten.

Laufzeitfehler '5854':
Parameter für Zeichenkette zu lang.

Ich meine irgendwo gelesen zu haben, dass nicht mehr als 255 Zeichen unterstützt werden.
Hast du hierfür eine Idee.
Member: joe2017
joe2017 Aug 07, 2015 updated at 08:01:05 (UTC)
Goto Top
Der Debugger hat folgende Zeile als Problem ausgespuckt.
.Text = match.Submatches(0)

Ich habe gerade auch noch das mit den 255 Zeichen überprüft. Mit 255 Zeichen funktioniert es. Mit 256 nicht mehr.
Member: colinardo
Solution colinardo Aug 07, 2015 updated at 08:58:27 (UTC)
Goto Top
Ja das ist eine Beschränkung der maximalen Zeichen der Suchfunktion, ist mir gerade auch erst aufgefallen, mit Word mache ich nicht so oft VBA, sorry.

In dem Fall sollte das hier funktionieren:
Sub FindAndColor()
    Dim regex As Object, matches As Object, match As Object, strName As String
    'Regex Objekt und Optionen  
    Set regex = CreateObject("vbscript.regexp")  
    regex.IgnoreCase = True: regex.Global = True
    ' Zur Eingabe des Namens auffordern  
    strName = InputBox("Geben sie den Namen ein:", "Abschnitte hervorheben", "Frau Müller")  
    ' Wenn Name leer oder Abbrechen, Prozedur beenden  
    If strName = "" Then Exit Sub  
    'Suchpattern setzen  
    regex.Pattern = "(" & strName & ":)[\s\S]*?(\d{1,2}\.? \w{3}\. \d{4}|.{5}$)"  
    ' Vorherige markierung entfernen  
    With ActiveDocument
        'Suche ausführen  
        Set matches = regex.Execute(.Content.Text)
        If matches.Count > 0 Then
            Selection.HomeKey Unit:=wdStory
            ' Für jeden Treffer die betreffende Stelle markieren  
            For Each match In matches
                With Selection.Find
                    .ClearFormatting
                    .Text = match.Submatches(0) & "*" & match.Submatches(1)  
                    .Forward = True
                    .Wrap = wdFindContinue
                    .MatchCase = False
                    .MatchWholeWord = False
                    .MatchAllWordForms = False
                    .MatchWildcards = True
                    .MatchSoundsLike = False
                    .Execute
                    Selection.MoveStartUntil vbNewLine, wdBackward
                    Selection.MoveEndUntil vbNewLine, wdBackward
                    Selection.Range.HighlightColorIndex = wdYellow
                    Selection.Collapse wdCollapseEnd
                End With
            Next
        End If
    End With
    Set regex = Nothing
End Sub
Grüße Uwe
Member: joe2017
joe2017 Aug 07, 2015 at 08:59:30 (UTC)
Goto Top
Hallo Uwe,

es läuft zwar noch durch, aber es scheint zu funktionieren! Es kann sich nur um Stunden handeln... face-wink
BESTEN DANK!
Member: joe2017
joe2017 Aug 07, 2015 at 12:24:33 (UTC)
Goto Top
Hallo Uwe,

leider hat dies nicht so ganz funktioniert.
Kann mann in das Makro nicht einfach einbauen, dass wenn es mehr als 255 Zeichen sind, er dies überspringt und weitermacht ohne Fehlermeldung.
Oder Das Makro ab einer bestimmten Cursor neu starten.
Member: joe2017
joe2017 Aug 07, 2015 at 12:39:58 (UTC)
Goto Top
Also ich habe es jetzt hin bekommen. Anscheinend gab es doch ein Problem mit dem Code. Hab anscheinend etwas übersehen!
Sorry nochmal