Centrum skryptów - Microsoft Office

Jak wyszukać czerwony tekst w dokumencie programu Word?

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.

Jak wyszukać czerwony tekst w dokumencie programu Word?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Mam ogromny dokument zawierający w niektórych miejscach wiersze w kolorze czerwonym. Jak wydobyć z niego tylko te wiersze, które są zaznaczone na czerwono?

-- GH

Cześć Skrypciarze! Odpowiedź

Cześć, GH. Na początek, piszący te słowa Skrypciarz chciałby zauważyć jedną rzecz: nieważne. We wczorajszym artykule piszący te słowa Skrypciarz narzekał na fakt, że nic interesującego mu się nie przydarzyło juz od bardzo, bardzo dawna. I zgadnijcie co? Kilka chwil po zakończeniu pisania artykułu przydarzyło mu się coś bardzo interesującego. ale, jak się okazuje, interesujące rzeczy nie zawsze są zabawne.

Co się zatem co stało? No cóż, gdyby piszący te słowa Skrypciarz miał Rolls Royce’a, powiedziałby, że jego samochód odmówił współpracy. O dziwo jednak nasz Skrypciarz nie posiada Rolls Royce’a. Dlatego też stwierdził, że jego samochód po prostu zdechł.

Jeżeli możemy sobie wyobrazić jakieś pocieszenie w tej sytuacji, to tylko takie, że śmierć była szybka i bezbolesna. W jednej chwili piszący te słowa Skrypciarz jechał sobie spokojnie, wolny od wszelkich zmartwień tego świata, a za moment był już bez samochodu i kompletnie załamany. Podczas wyjeżdżania z parkingu pod warzywniakiem zgasł mu po prostu silnik i żadną miarą nie chciał znowu zapalić. Koniec, kropka. Zanim zapytacie: tak – radio, elektryczne szyby i cała elektryka działały bez zarzutu; padł po prostu silnik. Niestety, zepsuty silnik w zupełności wystarczy, żeby samochód stał się zupełnie bezużyteczny.

Wstępna diagnoza mechanika: samochód ma zepsuty układ ECM. Piszący te słowa Skrypciarz nie zna się na układach ECM; nie wie nawet, od czego pochodzi ten skrót. Jednak od tamtego wydarzenia jest bogatszy o pewną wiedzę: po pierwsze – wie, że ECM to centralny układ komputerowy sterujący praktycznie wszystkim w samochodzie, a po drugie, że jego wymiana kosztuje przynajmniej 2 000 USD.

Huraaa!

Tak czy siak, jeżeli zaczęliście myśleć o tym, co możecie zrobić, żeby urozmaicić życie piszącego te słowa Skrypciarza, no cóż, dziękuję, ale nie skorzystam. Jasne, że życie, w którym nic interesującego się nie dzieje może być trochę nudne. Mniejsza o to. Jest o niebo tańsze.

W wyniku tego zdarzenia piszący te słowa Skrypciarz będzie musiał ograniczyć swoje zainteresowania do skryptowania (o to chodziło kierownikowi już od dawna). Przykładowo, czy nie byłoby to wystarczająco interesujące, gdybyśmy mieli skrypt potrafiący wydobyć z dokumentu Word wiersze wpisane na czerwono? Zobaczmy, czy uda nam się określić, jak bardzo jest on interesujący:

Const wdColorRed = 255



Set objWord = CreateObject("Word.Application")

objWord.Visible = True



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

Set objSelection = objWord.Selection



objSelection.Find.Forward = True

objSelection.Find.Format = True

objSelection.Find.Font.Color = wdColorRed



Do While True

    objSelection.Find.Execute

    If objSelection.Find.Found Then

        Wscript.Echo objSelection.Text

    Else

        Exit Do

    End If

Loop

Rety, to jest jeszcze bardziej interesujące niż zepsuty ECM, nieprawdaż? Jak widzimy, zaczynamy od określenia stałej o nazwie wdColorRed i nadajemy jej wartość 255; wykorzystamy tę stałą później, żeby program Word wiedział czego szukamy. A gdybyśmy tak chcieli wyszukać tekst w jakimś innym kolorze? Powiem tak: jak dostaniemy 2 000 USD, to możemy o tym pogadać.

A może jednak obejdzie się bez kasy. Zamiast tego, sprawdźcie wykaz wdColor w dokumentacji Microsoft Word VBA Language Reference (j.ang.).

Po zdefiniowaniu stałej wdColorRed tworzymy obiekt Word.Application i ustawiamy właściwość Visible na True; dzięki temu otrzymamy działające wystąpienie programu Word widoczne na ekranie. Następnie zastosujemy poniższe dwa wiersze kodu w celu otwarcia dokumentu C:\Scripts\Test.doc i utworzenia wystąpienia obiektu Selection programu Word, który będzie nam potrzebny do przeprowadzenia operacji wyszukiwania w dokumencie:

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

Set objSelection = objWord.Selection

Fajne; a na dodatek robi się coraz bardziej interesująco.

Następnie konfigurujemy właściwości obiektu Find będącego obiektem podporządkowanym obiektu Select. Do tego posłużą nam poniższe trzy wiersze kodu:

objSelection.Find.Forward = True

objSelection.Find.Format = True

objSelection.Find.Font.Color = wdColorRed

Co to wszystko oznacza? No cóż, na początek, ustawienie właściwości Forward na True mówi skryptowi, żeby przeszukiwał dokumentu do przodu, tzn. słowy: rozpoczął wyszukiwanie na początku dokumentu i kontynuował do jego końca. Ustawienie właściwości Format na True mówi skryptowi, że oprócz tekstu chcemy wyszukać formatowanie (lub, jak w naszym przypadku, zamiast tekstu). Na końcu określamy to, jakim formatowaniem jesteśmy zainteresowani: czcionkami mającymi kolor równy zmiennej o nazwie wdColorRed (Font.Color).

Teraz możemy rozpocząć wyszukiwanie. W tym celu, najpierw ustawiamy pętlę Do While, która będzie kontynuować działanie dopóki wartość True będzie równa True. (Brzmi to jak niekończąca się pętla, ale nie mam się czym martwić, jest na nią sposób i za moment go pokażemy.) Wewnątrz tej pętli stosujemy poniższe polecenie w celu rozpoczęcia procesu wyszukiwania i tropimy pierwsze wystąpienie czerwonego tekstu:

objSelection.Find.Execute

Skąd będziemy wiedzieć, że obiekt Find naprawdę znalazł czerwony tekst? To proste; w takim wypadku wartość właściwości Found będzie równa True:

If objSelection.Find.Found Then

Jeżeli właściwość Found ma wartość True, to znaleziony tekst (czyli czerwony tekst) zostanie automatycznie zaznaczony; z kolei żeby zaraportować nasz wynik wyszukiwania, wystarczy wywołać echo właściwości Text dla naszego obiektu Selection:

Wscript.Echo objSelection.Text

Następnie po prostu kontynuujemy działanie pętli, wywołujemy metodę Execute i szukamy następnego wystąpienia naszego docelowego tekstu. Ten proces trwa, dopóki wartość właściwości Found nie przestanie być równa True, co będzie oznaczać tylko jedno: w dokumencie nie ma już czerwonego tekstu. Teraz wywołujemy zdanie Exit Do i opuszczamy naszą pętlę:

Exit Do

Jak widać, ten skrypt wywołuje jedynie echo odnalezionego tekstu. Pytanie GH dotyczyło jednak wydobycia tego tekstu z dokumentu i wklejenia go do nowego dokumentu programu Word. Poniżej przedstawiamy zmodyfikowany skrypt, który to potrafi:

Const wdColorRed = 255



Set objWord = CreateObject("Word.Application")

objWord.Visible = True



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

Set objSelection = objWord.Selection



Set objDoc2 = objWord.Documents.Add()

Set objSelection2 = objWord.Selection



objSelection.Find.Forward = True

objSelection.Find.Format = True

objSelection.Find.Font.Color = wdColorRed



Do While True

    objSelection.Find.Execute

    If objSelection.Find.Found Then

        strText = strText & objSelection.Text & vbCrLf

    Else

        Exit Do

    End If

Loop

objSelection2.TypeText strText

Zatem jaka jest różnica pomiędzy tym skryptem, a skryptem pokazanym na początku? No cóż, ten skrypt dotyczy dwóch dokumentów programu Word: dokumentu C:\Scripts\Test.doc (z odniesieniem obiektu objDoc) oraz nowego dokumentu utworzonego za pomocą metody Add (z odniesieniem obiektu objDoc2):

Set objDoc2 = objWord.Documents.Add()

Ponadto, tym razem nie wywołujemy echa tekstu, który znajdujemy; zamiast tego zachowujemy odnaleziony tekst w zmiennej o nazwie strText (przyczepiając znak powrotu karetki na końcu każdego segmentu):

strText = strText & objSelection.Text & vbCrLf

Następnie, po zakończeniu przeszukiwania dokumentu Test.doc, stosujemy metodę TypeText w celu dodania całego znalezionego tekstu do naszego drugiego dokumentu:

objSelection2.TypeText strText

I już mamy wszystko, co chcieliśmy..

Jeżeli chodzi o układ ECM, no cóż, jak do tej pory, piszący te słowa Skrypciarz dowiedział się o nim więcej niż sam chciałby (zaczynając od faktu, że ECM to skrót od Electronic Control Module). Dowiedział się na przykład, że samochodu typu Volkswagen Passat nie można uruchomić, zwierając na krótko kable; trzeba go uruchomić breloczkiem na klucze, ponieważ breloczek wysyła sygnał do układu ECM o treści mniej więcej: „Wszystko w porządku, można uruchomić auto”. Niestety ten system czasami zawodzi i nie da się uruchomić samochodu nawet, kiedy mamy ten breloczek. (Ten zbędny element zabezpieczenia o czymś nam przypomina, ale nie powiemy o czym.) Czasami w wyniku błędu ECM może zastosować wirtualne ograniczenie prędkości i nie pozwoli, żeby samochód przekroczył prędkość 20 km/h. Jakie to straszne!

Cóż, jeżeli mieszka się w dużym mieście, jak np. Seattle, korki i tak nie pozwalają przekroczyć tej prędkości.

 Do początku strony Do początku strony

Centrum skryptów - Microsoft Office