Proces integracji aplikacji MS Word i MS Excel nie należy do specjalnie trudnych. Znając podstawowy model obiektowy tych aplikacji łatwo odczytać zawartość dokumentu, tabeli i przenieść je do komórek (obszarów) Excela. Pewien problem może stanowić przenoszenie list- wypunktowania i numerowania. Jednak i dla tego typu operacji znaleźć można właściwą technikę VBA, którą zaprezentowano w odpowiedzi pod poniższym linkiem:
StackOverflow: Extract Multiple Word Table contents to Excel via VBA - Table contents numbered lines
Pokazywanie postów oznaczonych etykietą Word VBA. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą Word VBA. Pokaż wszystkie posty
czwartek, 3 marca 2016
środa, 2 września 2015
Microsoft Word- zamiana tekstu na obiekt ContentControl (lub inny)
Operacja do wykonania wydaje się być prosta- określone wystąpienie tekstu w dokumencie chcemy zamienić nie na inny tekst lecz na…obiekt. Pierwsza myśl to często- 'jaki jest symbol specjalny dla danego obiektu?'. W istocie, w metodzie .Find możemy zastosować znaki specjalne (Wildcards) w celu wyszukiwania i podmiany tekstu. Tutaj zastosujemy jednak inne i jednocześnie bardzo proste rozwiązanie- w miejscu wyszukanego tekstu po prostu wstawimy (dodamy) interesujący nas obiekt (w przykładzie będzie to ContentControl). Oto przykład wraz z dodatkowymi komentarzami.
czwartek, 4 grudnia 2014
Sumowanie liczb (rzeczywistych) w dokumencie Word (2 z 2)
O ile sumowanie liczb całkowitych było proste (co zaprezentowałem w poprzednim poście), o tyle suma liczb rzeczywistych wymaga dodatkowych zabiegów.
Osoby znające zagadnienie związane z wykorzystaniem znaków specjalnych w wyszukiwaniu (wildcards) lub techniki Regular Expresion z pewnością spodziewały się, że wystarczy minimalnie przerobić wzorzec wyszukiwania aby uzyskać oczekiwany efekt. Otóż nic bardziej mylnego, następujący zapis:
niestety nie sprawdza się w aplikacji Word. Po prostu nie jest dopuszczalne aby ilość znaków określić na 'zero lub więcej' co kryje się w zapisie {0;}.
Owszem, jesteśmy blisko rozwiązania tworząc następujący wzorzec:
tyle tylko, że powyższy schemat wyszuka również wszystkie przecinki w dokumencie i spróbuje je zsumować co w efekcie wygeneruje błąd. Pozostaniemy jednak przy tym rozwiązaniu i aby było skuteczne dodamy odpowiedni mechanizm obsługi błędów. Całość rozwiązania prezentuje poniższy kod.
Osoby znające zagadnienie związane z wykorzystaniem znaków specjalnych w wyszukiwaniu (wildcards) lub techniki Regular Expresion z pewnością spodziewały się, że wystarczy minimalnie przerobić wzorzec wyszukiwania aby uzyskać oczekiwany efekt. Otóż nic bardziej mylnego, następujący zapis:
niestety nie sprawdza się w aplikacji Word. Po prostu nie jest dopuszczalne aby ilość znaków określić na 'zero lub więcej' co kryje się w zapisie {0;}.
Owszem, jesteśmy blisko rozwiązania tworząc następujący wzorzec:
tyle tylko, że powyższy schemat wyszuka również wszystkie przecinki w dokumencie i spróbuje je zsumować co w efekcie wygeneruje błąd. Pozostaniemy jednak przy tym rozwiązaniu i aby było skuteczne dodamy odpowiedni mechanizm obsługi błędów. Całość rozwiązania prezentuje poniższy kod.
środa, 3 grudnia 2014
Sumowanie liczb (całkowitych) w dokumencie Word (1 z 2)
Tym razem temat wywołany na jednym z forów poświęconych programowaniu w VBA- w jaki sposób zsumować wszystkie wartości liczbowe w dokumencie Word, w określonym zaznaczeniu.
W sytuacji gdyby rzecz dotyczyła sumy w tabeli w dokumencie moglibyśmy sięgnąć po odpowiednie pola sumujące. Tym razem chodzi jednak o dowolny zaznaczony obszar.
Rozwiązanie podzielę na dwie części- sumowanie liczb całkowitych- i ten wariant zostanie zaprezentowany w niniejszym poście- oraz sumowanie liczb rzeczywistych, co jak się okaże jest relatywnie prostym zadaniem.
Aby zsumować liczby rzeczywiste najlepszym rozwiązaniem jest zastosować obiekt Find dla odpowiednio skonstruowanego klucza wyszukiwania z wykorzystaniem znaków specjalnych (wildcards). Poniższy kod realizuje to zadanie wyświetlając na końcu komunikat z podsumowaniem.
Powyższe rozwiązanie w wariancie sumującym liczby rzeczywiste opublikowany zostanie już jutro.
W sytuacji gdyby rzecz dotyczyła sumy w tabeli w dokumencie moglibyśmy sięgnąć po odpowiednie pola sumujące. Tym razem chodzi jednak o dowolny zaznaczony obszar.
Rozwiązanie podzielę na dwie części- sumowanie liczb całkowitych- i ten wariant zostanie zaprezentowany w niniejszym poście- oraz sumowanie liczb rzeczywistych, co jak się okaże jest relatywnie prostym zadaniem.
Aby zsumować liczby rzeczywiste najlepszym rozwiązaniem jest zastosować obiekt Find dla odpowiednio skonstruowanego klucza wyszukiwania z wykorzystaniem znaków specjalnych (wildcards). Poniższy kod realizuje to zadanie wyświetlając na końcu komunikat z podsumowaniem.
Powyższe rozwiązanie w wariancie sumującym liczby rzeczywiste opublikowany zostanie już jutro.
piątek, 28 listopada 2014
Konwersja tekstu na mowę (2 z 2)
Kontynuując poprzedni wpis dot. konwersji tekstu na mowę zaprezentuję sposób wykonania tej operacji z innej niż Excel aplikacji z pakietu Office. Istnieją dwa sposoby rozwiązania tego problemu.
Wariant A. Odczyt paragrafu z aplikacji MS Word z wykorzystaniem Excela.
W tym wariancie wystarczy z poziomu aplikacji MS Word utworzyć referencję do aplikacji Excel (dla prostoty działania z wykorzystaniem wiązania późnego) a następnie wykorzystać obiekt Speech dostępny w Excelu. Poniższy kod prezentuje takie właśnie działanie. Co ważne, nie musimy wyświetlać aplikacji Excel przez co osoba postronna nie zorientuje się, że odczyt następuje z poziomu innej niż Word aplikacji.
Wariant B. Wykorzystanie zewnętrznej biblioteki do odczytu tekstu
W tym wariancie wykorzystamy bibliotekę o nazwie Microsoft Speech Object Library, do której należy ustawić odpowiednią referencję w Menu >> Tools >>References... Biblioteka ta daje nam dostęp do rozszerzonej wersji generatora mowy. Dzięki szeregu właściwości i metod możemy wpłynąć na jakość dźwięku czy też wybrać odpowiedni język i głos (o ile biblioteka posiada odpowiednie dodatkowe zestawy głosów i języków).
Prosty przykład wykorzystania w/w biblioteki w celu odczytania pierwszego paragrafu z dokumentu MS Word przedstawia poniższa procedura:
Po dodatkowe informacje odsyłam do strony MSDN poświęconej tej bibliotece.
Wariant A. Odczyt paragrafu z aplikacji MS Word z wykorzystaniem Excela.
W tym wariancie wystarczy z poziomu aplikacji MS Word utworzyć referencję do aplikacji Excel (dla prostoty działania z wykorzystaniem wiązania późnego) a następnie wykorzystać obiekt Speech dostępny w Excelu. Poniższy kod prezentuje takie właśnie działanie. Co ważne, nie musimy wyświetlać aplikacji Excel przez co osoba postronna nie zorientuje się, że odczyt następuje z poziomu innej niż Word aplikacji.
Wariant B. Wykorzystanie zewnętrznej biblioteki do odczytu tekstu
W tym wariancie wykorzystamy bibliotekę o nazwie Microsoft Speech Object Library, do której należy ustawić odpowiednią referencję w Menu >> Tools >>References... Biblioteka ta daje nam dostęp do rozszerzonej wersji generatora mowy. Dzięki szeregu właściwości i metod możemy wpłynąć na jakość dźwięku czy też wybrać odpowiedni język i głos (o ile biblioteka posiada odpowiednie dodatkowe zestawy głosów i języków).
Prosty przykład wykorzystania w/w biblioteki w celu odczytania pierwszego paragrafu z dokumentu MS Word przedstawia poniższa procedura:
Po dodatkowe informacje odsyłam do strony MSDN poświęconej tej bibliotece.
czwartek, 25 września 2014
Komórka w tabeli dokumentu Word- wstawianie tekstów i obiektów
Myślę, że warto dodać jeszcze jeden wpis dot. Word VBA i pracy z komórkami tabeli w dokumencie Word. Przeglądając ostatnio kilka forów dostrzegłem, że niekiedy problemy sprawia dodawanie zawartości do komórki tabeli.
Przyjmijmy na początek następującą referencję do komórki w tabeli w aktywnym dokumencie:
Komórka.Range.Text = "Hello World"
Próba dodania prostego tekstu do komórki nie stanowi problemu:
Problemem jednak okazuje się dodanie do komórki np. pola z datą. Poniższy kod wygeneruje błąd (Run-time error '4605'):
Powyższy problem wynika z faktu, ze wewnątrz komórki występuje znak końca komórki, który widać po włączeniu wyświetlania znaków specjalnych:
W tego typu sytuacjach rozwiązaniem problemu jest wstawienie obiektu z pominięciem znaku końca komórki. Wykonać to można najprościej przed określenie początku i końca obszaru wstawiania:
Warto zwrócić na wartość -1 w powyższym kodzie- dzięki tej korekcie pomijamy problematyczny symbol końca komórki.
Przyjmijmy na początek następującą referencję do komórki w tabeli w aktywnym dokumencie:
Komórka.Range.Text = "Hello World"
Próba dodania prostego tekstu do komórki nie stanowi problemu:
Problemem jednak okazuje się dodanie do komórki np. pola z datą. Poniższy kod wygeneruje błąd (Run-time error '4605'):
Powyższy problem wynika z faktu, ze wewnątrz komórki występuje znak końca komórki, który widać po włączeniu wyświetlania znaków specjalnych:
W tego typu sytuacjach rozwiązaniem problemu jest wstawienie obiektu z pominięciem znaku końca komórki. Wykonać to można najprościej przed określenie początku i końca obszaru wstawiania:
Warto zwrócić na wartość -1 w powyższym kodzie- dzięki tej korekcie pomijamy problematyczny symbol końca komórki.
piątek, 19 września 2014
Usuwanie stron w MS Word z pomocą VBA 2/2
Kontynuując poprzedni wpis dot. stron dokumentu warto dodać, że istnieje jeszcze jeden ze sposobów odnajdywania strony dokumentu- przez wykorzystanie zakładki "\page". Poniższe odwołanie spowoduje, że zaznaczony zostanie obszar strony na której znajduje się bieżące zaznaczenie:
a stąd już blisko do usunięcia całej strony przez minimalna modyfikację powyższego kodu:
Jak widać wykorzystanie obiektu Bookmarks("\page") domyślnie weryfikuje układ dokumentu przez pryzmat widoku o czym pisałem w poprzednim wpisie.
Przy okazji warto zwrócić uwagę na zakładki specjalne występujące w dokumencie gdyż często okazują się być niezmiernie przydatne. Określane są one mianem zakładek predefiniowanych i pozwalają m.in. na:
Przy okazji serdecznie zapraszam na jesienne szkolenia z VBA dla aplikacji Excel. Nasze kursy organizowane są w Warszawie, Krakowie i Wrocławiu na różnych poziomach zaawansowania. Szczegółowe informacje na naszej stronie www.SzkoleniaVBA.pl.
a stąd już blisko do usunięcia całej strony przez minimalna modyfikację powyższego kodu:
Jak widać wykorzystanie obiektu Bookmarks("\page") domyślnie weryfikuje układ dokumentu przez pryzmat widoku o czym pisałem w poprzednim wpisie.
Przy okazji warto zwrócić uwagę na zakładki specjalne występujące w dokumencie gdyż często okazują się być niezmiernie przydatne. Określane są one mianem zakładek predefiniowanych i pozwalają m.in. na:
- odnalezienie początku dokumentu \StartOfDoc
- odnalezienie końca dokumentu \EndOfDoc
- odnalezienie początku lub końca bieżącego zaznaczenia : \StartOfSel, \EndOfSel
Przy okazji serdecznie zapraszam na jesienne szkolenia z VBA dla aplikacji Excel. Nasze kursy organizowane są w Warszawie, Krakowie i Wrocławiu na różnych poziomach zaawansowania. Szczegółowe informacje na naszej stronie www.SzkoleniaVBA.pl.
poniedziałek, 15 września 2014
Usuwanie stron w MS Word z pomocą VBA 1/2
Każdy kto kiedykolwiek miał styczność z VBA dla Worda ma świadomość, że nie istnieje jednoznacznie definiowany obiekt odpowiadający stronie dokumentu. Od razu wyjaśnię dlaczego tak jest dla tych osób, które są zaskoczone tym faktem- dokument traktowany jest bowiem jako ciąg tekstu o zdefiniowanych początku i końcu. Trudno na etapie obiektowej analizy zawartości dokumentu (sprawdzając ilość słów, paragrafów czy zdań) jednoznacznie określić ile on zajmie stron skoro użytkownik ostatecznie będzie mógł zastosować czcionkę różnej wielkości, zastosuje inny format papieru, itp., a przez to wpłynie na różną ilość stron dokumentu.
Nie jest jednak tak źle- pojecie strony pojawia się wtedy, gdy zaczynamy się odwoływać do dokumentu przez pryzmat bieżącego widoku. I tak na przykład aby sprawdzić ilość stron dokumentu możemy zastosować następujące zapytanie:
W powyższym przykładzie jesteśmy w stanie odnaleźć kolekcję Pages odpowiadającą stronie dokumentu. Ale kolekcja ta pojawia się jako element widoku, który reprezentowany jest przez obiekt okna Window (ActiveWindow).
Powyższy sposób nie jest jedynym na określenie ilości stron dokumentu. O wiele bardziej popularny sposób to odwołanie się do właściwości .Information obiektu Range, która zwraca szereg informacji dot. pliku Word:
W kolejnym wpisie zaprezentuję jeszcze jeden sposób odnajdywania strony, a technikę tą zaprezentuję w kontekście usuwania całej strony pliku.
Nie jest jednak tak źle- pojecie strony pojawia się wtedy, gdy zaczynamy się odwoływać do dokumentu przez pryzmat bieżącego widoku. I tak na przykład aby sprawdzić ilość stron dokumentu możemy zastosować następujące zapytanie:
W powyższym przykładzie jesteśmy w stanie odnaleźć kolekcję Pages odpowiadającą stronie dokumentu. Ale kolekcja ta pojawia się jako element widoku, który reprezentowany jest przez obiekt okna Window (ActiveWindow).
Powyższy sposób nie jest jedynym na określenie ilości stron dokumentu. O wiele bardziej popularny sposób to odwołanie się do właściwości .Information obiektu Range, która zwraca szereg informacji dot. pliku Word:
W kolejnym wpisie zaprezentuję jeszcze jeden sposób odnajdywania strony, a technikę tą zaprezentuję w kontekście usuwania całej strony pliku.
poniedziałek, 16 czerwca 2014
Blokada edycji zakładek w dokumencie MS Word
Poniższy problem został wywołany niedawno na forum StackOverflow.Com i można go opisać w następujących kilku słowach:
W jaki sposób zablokować dostęp do zakładek dokumentu jednocześnie umożliwiając edycję pozostałych elementów dokumentu?
Całkiem ciekawe rozwiązanie tego problemu opiera się na wykorzystaniu obiektów ContentControl (CC) i zdarzeń powiązanych z tym obiektami. Co ważne, rozwiązanie to dostępne jest począwszy od wersji 2007 aplikacji MS Word.
Krok 1. Każdą zakładkę w dokumencie musimy umieścić wewnątrz obiektu ContentControl. Jeżeli nie chcemy wykonywać tej operacji ręcznie wystarczy uruchomić proste makro:
Krok 2. Zakładamy, że naszym celem jest uniemożliwienie edycji bez blokowania obiektu ContentControl. W tym celu wykorzystamy zdarzenie powiązane z tego typu obiektami i wymusimy zmianę zaznaczenia w sytuacji gdy użytkownik kliknie wewnątrz obiektu CC:
Alternatywnie krok 1 można rozszerzyć o mechanizm blokowania edycji obiektu CC i jednocześnie zrezygnować z obsługi zdarzenia obiektów CC. W tym wypadku zamiast kroków 1 i 2 zastosujemy poniższy rozszerzony kod z kroku 1:
W jaki sposób zablokować dostęp do zakładek dokumentu jednocześnie umożliwiając edycję pozostałych elementów dokumentu?
Całkiem ciekawe rozwiązanie tego problemu opiera się na wykorzystaniu obiektów ContentControl (CC) i zdarzeń powiązanych z tym obiektami. Co ważne, rozwiązanie to dostępne jest począwszy od wersji 2007 aplikacji MS Word.
Krok 1. Każdą zakładkę w dokumencie musimy umieścić wewnątrz obiektu ContentControl. Jeżeli nie chcemy wykonywać tej operacji ręcznie wystarczy uruchomić proste makro:
Krok 2. Zakładamy, że naszym celem jest uniemożliwienie edycji bez blokowania obiektu ContentControl. W tym celu wykorzystamy zdarzenie powiązane z tego typu obiektami i wymusimy zmianę zaznaczenia w sytuacji gdy użytkownik kliknie wewnątrz obiektu CC:
Alternatywnie krok 1 można rozszerzyć o mechanizm blokowania edycji obiektu CC i jednocześnie zrezygnować z obsługi zdarzenia obiektów CC. W tym wypadku zamiast kroków 1 i 2 zastosujemy poniższy rozszerzony kod z kroku 1:
piątek, 17 stycznia 2014
Metoda Find w aplikacji MS Word- Przykład 2
Około 3 miesięcy temu opublikowałem pierwszy przykład wykorzystania metody .Find w aplikacji Word. Teraz chciałbym zaprezentować kolejny z przykładów pochodzący z konkretnej 'życiowej' sytuacji.
Niekiedy zdarza się, że importujemy do dokumentu MS Word treść innego dokumentu pochodzącego z innego systemu lub aplikacji. W wyniku takiej operacji utworzony dokument zawiera szereg wpisów (linii, paragrafów), które stanowią symbole podziału sekcji, stron, znaki specjalne pochodzące z tamtego systemu, itp. Generalnie uznać je można za błędne wpisy, które chcemy szybko i skutecznie usunąć. Jak pozbyć się niechcianych paragrafów szybko i skutecznie? Z pomocą przyjdzie nam oczywiście metoda .Find.
Krok 1. Utwórzmy nowy losowy dokument zgodnie z opisem z poprzedniego posta wpisując na jego początku =Lorem(30,1) i wciskając enter. Dodajmy kilka linijek zaczynających się od symboli specjalnych, np. [+], [-]. Całość mogłaby prezentować się następująco:
Krok 2. Określmy parametry początku linii, które chcemy usunąć i umieśćmy je w tablicy Array naszego dokumentu. W naszym przykładzie chcemy usunąć: wszystkie linie (paragrafy) zaczynające się od słowa "Donec", liter "In" oraz symboli "[+]" i "[-]". W rozwiązaniu, które wykona tą operację szczególnie warto zwrócić uwagę na rzędy, w których występują znaki typu []()+- itp. Są to symbole specjalne stosowane w technice Find i dlatego w sposób szczególny musimy je wyróżnić. W tym celu przed każdym z tych znaków musimy wstawić symbol backslash: "\".
Poniższe makro wykona za nas operację usuwania wskazanych, niechcianych wierszy. Dodatkowe uwagi umieszczone zostały w postaci komentarzy w treści kodu.
Niekiedy zdarza się, że importujemy do dokumentu MS Word treść innego dokumentu pochodzącego z innego systemu lub aplikacji. W wyniku takiej operacji utworzony dokument zawiera szereg wpisów (linii, paragrafów), które stanowią symbole podziału sekcji, stron, znaki specjalne pochodzące z tamtego systemu, itp. Generalnie uznać je można za błędne wpisy, które chcemy szybko i skutecznie usunąć. Jak pozbyć się niechcianych paragrafów szybko i skutecznie? Z pomocą przyjdzie nam oczywiście metoda .Find.
Krok 1. Utwórzmy nowy losowy dokument zgodnie z opisem z poprzedniego posta wpisując na jego początku =Lorem(30,1) i wciskając enter. Dodajmy kilka linijek zaczynających się od symboli specjalnych, np. [+], [-]. Całość mogłaby prezentować się następująco:
Krok 2. Określmy parametry początku linii, które chcemy usunąć i umieśćmy je w tablicy Array naszego dokumentu. W naszym przykładzie chcemy usunąć: wszystkie linie (paragrafy) zaczynające się od słowa "Donec", liter "In" oraz symboli "[+]" i "[-]". W rozwiązaniu, które wykona tą operację szczególnie warto zwrócić uwagę na rzędy, w których występują znaki typu []()+- itp. Są to symbole specjalne stosowane w technice Find i dlatego w sposób szczególny musimy je wyróżnić. W tym celu przed każdym z tych znaków musimy wstawić symbol backslash: "\".
Poniższe makro wykona za nas operację usuwania wskazanych, niechcianych wierszy. Dodatkowe uwagi umieszczone zostały w postaci komentarzy w treści kodu.
wtorek, 5 listopada 2013
Ograniczona ilość znaków w linii (MS Word)
Wyobraźmy sobie sytuację, że określonym dokumencie MS Word chcemy dokonać takiego podziału tekstu, aby w żadnej linii nie było więcej niż 30 znaków. Przykładowy paragraf, który pierwotnie wygląda następująco:
Lorem
ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas porttitor congue
massa. Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada
libero, sit amet commodo magna eros quis urna. Nunc viverra imperdiet enim.
Fusce est.
chcemy automatycznie podzielić na następujące linie, z których żadna nie ma więcej niż 30 znaków:
consectetuer adipiscing elit.
Maecenas porttitor congue
massa. Fusce posuere, magna
sed pulvinar ultricies, purus
lectus malesuada libero, sit
amet commodo magna eros quis
urna. Nunc viverra imperdiet
enim. Fusce est.
Poniższe makro wykona za nas tą operację dla wszystkich paragrafów aktywnego dokumentu. Tym razem wszystkie uwagi, ciekawostki i założenia zostały omówione w postaci komentarzy wewnątrz kodu.
wtorek, 22 października 2013
Losowy dokument w Wordzie
Tworząc szereg rozwiązań w VBA dla aplikacji MS Word często testuję określone techniki korzystając z przykładowego 'losowego' dokumentu. Dokument taki można stworzyć w bardzo prosty sposób wykorzystując ukryte polecenia aplikacji MS Word. W tym celu proszę utworzyć nowy pusty dokument w Word'zie i wykorzystać jedną z poniższych technik.
Wariant 1. Aby stworzyć losowy tekst 'Lorem ipsum' sięgamy po polecenie:
=Lorem()
które należy wpisać w pierwszym linii dokumentu i wcisnąć enter. W wyniku otrzymamy trzy paragrafy losowego tekstu.
Rozwiązanie to posiada możliwość parametryzowania:
=Lorem(10)
utworzy 10 paragrafów z losową ilością zdań
=Lorem(10,3)
utworzy 10 paragrafów i po trzy zdania w każdym paragrafie.
Wariant 2. Jeżeli tekst, z których chcemy pracować ma być w języku polskim sięgamy wtedy po polecenie:
=Rand()
które działa podobnie jak prezentowane powyżej polecenie Lorem. Dostępne więc będą wiarianty:
=Rand(10)
=Rand(10,3)
które odpowiednio definiują ilość paragrafów i zdań w każdym paragrafie.
Technika ta przyda się w jednym z kolejnych wpisów, który wkrótce pojawi się w sekcji Strefa Wiedzy. Strefa Wiedzy prowadzona jest jako rozszerzenie dla kursów VBA organizowanych przez naszą firmę w Krakowie, Warszawie i Wrocławiu.
Wariant 1. Aby stworzyć losowy tekst 'Lorem ipsum' sięgamy po polecenie:
=Lorem()
które należy wpisać w pierwszym linii dokumentu i wcisnąć enter. W wyniku otrzymamy trzy paragrafy losowego tekstu.
Rozwiązanie to posiada możliwość parametryzowania:
=Lorem(10)
utworzy 10 paragrafów z losową ilością zdań
=Lorem(10,3)
utworzy 10 paragrafów i po trzy zdania w każdym paragrafie.
Wariant 2. Jeżeli tekst, z których chcemy pracować ma być w języku polskim sięgamy wtedy po polecenie:
=Rand()
które działa podobnie jak prezentowane powyżej polecenie Lorem. Dostępne więc będą wiarianty:
=Rand(10)
=Rand(10,3)
które odpowiednio definiują ilość paragrafów i zdań w każdym paragrafie.
Technika ta przyda się w jednym z kolejnych wpisów, który wkrótce pojawi się w sekcji Strefa Wiedzy. Strefa Wiedzy prowadzona jest jako rozszerzenie dla kursów VBA organizowanych przez naszą firmę w Krakowie, Warszawie i Wrocławiu.
środa, 16 października 2013
Metoda Find w aplikacji MS Word- Przykład 1
Metoda .Find to jedno z bardziej przydatnych narzędzi nie tylko w Wordzie, ale także w Excelu (o czym wkrótce napiszę kilka postów). Ogólna zasada działania metody jest prosta- Znajdź >> Zaznacz. O wiele częściej sięgamy po to rozwiązanie w konfiguracji Znajdź >> Zamień. Tak czy inaczej w pracy z metodą .Find warto zawsze:
a) skorzystać z rejestratora makr
b) wykorzystać umiejętnie znaki specjalne (Wildcards) dostępne w pracy z tą metodą.
Od czasu do czasu przedstawię proste przykłady pracy z techniką Znajdź >> Zamień. Na początek następujące zadanie:
Dokument składa się z szeregu 12-to cyfrowych liczb umieszczonych w kolejnych paragrafach. Zadanie polega na wstawieniu pojedynczych cudzysłowów na początku i końcu każdego ciągu oraz na umieszczeniu wszystkich wpisów w jednej linii. Poniższy zrzut ekran pokazuje sytuację przed i po. Nieprzypadkowo na zrzucie ekranu dostrzec można również znaki podziału paragrafu, które będą kluczowe w rozwiązaniu problemu.
Podejście A. Teoretycznie możemy wykorzystać pętle i przeszukać cały dokument na okoliczność ciągów znaku uprzednio częściowo dokonawszy zamiany znaku paragrafu na przecinek. Rozwiązanie choć skuteczne to nieefektywne i nie będzie tu prezentowane.
Podejście B. Wykorzystując dwukrotnie metodę .Find >> .Replace osiągniemy nasz cel. Proszę zwrócić uwagę na parametr .Wildcards ustawiony odmiennie w pierwszej i drugiej części kodu.
Podejście C. Kluczowe w tym wariancie jest zastąpienie symbolu znaku paragrafu. W miejsce '^p' wstawiamy inny odpowiednik nowego paragrafu wyrażony jako '^13', który nie powoduje kolizji z ustawionym naprzemiennie parametrem .Wildcards w powyższym przykładzie. Dzięki temu nasze ostateczne rozwiązanie staje się jeszcze bardziej kompaktowe.
Prowadząc szkolenie z VBA zawsze staram się prezentować rozwiązania optymalne, choć często wychodzę od rozwiązań naturalnych-intuicyjnych by następnie móc zaprezentować ewolucję rozwiązania podobnie jak ma to miejsce powyżej.
a) skorzystać z rejestratora makr
b) wykorzystać umiejętnie znaki specjalne (Wildcards) dostępne w pracy z tą metodą.
Od czasu do czasu przedstawię proste przykłady pracy z techniką Znajdź >> Zamień. Na początek następujące zadanie:
Dokument składa się z szeregu 12-to cyfrowych liczb umieszczonych w kolejnych paragrafach. Zadanie polega na wstawieniu pojedynczych cudzysłowów na początku i końcu każdego ciągu oraz na umieszczeniu wszystkich wpisów w jednej linii. Poniższy zrzut ekran pokazuje sytuację przed i po. Nieprzypadkowo na zrzucie ekranu dostrzec można również znaki podziału paragrafu, które będą kluczowe w rozwiązaniu problemu.
Podejście A. Teoretycznie możemy wykorzystać pętle i przeszukać cały dokument na okoliczność ciągów znaku uprzednio częściowo dokonawszy zamiany znaku paragrafu na przecinek. Rozwiązanie choć skuteczne to nieefektywne i nie będzie tu prezentowane.
Podejście B. Wykorzystując dwukrotnie metodę .Find >> .Replace osiągniemy nasz cel. Proszę zwrócić uwagę na parametr .Wildcards ustawiony odmiennie w pierwszej i drugiej części kodu.
Podejście C. Kluczowe w tym wariancie jest zastąpienie symbolu znaku paragrafu. W miejsce '^p' wstawiamy inny odpowiednik nowego paragrafu wyrażony jako '^13', który nie powoduje kolizji z ustawionym naprzemiennie parametrem .Wildcards w powyższym przykładzie. Dzięki temu nasze ostateczne rozwiązanie staje się jeszcze bardziej kompaktowe.
Prowadząc szkolenie z VBA zawsze staram się prezentować rozwiązania optymalne, choć często wychodzę od rozwiązań naturalnych-intuicyjnych by następnie móc zaprezentować ewolucję rozwiązania podobnie jak ma to miejsce powyżej.
wtorek, 10 września 2013
Jak ukryć makro po stronie aplikacji Excel i zachować jego publiczny charakter
Wyobraźmy sobie sytuację, w której szereg współpracujących procedur Sub znajduje się w naszym projekcie VBA. Makra rozdzielone zostały na szereg modułów. Zależy nam jednak na tym, aby makra były dostępne z poziomu każdej inne procedury, a jednocześnie zależy nam na tym, aby szereg z tych makr nie był dostępny i widoczny z poziomu Excela...
Powyższe tytułem wstępu, a teraz uporządkujmy możliwe rozwiązania:
Wariant A- raczej oczywisty. Nadanie procedurze parametru Private:
Private Sub MojaProcedura()
sprawi, że procedura dostępna będzie z poziomu tylko modułu w którym jest makro oraz okna Immediate z przy zachowaniu pełnej referencji: Module1.MojaProcedura. Makro nie będzie dostępne z poziomu aplikacji Excel.
Wariant B oczywisty. Dodanie u góry modułu wpisu:
Option Private Module
co sprawi, że wszystkie makra danego modułu nie są widoczne po stronie Excela i jednocześnie zachowują swój publiczny charakter w zakresie pracy z nimi z poziomu innych modułów i okna Immediate.
Wariant C nie zawsze oczywisty. Konstrukcja publicznej procedury z parametrem:
Public MojaProceduraParametr(boParametr as Boolean)
czyni z tej procedury procedurę o podobnej charakterystyce jak w wariancie B- nie jest widoczna po stronie aplikacji Excel, ale jest w pełni dostępna z poziomu okna Immediate i innych modułów. Oczywiście wywołując ją należy podać parametr nie mniej nie mamy żadnego obowiązku, aby ten parametr wykorzystać w dalszej części procedury.
Szersze wykorzystanie wariantu C dla aplikacji MS Word, gdzie ze względu na specyficzną sytuację związaną z makrami typu AutoExec rozwiązanie C jest szczególnie przydatne, opisane zostało pod poniższym tematem w serwisie StackOverflow:
Hide AutoExec() and AutoNew() macros from the macro list yet still have them run?
Powyższe tytułem wstępu, a teraz uporządkujmy możliwe rozwiązania:
Wariant A- raczej oczywisty. Nadanie procedurze parametru Private:
Private Sub MojaProcedura()
sprawi, że procedura dostępna będzie z poziomu tylko modułu w którym jest makro oraz okna Immediate z przy zachowaniu pełnej referencji: Module1.MojaProcedura. Makro nie będzie dostępne z poziomu aplikacji Excel.
Wariant B oczywisty. Dodanie u góry modułu wpisu:
Option Private Module
co sprawi, że wszystkie makra danego modułu nie są widoczne po stronie Excela i jednocześnie zachowują swój publiczny charakter w zakresie pracy z nimi z poziomu innych modułów i okna Immediate.
Wariant C nie zawsze oczywisty. Konstrukcja publicznej procedury z parametrem:
Public MojaProceduraParametr(boParametr as Boolean)
czyni z tej procedury procedurę o podobnej charakterystyce jak w wariancie B- nie jest widoczna po stronie aplikacji Excel, ale jest w pełni dostępna z poziomu okna Immediate i innych modułów. Oczywiście wywołując ją należy podać parametr nie mniej nie mamy żadnego obowiązku, aby ten parametr wykorzystać w dalszej części procedury.
Szersze wykorzystanie wariantu C dla aplikacji MS Word, gdzie ze względu na specyficzną sytuację związaną z makrami typu AutoExec rozwiązanie C jest szczególnie przydatne, opisane zostało pod poniższym tematem w serwisie StackOverflow:
Hide AutoExec() and AutoNew() macros from the macro list yet still have them run?
poniedziałek, 19 sierpnia 2013
MS Word- podmiana akcji przycisku na wstążce
Aplikacja MS Word udostępnia ciekawą i praktyczną opcję, która umożliwia zamianę standardowej akcji wywołanej dowolnym przyciskiem znajdującym się na wstążce na akcję własną użytkownika. Proces zamiany jest relatywnie łatwy do wykonania i zaprogramowania choć od razu muszę zaznaczyć rzecz ważną- podmiana ta dotyczyć będzie wskazanego szablonu lub dokumentu. Nie zmienia ona akcji danego przycisku dla wszystkich dokumentów. Tak czy inaczej rozwiązanie to znajduje szereg praktycznych i przydatnych zastosowań. Żałuję też jednocześnie, że podobnych rozwiązań nie da się zrealizować we wszystkich aplikacjach MS Office.
Aby osiągnąć cel opisany w powyższym wprowadzeniu musimy wykonać kilka kroków i operacji. Całość zaprezentuję na bazie aktualizacji działania przycisku Wersja Robocza w zakładce Widok aplikacji MS Word 2010 (przycisk zaznaczony na poniższym zrzucie ekranu).
Krok 1. Otwieramy dokument, w którym chcemy zapisać zindywidualizowane zachowanie przycisku.
Krok 2. Przechodzimy do zakładki i wywołujemy polecenie: Widok >> Makra >> Wyświetl makra.
Krok 3. W wyświetlonym oknie Makra, w jego środkowej części z listy rozwijalnej Makra w: wybieramy opcję: Polecenia programu Word.
Krok 4. Chyba najtrudniejszy z etapów- na otrzymanej liście makr musimy odnaleźć i zaznaczyć to makro, które (wydaje się nam) powiązane jest z danym przyciskiem. Czym się kierować w poszukiwaniach- intuicją i logiką opartą o nazwy zakładek, nazwę grupy poleceń czy wreszcie nazwę naszego przycisku, który modyfikujemy.
W naszym przykładzie od razu trafimy na pewną trudność- otóż przycisk Wersja robocza nie będzie reprezentowany przez makro ViewDraft lecz makro ViewNormal. Aby się przekonać czy dokonaliśmy właściwego wyboru możliwe, że będziemy musieli wykonać i powtórzyć kilka kolejnych kroków.
Proszę pamiętać, aby zaznaczyć wybrane makro i nie zmieniać tego zaznaczenia!
Krok 5. W naszym oknie Makra na liście Makra w: dokonujemy ponownej zmiany- tym razem wskazujemy tam plik Worda, z którym chcemy powiązać indywidualne ustawienia przycisku.
Wskazówka! jeżeli w tym kroku zamiast pliku wskażemy odpowiedni szablon, np. Normal.Dotm, to nasza zmiana obsługi przycisku powiązana zostanie z tym szablonem a w konsekwencji ze wszystkimi dokumentami, które na bazie szablonu powstaną.
Krok 6. Klikamy w przycisk Utwórz w wyniku czego zostaniemy przeniesieni do edytora VBA w obszar utworzonego makra (proszę zwrócić uwagę na lokalizację kodu- znajduje się on w module w naszym dokumencie). W tym konkretnym przypadku makro powinno mieć następującą postać:
Krok 7. W tym momencie każda modyfikacja, która zostanie dokonana w otrzymanym makrze zostanie jednocześnie powiązana z przyciskiem 'Wersja robocza'. Przekonajmy się o tym dodając do naszego kodu proste polecenie:
A następnie proszę przejść do aplikacji MS Word i wcisnąć przycisk, którego kod poddaliśmy modyfikacji.
Krok 8. Proszę pamiętać o zapisaniu naszego pliku w wariancie z obsługą makr, a więc rozszerzeniem DOCM.
Aby osiągnąć cel opisany w powyższym wprowadzeniu musimy wykonać kilka kroków i operacji. Całość zaprezentuję na bazie aktualizacji działania przycisku Wersja Robocza w zakładce Widok aplikacji MS Word 2010 (przycisk zaznaczony na poniższym zrzucie ekranu).
Krok 1. Otwieramy dokument, w którym chcemy zapisać zindywidualizowane zachowanie przycisku.
Krok 2. Przechodzimy do zakładki i wywołujemy polecenie: Widok >> Makra >> Wyświetl makra.
Krok 3. W wyświetlonym oknie Makra, w jego środkowej części z listy rozwijalnej Makra w: wybieramy opcję: Polecenia programu Word.
Krok 4. Chyba najtrudniejszy z etapów- na otrzymanej liście makr musimy odnaleźć i zaznaczyć to makro, które (wydaje się nam) powiązane jest z danym przyciskiem. Czym się kierować w poszukiwaniach- intuicją i logiką opartą o nazwy zakładek, nazwę grupy poleceń czy wreszcie nazwę naszego przycisku, który modyfikujemy.
W naszym przykładzie od razu trafimy na pewną trudność- otóż przycisk Wersja robocza nie będzie reprezentowany przez makro ViewDraft lecz makro ViewNormal. Aby się przekonać czy dokonaliśmy właściwego wyboru możliwe, że będziemy musieli wykonać i powtórzyć kilka kolejnych kroków.
Proszę pamiętać, aby zaznaczyć wybrane makro i nie zmieniać tego zaznaczenia!
Krok 5. W naszym oknie Makra na liście Makra w: dokonujemy ponownej zmiany- tym razem wskazujemy tam plik Worda, z którym chcemy powiązać indywidualne ustawienia przycisku.
Wskazówka! jeżeli w tym kroku zamiast pliku wskażemy odpowiedni szablon, np. Normal.Dotm, to nasza zmiana obsługi przycisku powiązana zostanie z tym szablonem a w konsekwencji ze wszystkimi dokumentami, które na bazie szablonu powstaną.
Krok 6. Klikamy w przycisk Utwórz w wyniku czego zostaniemy przeniesieni do edytora VBA w obszar utworzonego makra (proszę zwrócić uwagę na lokalizację kodu- znajduje się on w module w naszym dokumencie). W tym konkretnym przypadku makro powinno mieć następującą postać:
Krok 7. W tym momencie każda modyfikacja, która zostanie dokonana w otrzymanym makrze zostanie jednocześnie powiązana z przyciskiem 'Wersja robocza'. Przekonajmy się o tym dodając do naszego kodu proste polecenie:
A następnie proszę przejść do aplikacji MS Word i wcisnąć przycisk, którego kod poddaliśmy modyfikacji.
Krok 8. Proszę pamiętać o zapisaniu naszego pliku w wariancie z obsługą makr, a więc rozszerzeniem DOCM.
poniedziałek, 6 maja 2013
Ścieżka do grafiki osadzonej w MS Word
Poniższy kod ma swoje źródło w pytaniu na jednym z globalnych forów. Chodziło w nim mniej więcej o uzyskanie ścieżki do pliku źródłowego dla zaznaczonego obrazu umieszczonego w dokumencie aplikacji MS Word.
W sumie rozwiązanie jest proste nie mniej w MS Word mamy do czynienia z dwoma typami obiektów rysunkowych należącymi albo do kolekcji Shapes albo do kolekcji InlineShapes.Poniższy kod dzięki prostej technice obsługi błędów sprawdza oba warianty. Jeżeli obiekt nie należy do pierwszej z kolekcji to sprawdzona zostaje druga. Ostatecznie uzyskamy oczekiwany wynik, a w sytuacji gdy nie został zaznaczony obiekt typu rysunkowego zwrócone zostanie puste okno MsgBox.
W sumie rozwiązanie jest proste nie mniej w MS Word mamy do czynienia z dwoma typami obiektów rysunkowych należącymi albo do kolekcji Shapes albo do kolekcji InlineShapes.Poniższy kod dzięki prostej technice obsługi błędów sprawdza oba warianty. Jeżeli obiekt nie należy do pierwszej z kolekcji to sprawdzona zostaje druga. Ostatecznie uzyskamy oczekiwany wynik, a w sytuacji gdy nie został zaznaczony obiekt typu rysunkowego zwrócone zostanie puste okno MsgBox.
czwartek, 18 kwietnia 2013
Wyświetlanie strony www z poziomu VBA
Niniejsze rozwiązanie adresowane jest zarówno do użytkowników Excela jak i innych aplikacji pakietu MS Office. Zadanie jest następujące- jak z poziomu kodu VBA wyświetlić stronę internetową?
Rozwiązanie jest pozornie proste- oto dwa warianty dla MS Excel i MS Word:
Powyższy kod uruchomi wskazany link w domyślnej przeglądarce na naszym komputerze.
Co jednak, gdy nie mamy w danym momencie otwartego żadnego skoroszytu lub dokumentu?
Z pomocą może przyjść rozwiązanie, które tworzy referencje do aplikacji Internet Explorer, uruchamia ją, wyświetla link. Tu problemem jest więc fakt, że niekoniecznie IE jest naszą domyślną i ulubioną przeglądarką. Kod VBA wygląda następująco:
Pełny wariant rozwiązania dla aplikacji Excel,, który za priorytet uznaje pierwszą z metod wyglądać będzie więc tak:
Rozwiązanie jest pozornie proste- oto dwa warianty dla MS Excel i MS Word:
Powyższy kod uruchomi wskazany link w domyślnej przeglądarce na naszym komputerze.
Co jednak, gdy nie mamy w danym momencie otwartego żadnego skoroszytu lub dokumentu?
Z pomocą może przyjść rozwiązanie, które tworzy referencje do aplikacji Internet Explorer, uruchamia ją, wyświetla link. Tu problemem jest więc fakt, że niekoniecznie IE jest naszą domyślną i ulubioną przeglądarką. Kod VBA wygląda następująco:
Pełny wariant rozwiązania dla aplikacji Excel,, który za priorytet uznaje pierwszą z metod wyglądać będzie więc tak:
poniedziałek, 25 marca 2013
MS Word- liczba słów w dokumencie odpowiadających formatowaniu
Jakiś czas temu pomagałem jednemu z forumowiczów rozwiązać problem zliczania słów, które spełniają określone kryterium formatowania. Makro miało działać dla dużego dokumentu liczącego kilkadziesiąt stron, miało być oczywiście stworzone dla Worda.
Jak to zrobić?? Jeżeli pierwszą myślą jest 'pętla dla każdego słowa' to powiem ok, taka była też pierwsza myśl pytającego. Nie mniej dla 50 stron działało to dość długo, a w dodatku nie przynosiło oczekiwanych rezultatów. Lepszym rozwiązaniem jest wykorzystać owo 'A w VBA' (o czym piszę osobno) czyli sięgnąć po mechanizm 'Szukaj'.
Poniżej gotowy kod dla bieżącego dokumentu liczący słowa pogrubione i (standardowo) podkreślone oraz nie wyróżnione kolorem. Inne opcje wyszukiwania mogą zostać zastosowane przez analogię.
Osobom początkującym zwrócę uwagę na nieskończoną pętlę Do Loop- proszę pamiętać, że taka konstrukcja jest możliwa o ile gdzieś w kodzie, w celu uniknięcia nieskończonego zapętlenia, występuje parametr kończący działanie pętli Exit Do.
Jak to zrobić?? Jeżeli pierwszą myślą jest 'pętla dla każdego słowa' to powiem ok, taka była też pierwsza myśl pytającego. Nie mniej dla 50 stron działało to dość długo, a w dodatku nie przynosiło oczekiwanych rezultatów. Lepszym rozwiązaniem jest wykorzystać owo 'A w VBA' (o czym piszę osobno) czyli sięgnąć po mechanizm 'Szukaj'.
Poniżej gotowy kod dla bieżącego dokumentu liczący słowa pogrubione i (standardowo) podkreślone oraz nie wyróżnione kolorem. Inne opcje wyszukiwania mogą zostać zastosowane przez analogię.
Osobom początkującym zwrócę uwagę na nieskończoną pętlę Do Loop- proszę pamiętać, że taka konstrukcja jest możliwa o ile gdzieś w kodzie, w celu uniknięcia nieskończonego zapętlenia, występuje parametr kończący działanie pętli Exit Do.
Subskrybuj:
Posty (Atom)



