Centrum Skryptów - Microsoft Office

Jak podliczyć wszystkie elementy w dokumencie programu Microsoft Word?

Udostępnij na: Facebook

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.

Jak podliczyć wszystkie elementy w dokumencie programu Microsoft Word?

Cześć, Skrypciarze! Mam aplikację, która regularnie przeprowadza testy i zapisuje ich wyniki do dokumentu programu Microsoft Word. Przydałby mi się zatem skrypt, który zbierze i przeliczy wszystkie te wartości, to jest ile razy test był pomyślny, ile razy nie, a ile razy w ogóle się nie uruchomił. Czy umielibyście napisać taki skrypt?

-- GK

Cześć, GK! Przepraszam, że pierwsze zdanie nie będzie adresowane do Ciebie, ale do Skrypciarskiego Syna, ale musisz to po prostu zrozumieć. Skrypciarski Synu: ha!

Jeżeli nie wiecie o czym mowa, to oczywiście zaraz się dowiecie, ha!

Chodzi o to, że od czasu do czasu Skrypciarski Syn nachodzi mnie, opowiadając jakieś dziwne historie o którymś ze swoich dziwnych znajomych. Jako troskliwy rodzic mówię mu prawdę: „masz naprawdę dziwnych znajomych”, na co on (bezczelnie i kłamliwie): „no przynajmniej mam znajomych, w przeciwieństwie do ciebie” (tak, mówi „ciebie” z małej litery). Nie byłoby tak źle, gdyby w tym momencie nie pojawiał się jeszcze ten zadowolony z siebie uśmieszek, który postanowiłem zwalczyć w niniejszym artykule, ha!

Na dzień dzisiejszy, grupa Scripting Guys na Facebooku ma 517 uczestników (muszę w tym momencie oczywiście nadmienić, że grupa MSDN ma ich tylko 99, natomiast TechNet tylko 56). Co ty na to, Synu, ha?

Dlaczego mamy aż tylu znajomych? Oczywiście z uwagi na naszą miłą powierzchowność oraz osobowość, no a oprócz tego dlatego, że potrafimy od ręki napisać skrypt, który podlicza wszystkie elementy zawarte w dokumencie programu Microsoft Word:

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

    intLength = Len(strText)

    strText = Left(strText, intLength - 1)

    Select Case strText 

        Case "Passed" intPassed = intPassed + 1

        Case "Failed" intFailed = intFailed + 1

        Case "Not run" intNotRun = intNotRun + 1

    End Select

Next



Wscript.Echo "Passed: " & intPassed

Wscript.Echo "Failed: " & intFailed

Wscript.Echo "Not run: " & intNotRun

Zaczynamy od utworzenia wystąpienia obiektu Word.Application i ustawienia jego właściwości Visible na True; to daje nam uruchomione i widoczne na ekranie wystąpienie obiektu Microsoft Word.

Ważne:

**Uwaga:**W naszych skryptach używamy właściwości Visible (widoczny – ang.) po to, żeby unaocznić Wam, ze coś tam się dzieje. Pamiętajcie jednak, ze skrypty działają równie dobrze, gdy obiekt Word nie jest widoczny na ekranie. Gdybyście więc uznali, że Wam przeszkadza, pozbądźcie się wiersza, który ustawia właściwość Visible na True, i dodajcie następujący wiersz na końcu skryptu:

objWord.Quit

Ten wiersz kończy pracę programu Microsoft Word, gdy skrypt zakończy już swoje działanie.

Gdy mamy już uruchomione wystąpienie obiektu Word, korzystamy z metody Open, która otwiera dokument C:\Scripts\Test.doc. Poniższego wiersza kodu używamy w celu zwrócenia kolekcji wszystkich akapitów w danym dokumencie:

Set colParagraphs = objDoc.Paragraphs

Po co nam kolekcja wszystkich akapitów w dokumencie? Ponieważ, jak nadmienił już GK, każdy „akapit” jest po prostu wierszem zawierającym informację, czy test został przeprowadzony pomyślnie, niepomyślnie, czy po prostu w ogóle nie został uruchomiony. Wygląda to w następujący sposób:

Passed

Failed

Failed

Passed

Failed

Not run

Po pobraniu wszystkich akapitów i spojrzeniu na ich zawartość możemy łatwo policzyć, ile razy test się powiódł, ile razy zawiódł, a ile razy w ogóle nie został uruchomiony. Właśnie to zamierzamy teraz zrobić.

Kiedy mamy już kolekcję akapitów, kolejnym krokiem będzie ustawienie pętli For Each, która przejdzie przez wszystkie elementy w kolekcji:

For Each objParagraph in colParagraphs

Wewnątrz pętli pobieramy teraz wartość właściwości Range.Text, która zwraca nam tekst każdego akapitu:

strText = objParagraph.Range.Text

Następnie napotykamy na następujące dwa wiersze kodu:

intLength = Len(strText)

strText = Left(strText, intLength - 1)

Do czego one służą? Zawartość, czyli „tekst” każdego akapitu zawiera także znak końca akapitu, który utrudnia nam trochę pracę, musimy się więc go pozbyć. (Uwaga od redakcji: W życiu nie zawsze się taki manewr oczywiście udaje, ciągle przecież jest jeszcze z nami Skrypciarska Pani Redaktor, ha!) Pierwszym krokiem będzie skorzystanie z funkcji Len, która ustala długość (liczbę znaków) w ciągu strText. W drugim wierszu używamy funkcji Left, która pobiera wszystko oprócz ostatniego znaku (długość ciągu minus 1). Dajmy na to, że strText wygląda w następujący sposób, a gwiazdka jest właśnie tym naszym problematycznym znakiem:

Passed*

Jeżeli uruchomimy wyżej wspomniane dwa wiersze kodu, nasz ciąg będzie wyglądał w następujący sposób:

Passed

Czyż nie o niebo lepiej?

Reszta to łatwizna. Następnym krokiem jest uruchomienie fragmentu Select Case działającego na wartości strText:

Select Case strText 

    Case "Passed" intPassed = intPassed + 1

    Case "Failed" intFailed = intFailed + 1

    Case "Not run" intNotRun = intNotRun + 1

End Select

Jak widać gołym okiem, jeżeli wartość strText jst równa Passed (pomyślnie), zwiększamy zmienną licznika intPassed o 1. Z uwagi na to, że zmienna intPassed nigdy nie była użyta, to zaczyna od wartości zerowej, co z kolei oznacza, że za pierwszym razem, gdy napotkamy słowo Passed, dodamy do licznika wartość 1, będzie więc równa 1. Jeżeli wartość strText jest równa Failed, to zwiększamy odpowiednio o 1 wartość licznika zmiennej we intFailed, jeżeli zaś strText będzie równa Not run, powiększamy wartość zmiennej intNotRun. Skomplikowane, nie? No dobrze, w sumie nieskomplikowane.

Teraz potrzebujemy tylko przywołać echo wyników naszego podliczania:

Wscript.Echo "Passed: " & intPassed

Wscript.Echo "Failed: " & intFailed

Wscript.Echo "Not run: " & intNotRun

Nasz raport będzie wyglądał w następujący sposób:

Passed: 12

Failed: 9

Not run: 6

Tylko tyle.

Zapomniałem oczywiście wspomnieć, ze Skrypciarski Syn ma jedynie 100 znajomych na swojej stronie MySpace. Ha!

 Do początku strony Do początku strony

Centrum Skryptów - Microsoft Office