Centrum skryptów - Microsoft Office

Jak zamienić określoną czcionkę 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 zamienić określoną czcionkę w dokumencie programu Microsoft Word?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Mam folder zawierający wiele dokumentów programu Word, którego autor miał nieszczęsną tendencję do używania od czasu do czasu dziwnej czcionki. Czy można napisać skrypt zmieniający tylko tę dziwną czcionkę na Arial?

-- Z D-F

Cześć Skrypciarze! Odpowiedź

Cześć, Z D-F. Kiedy zaczęto mówić o małej poligrafii komputerowej DTP, Skrypciarz piszący te słowa był jeszcze na studiach. Przeczytał wtedy chyba z tuzin artykułów o tym, że DTP to najpewniej najgorsze, co mogło się wydarzyć w biznesie, przynajmniej z punktu widzenia wydajności. Dlaczego? No cóż, w dawnych czasach, przed erą DTP, jeżeli potrzebny był jakiś dokument, wsuwało się arkusz papieru do maszyny do pisania i po prostu pisało. Nikt się nie martwił o układ tekstu, nikt nie kombinował z grafiką i, co chyba najważniejsze, nie było dylematów związanych z wyborem czcionki.

Kwestia czcionki była szczególnie interesująca, gdyż powodowała znacznie więcej problemów niż tylko strata czasu spowodowana wypróbowywaniem różnych czcionek i ich rozmiarów. To samo w sobie było problemem, jednak co gorsza, był on pogłębiany faktem, że nie wszyscy ludzie mają talent do projektowania graficznego. Nie tylko tracą oni czas eksperymentując z czcionkami, ale bardzo często rezultatem ich pracy jest wybór tej niewłaściwej czcionki, w efekcie czego otrzymujemy dokument o wiele trudniejszy do odczytania. Innymi słowy, ubytki wydajności miały miejsce nie tylko na etapie tworzenia dokumentu, ale także jego odczytywania.

Czyż postęp nie jest wspaniały?

Czy jakikolwiek skrypt jest w stanie pomóc nadrobić te straty w produktywności? Nie bardzo, no chyba, że ktoś wymyśli skrypt, który będzie trzepał ludzi po głowie za każdym razem, gdy będą chcieli zastosować jakąś nieczytelną czcionkę. Ale poniższy skrypt przynajmniej pomoże nam zamienić te zwariowane czcionki na coś, co da się odczytać i wygląda bardziej profesjonalnie:

Const wdReplaceAll = 2Set objWord = CreateObject("Word.Application")objWord.Visible = TrueSet objDoc = objWord.Documents.Open("C:\Scripts\Test.doc")Set objSelection = objWord.SelectionobjSelection.Find.Font.Name = "Gigi"objSelection.Find.Forward = TRUEobjSelection.Find.Replacement.Font.Name = "Arial"objSelection.Find.Execute "", ,False, , , , , , , ,wdReplaceAll

Na początek zakładamy, że dokument, o który chodzi, wyglądem zbliżony jest do następującego:

Jak widać, główna część tekstu napisana jest czcionką Times New Roman, co nie jest złe. Jednakże nagłówki sekcji napisane są czcionką o nazwie Gigi; sama nazwa wskazuj, że nie nadaje się do korespondencji handlowej i innych formalnych dokumentów. Z tego też powodu chcielibyśmy przeszukać ten dokument i zamienić czcionkę Gigi na czcionkę Arial. Trudną częścią naszego zadania jest zamiana tylko czcionki Gigi; wszystko, co jest napisane czcionką Times New Roman, powinno pozostać w takiej postaci. Niezależnie od tego, czy w to wierzymy, nasz skrypt to potrafi.

Jak zatem robi to nasz skrypt? Na początek, określamy stałą o nazwie wdReplaceAll i nadajemy jej wartość 2; za pomocą tej stałej wydamy polecenie zamiany wszelkich wystąpień czcionki Gigi. Następnie zastosujemy poniższy fragment kodu w celu stworzenia widocznego wystąpienia obiektu Word.Application, otwarcia dokumentu C:\Scripts\Test.doc i utworzenia wystąpienia obiektu Selection programu Word:

Set objWord = CreateObject("Word.Application")objWord.Visible = TrueSet objDoc = objWord.Documents.Open("C:\Scripts\Test.doc")Set objSelection = objWord.Selection

Macie rację. Dużo rzeczy się zmieściło w tych czterech wierszach kodu. Nic dziwnego, że już jesteśmy tacy zmęczeni!

Zaczyna się robić zabawnie. Aby przeprowadzić operację znajdź-i-zamień w programie Word, należy przypisać wartości dwóm różnym obiektom: obiektowi Find oraz obiektowi Replacement. Mając to na uwadze, stosujemy poniższe dwa wiersze kodu w celu przypisania wartości do obiektu Find:

objSelection.Find.Font.Name = "Gigi"objSelection.Find.Forward = TRUE

Nie jest to zbyt skomplikowane, prawda? Teraz chcemy wyszukać wszystkie wystąpienia czcionki Gigi, więc w wierszu pierwszym przypisujemy wartość Gigi do właściwości Find.Font.Name. A ponieważ zaczęliśmy z kursorem znajdującym się na początku dokumentu, następnie przypisujemy właściwości Find.Forward wartość True; skrypt potraktuje to jako polecenie poruszania się do przodu w dokumencie podczas wyszukiwania (tj. rozpoczynając na stronie 1 i kontynuując do końca dokumentu).

Jest to jedyne kryterium wyszukiwania, które musimy określić. Jak widać, nie określamy nawet tekstu, który chcemy wyszukać, a dzieje się tak dlatego, że sam tekst nas nie interesuje. Chodzi nam tylko o formatowanie.

Jak powszechnie wiadomo, do tanga trzeba dwojga; i okazuje się, że aby przeprowadzić operację znajdź-i-zamień także tak jest. Oznacza to, że po skonfigurowaniu obiektu Find, należy skonfigurować obiekt Replacement. Okazuje się to bardzo proste; jedyne, co robimy, to określenie, że czcionką zastępującą ma być Arial:

objSelection.Find.Replacement.Font.Name = "Arial"

Innymi słowy, skrypt zacznie od początku dokumentu, odnajdzie wszystkie wystąpienia czcionki Gigi i zamieni je na czcionkę Arial. Zamiast więc siedzieć w miejscu i deliberować o tym, co nasz skrypt może zrobić, po prostu weźmy się do roboty:

objSelection.Find.Execute "", ,False, , , , , , , ,wdReplaceAll

Wywołujemy tutaj metodę Execute, która wyda skryptowi polecenie przeprowadzenia operacji znajdź-i-zamień. Jak widzimy, przekazujemy do metody dziwnie wyglądający zbiór parametrów:

"", ,False, , , , , , , ,wdReplaceAll

Co to wszystko oznacza? Cóż, szczegółowe informacje dotyczące metody Execute i jej parametrów znajdują się w dokumencie Microsoft Word VBA Language Reference (j.ang.) w subskrypcji MSDN. Teraz wspomnimy jedynie, że parametr znajdujący się na początku wskazuje na tekst, który chcemy wyszukać. Ponieważ jednak nam zależy tylko na formatowaniu, zgodnie z konwencją programu Word stosujemy pusty ciąg, reprezentujący szukany tekst. A jak wiadomo, Skrypciarze zawsze stosują się do standardowych konwencji.

Drugi parametr dotyczy rozróżniania dużych i małych liter. Dla tego skryptu nie ma to znaczenia, jednakże ważne jest, aby parametry metody Execute były przekazywane zgodnie z ich pozycją. Co prawda nie użyjemy drugiego parametru, jednakże nie możemy go tak po prostu pominąć. Gdybyśmy to zrobili, trzeci parametr, który jest nam potrzebny, przestałby być trzecim parametrem na liście parametrów. Dlatego też, wartość drugiego parametru pozostawiamy jako pustą spację z następującym po niej przecinkiem wskazującym na parametr 2.

No tak, to może się wydać zawiłe. Wyobraźmy sobie zatem parametr wyglądający następująco:

1, 2, 3, 4

Nie, nie możemy. Wymieniliśmy tylko dwa parametry, a nasza metoda potrzebuje czterech. Z tego powodu, musimy przekazać jej ciąg parametrów wyglądający następująco, z pustymi spacjami mówiącymi o tym, że parametry 2 oraz 3 powinny zostać opuszczone:

1, , , 4

To samo dotyczy metody Execute.

Dobra, na czym skończyliśmy? A tak. Wstawiwszy pustą spację zamiast wartości parametru 2, nadajemy parametrowi 3 wartość False. Trzeci parametr każe skryptowi szukać całych słów; jeżeli ten parametr ma wartość True (która jest wartością domyślną), czcionka niektórych elementów (np. znaków interpunkcyjnych) pozostanie niezmieniona. Otrzymamy serię pustych parametrów (reprezentujących parametry niepotrzebne dla naszego skryptu). Nasza lista parametrów zostaje zachowana w zmiennej wdReplaceAll, która wyda programowi Word polecenie zamiany każdego wystąpienia czcionki Gigi. Bez tego parametru, program Word odnajdzie i zamieni tylko pierwsze wystąpienie czcionki Gigi.

Co otrzymamy po uruchomieniu tego skryptu? Właśnie to:

Hasta la vista, Gigi!

Tak, tak. Nie ma co się przechwalać. W sumie, czcionka Gigi zniknęła, ale na pewno nie da o sobie zapomnieć. Jeżeli znowu się gdzieś pojawi, uruchomimy nasz skrypt i – w zgodzie z duchem współczesności – poświęcimy cały ranek pozbywając się wszystkiego tego, na stworzenie czego nasi współpracownicy poświęcili wcześniej długie godziny.

Czyż postęp nie jest wspaniały?

 Do początku strony Do początku strony

Centrum skryptów - Microsoft Office