Centrum Skryptów - Microsoft office

Jak znaleźć słowo w dokumencie i zmienić kolor tła akapitu, w którym to słowo występuje?

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 znaleźć słowo w dokumencie i zmienić kolor tła akapitu, w którym to słowo występuje?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Mam kilka raportów i plików dziennika zapisanych jako dokumenty programu Word. Chcę wyszukać w jednym z tych dokumentów określonego słowa (np. słowa „Failed”), a następnie zmienić kolor tła każdego akapitu, w którym to słowo występuje. Jak to zrobić?

-- XD

Cześć Skrypciarze! Pytanie

Czesć, XD. Od rozpoczęcia Zimowej Olimpiady Skrypciarskiej 2008 (j.ang.) wiele osób napisało do nas z następującym zapytaniem: „Czy macie jakiś fajny, zautomatyzowany sposób na testowanie skryptów? I czy jest jakaś szansa, że moglibyście się nim z nami podzielić?” Cóż, prawdę mówiąc moglibyśmy się nim podzielić, gdybyśmy tylko znali taki sposób.

Bardzo chcielibyśmy, rzecz jasna, a nie mamy i to bynajmniej nie dlatego, że nie wiemy, jak taki zautomatyzowany tester skryptów mógłby wyglądać. Jednak w chwili obecnej jest kilka problemów uniemożliwiających automatyczne testowanie skryptów. Z jednej strony (z przyczyn, w które nie będziemy się zagłębiać) nie wolno nam przyjmować zgłoszeń związanych z Olimpiadą w trybie online, wszystkie są przesyłane za pomocą poczty elektronicznej. To znacznie utrudnia automatyczne testowanie. Dlaczego? Po pierwsze dlatego, że wiadomości e-mail nie zawsze są poprawnie sformatowane. Niektórzy przysyłają takie zgłoszenia:

Ken Myer

USA

Inni z kolei takie:

USA

Ken Myer

My się łatwo domyślamy, który wiersz to imię i nazwisko, a który to kraj, jednak komputer mógłby sobie z tym nie poradzić.

Znaczy, że Skrypciarze są o wiele mądrzejsi od komputerów.

W przypadku wiadomości e-mail napotykamy spore problemy, jeżeli chodzi o podziały wiersza. Na przykład skrypt, który początkowo wygląda tak:

For x = 1 to 100

    Wscript.Echo x

Next

Po przesłaniu pocztą elektroniczną wygląda już tak:

For x = 1 to 100 Wscript.Echo x Next

I jak poprzednio, my, Skrypciarze, możemy się domyślić, gdzie powinien znajdować się podział wiersza. (Uprzedzając wszelkie pytania: tak, przed rozpoczęciem testowania skryptu uzupełniamy wszystkie brakujące podziały wierszy.) Automatyczny tester po prostu odrzuciłby taki skrypt.

Hmmm. Spędzić 10 minut próbując rozszyfrować, gdzie wstawić podziały wierszy w skrypcie, czy poświęcić 1 sekundę na odrzucenie skryptu? Może Skrypciarze nie są wcale mądrzejsi od komputerów….

Zapomniałem wspomnieć o podpisach automatycznie dołączanych do wiadomości e-mail – to też stanowi pewien problem. Formularz zgłoszeń w trybie online wyeliminowałby większość tych problemów. Poza jednym….

Polega on na tym, że Skrypciarze są bardzo pobłażliwi, a komputery bezlitosne. Niekiedy otrzymujemy skrypt wyglądający tak:

For x = 1 to 100

    Wscript.Echo x

Netx

To, co się tutaj stało jest oczywiste; słowo Netx zostało błędnie napisane. Komputer by tego nie przewidział i odrzucił skrypt jako błędny. W przypadku tak prostego problemu (lub ścieżki C:\Script\Test.txt, która powinna brzmieć C:\Scripts\Test.txt), no cóż Skrypciarze zazwyczaj naprawiają taki błąd i ponownie sprawdzają skrypt.

Uznajemy nawet skrypty, dla których instrukcja mówił, że wynik ma zostać wyświetlony z zachowaniem dwóch miejsc po przecinku, a otrzymujemy odpowiedź z czterema miejscami po przecinku. Lub kiedy odpowiedź wyświetlana jest w polu komunikatu, a nam chodziło o wpisanie odpowiedzi do okna wiersza polecenia. Itp. itd.

Ale nie mówcie o tym nikomu. W końcu mamy opinię bezwzględnych i bezlitosnych i nie chcemy jej stracić.

W każdym razie teraz już wiecie, dlaczego nie mamy automatycznego testera skryptów. Teraz mogę spokojnie przejść do skryptu, który zmienia kolor tła akapitu, jeżeli znajduje się w nim określone słowo:

Const wdTexture10Percent  = 100



Set objWord = CreateObject("Word.Application")

objWord.Visible = True



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



Set colParagraphs = objDoc.Paragraphs



For Each objParagraph in colParagraphs

    strText = objParagraph.Range.Text

    If InStr(strText, "Failed") Then

        objParagraph.Shading.Texture = wdTexture10Percent 

    End If

Next

Pewnie wielu z Was pomyślało sobie: „Chwileczkę. To nie może zadziałać; w tym skrypcie nie wykorzystano nawet obiektu Find programu Word w celu znalezienia tekstu docelowego”. To prawda; nie używamy obiektu Find programu Word do znalezienia tekstu docelowego. Dlaczego? Cóż, obiekt Find nadaje się idealnie do wyszukiwania tekstu, jak również do modyfikowania znalezionego tekstu, ale nie nadaje się do pracy z tekstem otaczającym tekst docelowy. Czy to stanowi jakiś problem? Oczywiście, że tak. Obiekt Find ułatwiłby nam zmianę koloru tła samego tekstu docelowego (czyli słowa Failed); jednak nie pomoże nam w zmianie koloru tła całego akapitu, w którym znajduje się dane słowo. To jest problem.

Dlatego zastosowaliśmy inne podejście. W naszym skrypcie pobieramy kolekcję wszystkich akapitów w dokumencie, a następnie przeszukujemy kolejno każdy akapit sprawdzając, czy zawiera on słowo Failed. Jeżeli tak, możemy w łatwy sposób zmienić kolor tła akapitu, w końcu pracujemy już z tym akapitem. Jeżeli dany akapit nie zawiera słowa docelowego, żaden problem; kontynuujemy działanie i sprawdzamy następny akapit w kolekcji.

Działanie skryptu rozpoczyna się od zdefiniowania stałej o nazwie wdTexture10Percent i nadania jej wartości 100; dzięki temu będziemy mogli ustawić kolor tła (technicznie mówiąc właściwość Shading.Texture) jako 10% szarość. Po zdefiniowaniu stałej tworzymy wystąpienie obiektu Word.Application , a następnie ustawiamy wartość właściwości Visible na True; w ten sposób otrzymujemy działające wystąpienie programu Microsoft Word widoczne na ekranie. Następnie stosujemy poniższy wiersz kodu w celu otwarcia pliku C:\Scripts\Test.doc:

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

Po otwarciu dokumentu pobieramy kolekcję akapitów znajdujących się w dokumencie tworząc po prostu odniesienie do obiektu do właściwości Paragraphs:

Set colParagraphs = objDoc.Paragraphs

Teraz zacznie się zabawa.

A może i nie; muszę przecież dokończyć artykuł. Potem sprawdzę 3 000 zgłoszeń na Olimpiadę. I dopiero potem będzie czas na zabawę.

Aby zakończyć zadanie (i dzisiejszy artykuł) uruchamiamy pętlę For Each, która umożliwia nam przejście przez wszystkie akapity w dokumencie. Wewnątrz tej pętli pobieramy wartość właściwości Range.Text akapitu i zachowujemy ją w zmiennej o nazwie strText:

strText = objParagraph.Range.Text

Jak się pewnie domyśliliście, właściwość Text zachowuje cały tekst, który pojawia się w akapicie. Kiedy tekst jest już bezpieczny w zmiennej strText, możemy użyć metody InStr skryptu VBScript w celu sprawdzenia, czy słowo docelowe Failed pojawia się w tym tekście:

If InStr(strText, "Failed") Then

Jeżeli nie, to żaden problem, mówiłem przecież: kontynuujemy działanie pętli i powtarzamy proces dla następnego akapitu w kolekcji. Jeżeli słowo docelowe pojawia się akapicie, używamy poniższego wiersza kodu w celu ustawienia koloru tła tego akapitu jako 10% szarości:

objParagraph.Shading.Texture = wdTexture10Percent

Następnie wracamy na początek pętli, gdzie próbujemy jeszcze raz z następnym akapitem w dokumencie. Po wykonaniu wszystkich czynności powinniśmy otrzymać dokument wyglądający mniej więcej tak:

I to już wszystko na dziś. Sami spróbujcie.

Jak więc Skrypciarze testują skrypty z Olimpiady Skrypciarskiej? Możecie wierzyć lub nie, ale wygląda to tak: Dostajemy wiadomość e-mail, kopiujemy kod z tej wiadomości i wklejamy go do pliku skryptu. Następnie uruchamiamy skrypt i czekamy na to, co się stanie. Jeżeli skrypt nie zadziała i wyświetli komunikat o błędzie, sprawdzamy, czy problem spowodowany jest niepoprawnym podziałem wierszy lub błędem w pisowni. Potem próbujemy jeszcze raz. Ten proces trwa dopóki skrypt nie zadziała lub dopóki nie stwierdzimy, że skrypt naprawdę jest błędny. (Zazwyczaj próbujemy, dopóki skrypt nie zadziała bezbłędnie. Wtedy, jeżeli skrypt nie osiągnie wyznaczonego celu, zgłoszenie dostaje 0 punktów.)

A potem zabieramy się za następny skrypt. W ten sposób sprawdziliśmy już ponad 3 000 skryptów, a kolejne 3 000 czeka na swoją kolej w skrzynce odbiorczej.

 Do początku strony Do początku strony

Centrum Skryptów - Microsoft office