wtorek, 30 kwietnia 2013

Zapomniany parametr metody Select

Nie każdy z programistów VBA wie, że metoda Select (wybranych obiektów) posiada dodatkowy parametr. Ogólna składnia zgodna z pomocą VBA to:

Co daje zastosowanie tego parametru? Otóż ustawienie jego wartości na False sprawi, że porzednie zaznaczenie nie zostanie odznaczone. Dwa przykłady, wywołanie 2 kolejnych następujących po sobie instrukcji:

sprawi, że zaznaczony będzie tylko arkusz 2

sprawi, że zaznaczone będą dwa arkusze: 1 i 2.

Dlaczego rozwiązanie to nie jest powszechne? Otóż Select należy do instrukcji, o których istnieniu 'się wie' od pierwszego kontaktu z VBA (Select z przesadą jest obsługiwane przez rejestratory makr). Mało kto więc zadaje sobie trud aby sprawdzić składnię tej metody. Dodatkowo IntelliSense nie przychodzi z pomocą- proszę porównać to wpisując w oknie Immediate poniższe instrukcje i wcisnąć dodatkową spację na końcu:

Tylko w drugim wariancie uzyskamy podpowiedź potwierdzającą istnienie parametru.

Z jakimi obiektami działa to rozwiązanie. Na pewno z arkuszami, kształtami, wykresami... Na pewno też działa z obiektami innych aplikacji (Word, PowerPoint). W razie potrzeb polecam weryfikację z pomocą systemu IntelliSense lub korzystając z pomocy VBA.

czwartek, 25 kwietnia 2013

Obowiązkowe funkcje VBA

Trudno jest początkowo zapamiętać wszystkie funkcje jakie oferuje język VBA. Najczęściej początkujący adepci programowania skupiają się na funkcjach podstawowych wobec faktu, że z ich odpowiednikami pracują na co dzień w Excelu. Nie wystarczy znać jednak funkcje: Left, Right Mid czy UCase, które dostępne są w zasobach VBA.

Do napisania niniejszego postu skłoniła mnie sytuacja z jednego z ostatnich szkoleń. Chodziło o import danych z pliku generowanego przez SAP'a, w którym występowały wiersze rozdzielające strony, nietypowe wiersze tekstowe, dane były ułożone kolumnowo, ale rozdzielone nietypowymi znakami. Dodatkowo na pierwszy rzut oka trudno było dostrzec regularność. Tymczasem skuteczny import raportu do arkusza Excel udało się zrealizować tylko wykorzystując poniższe funkcje ku zaskoczeniu części grupy.

Lista funkcji, których znajomość robi różnicę nie jest długa. Warto poświęcić jednak czas i zapamiętać te, które poniżej prezentuję. Ponieważ wszystkie one są prezentowane w czasie moich szkoleń niniejszy post ma być przypomnieniem dla dotychczasowych uczestników. A dla pozostałych czytelników niech będzie testem, czy na pewno znam i potrafię korzystać z tych instrukcji.

Mid, Left, Right       'wycinają fragmenty tekstu
LTrim, RTrim, Trim     'usuwają spacje na końcach tekstu
Replace                'zastępowanie znaków
InStr, InStrRev, StrComp      'test porównania
LCase, UCase, StrConv, Format   'formatujące, nie tylko tekst

no i na koniec jedna z najważniejszych funkcji:

Split                  'tablica fragmentów tekstu

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:

czwartek, 11 kwietnia 2013

Czyszczenie (i nie tylko) okna Immediate

Mam pewne (raczej) dobre przyzwyczajenie, że w większości procedur wstawiam na etapie ich tworzenia szereg instrukcji Debug.Print w celu kontroli wartości lub postępu działania procedury. Uciążliwe jednak staje się w pewnym momencie 'przepełnienie' okna Immediate informacjami znajdującymi się tam. Jeżeli dodatkowo korzystam z Immediate aby wykonać szybkie instrukcje lub sprawdzić/zmienić zmienne to po krótkim czasie panuje tam chaos. Jak sobie radzić z podobnym problemem. Oto i kilka rozwiązań.

1. Moja najstarsza metoda to wywołanie na starcie procedury poniższej instrukcji, która rozdziela dotychczasowe zapisy pozwalając łatwo odnaleźć początek wyników przekazanych w obecny wywołaniu:

2. Metoda druga to wykorzystanie darmowej aplikacji, którą ściągnąłem z sieci, a która nazywa się MZ-Tools. Aplikacja ta dodaje pasek narzędzi w środowisku IDE, na którym z łatwością można odnaleźć symbol gumki służący do czyszczenia okna Immediate.

3. Powyższe działanie jest o ułamek szybsze niż wykonanie 3 kroków: kliknięcie w Immediate >> Ctrl+a >> klawisz Del

4. To pomysł znaleziony ostatnio na forum, aby na początku procedury wywołać następującą instrukcję:

Jedyną wadą tego rozwiązania jest to, że działa tylko w Excelu.

5. Inna zaskakująca idea to wykorzystanie techniki API. Nie zaprezentuję tego kodu tutaj gdyż jest długi i wg mnie nie wart zachodu.

6. Znalazłem też, że tak to określę, 'pokręcony' pomysł, który zamiast kasować wrzuca maksymalną ilość dostępnych w Immediate wierszy poniższą instrukcją:

Podsumowując, każde rozwiązanie ma swoje wady. Ja pozostanę przy pierwszych trzech, które będę stosował adekwatnie do sytuacji i potrzeb. I to też polecam czytelnikom.

czwartek, 4 kwietnia 2013

Jak wysłać SMS z poziomu Excel'a

Wiele miesięcy temu przygotowałem bardzo prosty kod umożliwiający wysłanie sms'a z poziomu aplikacji MS Excel. Zaproponowane rozwiązanie opiera się o komercyjny dostęp do usługi wysyłania SMS świadczonej przez T-Mobile. Szczegółowe informacje dot. tej usługi dostępne są na stronie operatora pod tym adresem.

Gotowy kod przygotowany w postaci procedury parametryzowanej  wygląda następująco.

Aby wysłać wiadomość należy wywołać procedurę, np. w oknie Immediate:

Ostatnio testowany kilka tygodni temu. Ponieważ jednak widzę, iż mechanizm usługi T-Mobile pozostał bez zmian (od kilku już lat) dlatego też myślę, że rozwiązanie pozostanie skuteczne na dość długo.