Centrum Skrypciarzy - Microsoft Office

W jaki sposób wyszukać tekst w dokumencie Word i zmienić jego formatowanie?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

W jaki sposób wyszukać tekst w dokumencie Word i zmienić jego formatowanie?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Czy można wyszukać w dokumencie Word tekst wyróżniony określonym kolorem (np. turkusowym), a następnie usunąć wyróżnienie i zmienić kolor czcionki np. na niebieski?

-- KB

Cześć Skrypciarze! Odpowiedź

Cześć, KB! Jeśli nazwa Twojego adresu e-mail nie kłamie, to przysłałaś nam wiadomość aż z Australii. Wobec takiego poświęcenia nie mamy wyjścia – musimy opuścić zwyczajowe ględzenie i przejść od razu do sedna:

 

Const wdTurquoise = 3

Const wdNoHighlight = 0

Const wdBlue = 2



Set objWord = CreateObject("Word.Application")

objWord.Visible = True



Set objDoc = objWord.Documents.Open("C:\Scripts\Test.doc")

Set objRange = objDoc.Range



objRange.Find.Highlight = True

objRange.Find.Forward = True



Do while objRange.Find.Execute

    If objRange.HighlightColorIndex = wdTurquoise Then

        objRange.HighlightColorIndex = wdNoHighlight

        objRange.Font.ColorIndex = wdBlue

    End If

    intPosition = objRange.End

    objRange.Start = intPosition

Loop

Jak widać, na początku definiujemy trzy stałe – jedna posłuży do podania koloru wyróżnienia, którego będziemy szukać w dokumencie (wdTurquoise), a pozostałe dwie – do podania nowego wyróżnienia, tzn. jego braku, oraz nowego koloru czcionki(wdNoHighlight i wdBlue):

Const wdTurquoise = 3

Const wdNoHighlight = 0

Const wdBlue = 2

Teraz tworzymy wystąpienie obiektu Word.Application i ustawiamy wartość Visible na True; w ten sposób uzyskamy uruchomione i widoczne na ekranie wystąpienie programu Microsoft Word. Po włączeniu programu Word, możemy użyć metody Open do otwarcia dokumentu C:\Scripts\Test.doc, a następnie użyć poniższego wiersza kodu, by utworzyć wystąpienie obiektu Range („zakres”; domyślnie znajdzie się on na początku dokumentu):

Set objRange = objDoc.Range

Teraz możemy naprawdę wziąć się do roboty. Nie będziemy dziś szczegółowo omawiać wyszukiwania i zastępowania tekstu – osoby zainteresowane odsyłamy do szczegółowych wyjaśnień w artykule Office Space (j.ang.). Trzeba jednak przyznać, że nasz kolejny krok polega na skonfigurowaniu dwóch właściwości obiektu Find: chcemy wyszukać słowa, które zostały wyróżnione (dowolnym kolorem), zaczynając od początku naszego zakresu aż do końca dokumentu. Posłużą do tego poniższe dwa wiersze kodu:

objRange.Find.Highlight = True

objRange.Find.Forward = True

Przyznajemy, że reszta jest nieco zamieszana. O ile łatwo było wyszukać tekst o jakimś wyróżnieniu, nie bardzo wiedzieliśmy, jak ograniczyć wyszukiwanie tylko do jednego, wybranego koloru. W końcu udało się napisać taki fragment kodu:

Do While objRange.Find.Execute

    If objRange.HighlightColorIndex = wdTurquoise Then

        objRange.HighlightColorIndex = wdNoHighlight

        objRange.Font.ColorIndex = wdBlue

    End If

    intPosition = objRange.End

    objRange.Start = intPosition

Loop

Uruchamiamy tu pętlę Do While, działającą dopóki nie zakończy się wyszukiwanie (tzn. polecenie Find.Execute). Wywołanie metody Execute powoduje uruchomienie skryptu w miejscu, gdzie znajduje się obiekt Range i znalezienie pierwszego elementu spełniającego podane kryteria. (W naszym wypadku jedynym kryterium jest wyróżnienie.) Brak znalezionych elementów spowoduje zakończenie wyszukiwania, a zatem i pętli Do While.

W ten sposób zapobiegniemy ciągłemu, nieskończonemu przeszukiwaniu dokumentu.

Jeśli znajdziemy jednak wyróżniony element, sprawdzamy, czy właściwość HighlightColorIndex ma wartość „turquoise” (informacje o właściwościach i wartościach, jakie mogą przyjąć, można znaleźć na stronie Microsoft Word VBA Language Reference):

If objRange.HighlightColorIndex = wdTurquoise Then

Jeśli kolor wyróznienia to turkus, wykonujemy poniższe dwa wiersze kodu:

objRange.HighlightColorIndex = wdNoHighlight

objRange.Font.ColorIndex = wdBlue

W pierwszym wierszu usuwamy wyróżnienie znalezionego tekstu. W drugim, zmieniamy kolor czcionki tego fragmentu na niebieski. Było z tym trochę zachodu, ale ważne, że zadziałało.

Jeszcze jedno – jeśli znajdziemy tekst wyróżniony kolorem innym niż turkusowy, po prostu zostawiamy go w spokoju.

Rzecz jasna, w ten sposób dojdziemy tylko do pierwszego wyróżnionego elementu. Jeśli chcemy kontynuować wyszukiwanie, musimy użyć dwóch poniższych wierszy kodu:

intPosition = objRange.End

objRange.Start = intPosition

Dlaczego? No cóż, bez tych dwóch wierszy, nasz zakres będzie ograniczony tylko do znalezionego właśnie tekstu. To nie zadziała – ponowne wywołanie metody Execute spowoduje przeszukanie wyłącznie tego tekstu. A ponieważ usunęliśmy już z niego wyróżnienie, wyszukiwanie – a zatem i skrypt – po prostu zakończy działanie.

Aby tego uniknąć, przypisujemy wartość właściwości End (odpowiadającej ostatniemu znakowi w naszym zakresie) zmiennej o nazwie intPosition; następnie przypisujemy wartość tej zmiennej właściwości Start zakresu.

Co nam to daje? Załóżmy, że znaleźliśmy wyróżniony fragment obejmujący znaki od piątego do dziesiątego; znaczy to, że nasz zakres również obejmuje znaki 5-10. Przypisanie zmiennej intPosition wartości odpowiadającej dziesiątemu znakowi, a następnie przypisanie jej właściwości Start naszego zakresu spowoduje, że początek zakresu przeniesie się na dziesiąty znak. Ponieważ nie podajemy wartości końcowej (End), zakres automatycznie obejmie całą resztę dokumentu. Innymi słowy, wywołanie metody Execute rozpocznie ponowne wyszukiwanie tam, gdzie zakończyło się wyszukiwanie poprzednie. Wyszukiwanie to będzie trwać do znalezienia nowego wyróżnienia lub do przeszukania całego dokumentu – właśnie tak, jak chcieliśmy.

 Do początku strony Do początku strony

Centrum Skrypciarzy - Microsoft Office