W jaki sposób wyszukać tekst w dokumencie Word i zmienić jego formatowanie?
Skrypciarze odpowiadają na Wasze pytania
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! 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ść, 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 |