Centrum skryptów - Microsoft office

Jak policzyć liczbę znaków i akapitów 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 policzyć liczbę znaków i akapitów w dokumencie programu Word?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Po przeczytaniu Waszego artykułu (j.ang.) na temat statystyk dokumentów programu Word zastanawiam się, czy jest jakiś sposób na uzyskanie informacji na temat liczby zdań i akapitów w jednym dokumencie.

-- RLP

Cześć Skrypciarze! Pytanie

Cześć, RLP. Muszę przyznać, że teraz, kiedy rozgrywki Super Bowl się zakończyły, właściwie czuję ulgę. Nie jestem fanem drużyny New York Giants i w normalnych okolicznościach nigdy bym nie pomyślał o kibicowaniu właśnie im, ale jak zapewne wszyscy wiedzą, tegoroczne rozgrywki Super Bowl nie odbywały się w normalnych okolicznościach. Drużyna New England Patriots była bliska zdobycia tytułu najlepszej drużyny futbolowej! Jak mogłem nie zareagować w takiej sytuacji? Zagryzłem wargi, wstrzymałem oddech i zacząłem dopingować New York Giants.

Zaskakujące jest to, że wygrali. Zazwyczaj jest tak, że drużyny, którym szczerze kibicuję i jestem z nimi całym sobą – Washington Huskies, Seattle Mariners czy Seattle Seahawks, nigdy nie wygrywają. Ale drużyna, którą wybrałem jako mniejsze zło, wygrała bez trudu. W końcu każdy, tylko nie Patriots!

Tak czy inaczej, mecz był ekscytujący. Prawie tak ekscytujący, jak nasze dzisiejsze zadanie.

Zanim pokażę Wam skrypt, chciałbym zauważyć, że jest ono trudniejsze, niż mogłoby się wydawać; tak naprawdę, w zależności od punktu widzenia może się wydawać wręcz niemożliwe. Przykładowo, jak myślicie, ile zdań znajduje się w następującym akapicie:

  • Główną atrakcją wieczoru było wystąpienie prof. Kena Myera.

    Większość ludzi uzna, że mamy tutaj jedno zdanie. Program Microsoft Word będzie się upierał, że są tam dwa zdania. Dlaczego? Ponieważ z punktu widzenia programu Word zdanie składa się z kończącego je znaku interpunkcyjnego (np. kropki, znaku zapytania, wykrzyknika) z następującą po nim spacją lub znakiem podziału wiersza. Z tego powodu program Word twierdzi, że poprzedni akapit zawiera dwa zdania:

  • Główną atrakcją wieczoru było wystąpienie prof.

  • Kena Myera.

Szczerze mówiąc nie ma dobrego sposobu, żeby obejść ten problem i nie będzie, dopóki komputery nie nauczą się porządnie języków. Oznacza to, że program Word (lub jakiekolwiek niestandardowe wyrażenie regularne, którego użyjemy) zawsze będzie przeceniać liczbę zdań w dokumencie. Trzeba nauczyć się z tym żyć i tyle.

Uwaga! Można też przeprowadzić kilka testów z typowymi dokumentami programu Word. Może się okazać, że w przypadku Waszych dokumentów program Word konsekwentnie podaje o 5 proc. wyższą liczbę zdań, niż jest w rzeczywistości. W takim przypadku można dodać kod, który automatycznie wprowadzi poprawkę, raportując liczbę zdań w dokumencie. Ale to zależy tylko od Was.

Chciałem uprzedzić, że zdania mogą sprawiać pewien problem. Akapity również, ale całkiem inny. Przykładowo, ile akapitów widać poniżej, gdzie podkreślenie wskazuje każde miejsce, w którym nacisnęliśmy klawisz ENTER:

Akapit 1._

_

Akapit 2._

_

Akapit 3._

Jak można się było domyślić, odpowiedź brzmi: to zależy. Jeżeli użyjemy metody ComputeStatistics do obliczenia liczby akapitów (jak to zrobiliśmy w naszym archiwalnym artykule (j.ang.)), program Word powie nam, że mamy trzy akapity. Jeżeli jednak zastosujemy kolekcję Paragraphs (co zrobimy dzisiaj), program Word powie, że mamy pięć akapitów w tym dokumencie. Dlaczego? Ponieważ w tym przypadku program Word liczy liczbę naciśnięć klawisza ENTER. W jaki sposób wstawiliśmy pusty wiersz pomiędzy akapitami? Właśnie: nacisnęliśmy klawisz ENTER. W zasadzie nacisnęliśmy ten klawisz pięć razy i dlatego kolekcja Paragraphs zawiera pięć elementów. Zatem, która z tych dwóch wartości – trzy i pięć – jest prawidłowa? To zależy od Was i typu dokumentów.

Ale wiecie co? Nie ma powodu, dla którego nie można by było zastosować obydwu podejść w naszym skrypcie. Po prostu tak zróbmy. Zastosujmy w skrypcie dwie metody liczenia akapitów:

Const wdStatisticParagraphs = 4



Set objWord = CreateObject("Word.Application")

objWord.Visible = True



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



Wscript.Echo "Paragraphs (text-only): " & objDoc.ComputeStatistics(wdStatisticParagraphs)

Wscript.Echo "Paragraphs (including blank lines): " & objDoc.Paragraphs.Count

Wscript.Echo "Sentences: " & objDoc.Sentences.Count

Jak widać, zaczynamy od zdefiniowania stałej nazwie wdStatisticParagraphs i nadajemy jej wartość 4; dzięki temu program Word wie, którą statystykę ma obliczyć. Po zdefiniowaniu stałej tworzymy wystąpienie obiektu Word.Application; ustawiamy wartość właściwości Visible na True (żeby wystąpienie programu Word było widoczne na ekranie); a następnie wykonujemy poniższy wiersz kodu w celu otwarcia dokumentu C:\Scripts\Test.doc:

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

Dokument Test.doc wygląda tak:

The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.

The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.

The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.

Tak przy okazji, mam dla Was taki mały trik programu Word. Tworzymy nowy, pusty dokument, wpisujemy w nim poniższy wiersz i naciskamy klawisz ENTER:

=rand()‪

Program Word doda powyższy tekst do dokumentu (W programie Word 2007 tekst będzie się różnił, ale ta funkcja także działa.) Innymi słowy, polecenie =rand() doda fragment tekstu przykładowego do dokumentu, dzięki czemu otrzymamy praktyczny dokument zawierający tekst. Chcecie mieć dokument z 8 akapitami, a w każdym z nich po 3 zdania? Wpiszcie poniższe polecenie i naciśnijcie klawisz ENTER:

=rand(8,3)‪

A myśleliście, że my umiemy tylko skrypty pisać. Prawda jest taka, że od czasu do czasu nasza wiedza wybiega poza zakres związany ze skryptami.

Zazwyczaj jest tak w przypadku, gdy chodzi o coś równie ważnego, jak wstawianie tekstu przykładowego do dokumentu programu Word.

Po otwarciu dokumentu możemy obliczyć liczbę akapitów i zdań. Aby policzyć tylko akapity zawierające jakiś tekst używamy poniższego wiersza kodu:

Wscript.Echo "Paragraphs (text-only): " & objDoc.ComputeStatistics(wdStatisticParagraphs)

W tym przypadku skrypt informuje nas, że dokument zawiera 3 akapity, gdyż mamy trzy akapity zawierające tekst. Aby policzyć liczbę naciśnięć klawisza ENTER, pobieramy wartość właściwości Count kolekcji Paragraph, która podaje nam liczbę elementów w kolekcji:

Wscript.Echo "Paragraphs (including blank lines): " & objDoc.Paragraphs.Count

Tym razem program Word powie nam, że dokument zawiera 4 akapity, gdyż pusty wiersz następujący po paragrafie 3 uznawany jest jako akapit. Na koniec możemy użyć właściwości Count kolekcji Sentences w celu określenia liczby zdań w dokumencie:

Wscript.Echo "Sentences: " & objDoc.Sentences.Count

Ponieważ jest to bardzo prosty dokument (czyli nie zawierający skrótów ani żadnych mylących znaków interpunkcyjnych), program Word podaje nam prawidłową wartość: 15 zdań. Jak już mówiłem, w zależności od typu dokumentu, program Word nie zawsze będzie mógł podać dokładną liczbę zdań. W tym przypadku trafił w samo sedno. W innych przypadkach…

To jest najlepsze, co mogę zaoferować, RLP. Nie jest to rozwiązanie idealne ale nie ma lepszego sposobu na uzyskanie tej informacji. Ale nie to jest ważne, czy możemy dokładnie policzyć zdania w dokumencie programu Word. Ważne jest, że New England Patriots przegrali Super Bowl.

I postarajmy się zignorować fakt, że przegrana Patriots oznacza wygraną Giants.

Uwaga! Oczywiście teraz, kiedy Super Bowl jest już za nami, czekamy na kolejne ważne wydarzenie – zimową Olimpiadę Skrypciarską 2008 (j.ang.). Pamiętajcie, że rozgrywki zaczynają się w piątek 15 lutego. Cokolwiek by się nie działo, nie można tego przegapić; w końcu nikt nie chce, żeby Giants wygrali także Olimpiadę Skrypciarską.
 Do początku strony Do początku strony

Centrum skryptów - Microsoft office