Centrum skryptów - Microsoft Office

Jak pobrać wartości pól w dokumencie programu Microsoft 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 pobrać wartości pól w dokumencie programu Microsoft Word?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Mam u siebie mnóstwo dokumentów zawierających pole, takie jak LastSavedBy. Jakiego skryptu użyć, aby pobrać aktualne wartości dla tych pól?

-- OS

Cześć Skrypciarze! Odpowiedź

Cześć, OS. Jak się zapewne domyślasz, jestem tak zapracowany, że w ogóle nie mam czasu oglądać telewizji. No dobra, trochę mam, ale nie o tym chciałem. Chciałem o tym, co mnie bardzo zaciekawiło podczas ostatniego bliskiego kontaktu trzeciego stopnia z ekranem telewizyjnym. Otóż oglądam sobie i oglądam, i tym razem nie kalambury ani przemiłe panie, do których czuję się zobligowany zadzwonić, ale reklama nowego wydania gry Monopol. Świat się naprawdę zmienia, bo gracze nie używają już gotówki – każdy ma do dyspozycji kartę płatniczą, a swoje zyski i straty można sprawdzać w urządzeniu podobnym do bankomatu.

W sumie to nie jestem sobie wyobrazić, jaką to może dać komukolwiek przyjemność. Przez całe życie myślałem, że największą uciechą jest kiedy bratu czy siostrze zostaje jedna studolarówka i musi zapłacić, dajmy na to, podatek od luksusu czy cokolwiek innego, a ty możesz mu powiedzieć: „Jak mi oddasz swój hotel, to nie policzę Ci tego wejścia na moje pole.” Przecież chodzi o zgarnianie gotówki!! No chyba że się mylę…

Znak czasów: Karta oczywiście nie jest jakąś tam sobie kartą. O nie, nie, nie. Karta to oczywiście Visa. Gracze do dyspozycji mają również jakże często spotykany na ulicy pojazd Segway, jakże często używany na co dzień prom kosmiczny, oraz niewiarygodne, nie mogłem uwierzyć oczom – pieska w torebce. Chyba jednak jestem tradycjonalistą...

Tradycjonalista czy nie tradycjonalista, nie czas to na gry, jak trzeba się zabierać za skrypt, który pobiera wartości pól w dokumencie programu Microsoft Word:

Set objWord = CreateObject("Word.Application")

objWord.Visible = True



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



Set colFields = objDoc.Fields

colFields.Update



For Each objField in colFields

    Select Case objField.Type

        Case 20

        Set objRange = objField.Result

        strUser = objRange.Text

        Wscript.Echo "Last Saved By: " & strUser

    End Select

Next

Przejdźmy przez cały kod i zobaczmy, jak działa. Zaczynamy od utworzenia wystąpienia obiektu Word.Application i ustawiamy jego właściwość Visible na True; to daje nam uruchomione i widoczne na ekranie wystąpienie programu Microsoft Word. Następnie używając poniższego wiersza kodu otwieramy plik C:\Scripts\Test.doc:

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

Proste? No raczej…

Po otworzeniu dokumentu używamy poniższego wiersza kodu i pobieramy kolekcję wszystkich pól w dokumencie:

Set colFields = objDoc.Fields

Mając już taką kolekcję na podorędziu wywołujemy metodę Update i aktualizujemy wszystkie pola. Dzięki tej metodzie otrzymujemy ostatnie, aktualne wartości dla każdego z pól w dokumencie. Zakładamy, że większość z Was chce właśnie to zrobić. Jeżeli jednak wolicie pobrać wartości pól dokumentu w momencie ostatniego zapisywania, to musicie po prostu usunąć ten wiersz kodu z Waszego skryptu. Powinien się wtedy kończyć w sposób następujący:

' colFields.Update

Kolejnym naszym krokiem będzie uruchomienie pętli For Each, która przejdzie przez całą kolekcję pól. Program Microsoft Word rozpoznaje pola po ich typie (Type), właściwość Type ma tutaj osobną, niepowtarzalną wartość w postaci liczby całkowitej. Dla przykładu, pole LastSavedBy ma wartość 20, autor pola ma wartość 17. W naszym skrypcie ustawiamy twierdzenie Select Case, które rozpoznaje wartość właściwości Type, a następnie wywołuje echo odpowiednich nazw pól. Jak widać, polecenie Select Case szuka nazw pól jednego typu, tj. pól LastSavedBy, które jak już wiemy, mają wartość 20. Można oczywiście rozszerzyć zakres twierdzenia Select Case, w zależności od poszukiwanego typu pola. Gdy na przykład dodamy poniższy fragment kodu, wywołamy wartość pola Author:

Select Case objField.Type

    Case 17

    Set objRange = objField.Result

    strUser = objRange.Text

    Wscript.Echo "Author: " & strUser

Jeżeli natomiast mamy fantazję wywołać wszystkie wartości, bez precyzowania poszukiwanego typu pola, używamy następującego kodu:

For Each objField in colFields

    Set objRange = objField.Result

    Wscript.Echo objRange.Text

Next

Dobór elementów, których echo chcemy przywołać, pozostawiamy już w Waszej gestii.

Uwaga: Na pewno macie pytanie: „Skąd wiadomo, jakie pole ma przypisane jaką liczbę całkowitą?”. Po pierwsze, jestem bystrzacha, a po drugie (i bardziej serio), to cały wykaz możecie znaleźć na Microsoft Word VBA Language Reference (j.ang.) w witrynie MSDN pod hasłem „wdFieldType enumeration”.

Załóżmy teraz, ze odnaleźliśmy pole LastSavedBy (o wartości Type równej 20). Co robimy? Oczywiście uruchamiamy poniższy fragment kodu:

Set objRange = objField.Result

strUser = objRange.Text

Wscript.Echo "Last Saved By: " & strUser

Teraz uzasadnienie naszego kroku: aby wywołać echo elementów takich jak wartość pola, musimy najpierw utworzyć obiekt Range , obejmujący wielkość Result, czyli właśnie wartość pola. Do utworzenia obiektu Range używamy następującego wiersza kodu:

Set objRange = objField.Result

Po utworzeniu obiektu Range możemy nadać już wartość obiektu Text zmiennej strUser. Teraz tylko przywołujemy komendę „Last Saved By:” łącznie z imieniem osoby, która jako ostatnia zapisywała dokument:

Wscript.Echo " Last Saved By: " & strUser

I tyle.

Aż musiałem poszperać w Internecie, żeby zobaczyć, o co chodzi z tym Monopolem. Pierwszą rzeczą, jaką przeczytałem temat gry jest: „ Pieniądze, szelest banknotów – oto, co przyciąga do kasyn tysiące hazardzistów. «Monopol» nie jest właściwie grą hazardową, ale magia papierowych pieniędzy i tak działa jak magnes. Na początku gry każdy otrzymuje jednakową kwotę. Dalej musi już liczyć w zasadzie tylko na uśmiech losu.” Więc chyba nie jestem sam w swoich spostrzeżeniach i refleksjach.

 Do początku strony Do początku strony

Centrum skryptów - Microsoft Office