Kurs VBA dla EXCELA Kurs ten rozpocznę od opisu niektórych elementów środowiska w którym przyjdzie nam pracować. Jednym z takich elementów jest pasek narzędzi Przybornik formantów dostarczający formanty ActiveX. Jest to jedno z podstawowych narzędzi z których będziemy korzystać. W Przyborniku formantów zawarte są następujące elementy:
•
• • • • • • • • • • • • • •
Tryb projektowania - za pomocą tego przycisku włączamy lub wyłączamy tryb projektowania.
Przycisk Tryb projektowania powinien być włączony jeżeli chcemy edytować, zmieniać właściwości lub przypisać kod do formantów. Właściwości - po kliknięciu na ten przycisk wyświetlane jest okno z wartościami właściwości zaznaczonego (aktywnego) w danym momencie formantu czy obiektu. Wyświetl kod - uruchamiany jest Edytor VisualBasic i wyświetlane jest okienko Kod programu aktywnego elementu. Pole wyboru - tworzy pole, poprzez które użytkownik może wskazać, czy jakieś stwierdzenie jest prawdziwe czy fałszywe. Jednocześnie w arkuszu można zaznaczyć więcej niż jedno pole wyboru. Pole tekstowe - przechowuje tekst, który użytkownik może wprowadzić lub zmienić. Przycisk polecenia - element z którego będziemy najczęściej korzystać, tworzy przycisk, który po kliknięciu inicjuje akcję. Przycisk opcji - przycisk używany do wybierania jednej opcji z grupy opcji. Pole listy - pole zawierające listę elementów. Pole kombi - pole tekstowe zawierające pole listy rozwijanej. Można wybrać element z listy albo wpisać własną pozycję. Przycisk przełącznika - tworzy przycisk, który można włączać i wyłączać. Przycisk pokrętła - przycisk, który może być połączony z komórką lub polem tekstowym. Aby zwiększyć wartość, należy kliknąć strzałkę w górę, aby zmniejszyć wartość klikamy strzałkę w dół. Pasek przewijania - formant służący do przewijania zakresu wartości. Etykieta - często stosowany formant, pozwala umieścić tekst, którego użytkownik nie będzie mógł zmienić, na przykład podpis pod ilustracją. Obraz - specjalny formant do wstawiania grafiki. Więcej formantów - jak sama nazwa wskazuje za pomocą tego przycisku uruchamiamy listę dodatkowych formantów ActiveX.
Aby Przybornik formantów był widoczny w arkuszu Excela: z menu Widok arkusza wybierz polecenie Paski narzędzi a następnie opcję Przybornik formantów. Innym sposobem jest kliknięcie na ikonę Przybornik formantów w pasku narzędzi Visual Basic. Aby uaktywnić pasek narzędzi Visual Basic z menu Widok 1
wybieramy Paski narzędzi a następnie Visual Basic. Jeżeli chcemy dodać (wstawić) jakiś formant do arkusza Excela: w Przyborniku formantów klikamy na przycisk odpowiadający formantowi, który chcemy dodać a następnie miejsce w arkuszu gdzie ma się znajdować.
Słownictwo: •
Formant ActiveX - formant, taki jak pole wyboru lub przycisk, który oferuje opcje użytkownikom
albo uruchamia makra lub skrypty automatyzujące zadania. Następnym elementem z którego będziemy często korzystać jest pasek narzędzi Visual Basic. Aby pasek narzędzi Visual Basic był widoczny w arkuszu Excela: z menu Widok arkusza wybierz polecenie Paski narzędzi a następnie opcję Visual Basic. W Pasku tym zawarte są następujące elementy:
•
Uruchom makro - za pomocą tego przycisku możemy uruchomić, edytować lub usunąć istniejące
makro. • • •
• •
•
Zarejestruj makro - przycisk pozwala na zarejestrowanie (nagranie, utworzenie) nowego makra. Po zakończeniu rejestrowania makra klikamy na przycisk Zatrzymaj rejestrowanie. Zabezpieczenia - możemy ustawić poziom zabezpieczeń przed wirusami makr. Edytor Visual Basic - przycisk uruchamia Edytor Microsoft Visual Basic: Środowisko, w którym
można edytować zarejestrowane makra oraz pisać nowe makra i programy w języku Visual Basic for Application. Jest to praktycznie właściwe środowisko naszej pracy w którym będziemy pisać kody naszych programów. Przybornik formantów - pozwala wyświetlić i zamknąć pasek narzędzi Przybornik formantów dostarczający formanty ActiveX. Pasek ten opisałem na poprzedniej stronie kursu. Tryb projektowania - za pomocą tego przycisku włączamy lub wyłączamy Tryb projektowania. Przycisk Tryb projektowania powinien być włączony jeżeli chcemy edytować lub zmieniać właściwości formantów. Microsoft Script Editor - po kliknięciu na przycisk uruchamiany jest Microsoft Script Editor program używany do edytowania tekstu, tagów HTML i dowolnego kodu Microsoft Visual Basic Scripting Edition (VBScript) na stronie dostępu do danych. W programie Script Editor można również wyświetlić stronę w takiej postaci, w jakiej będzie się pojawiać w przeglądarce sieci Web. My na razie nie będziemy korzystać z tego przycisku.
Słownictwo: •
makro - akcja lub zestaw akcji, którego można użyć do automatyzacji zadań. Makra są rejestrowane
w języku programowania Visual Basic for Applications. Zanim jeszcze samodzielnie zaczniemy pisać programy, naszą przygodę z programowaniem w VBA rozpoczniemy od zautomatyzowania często powtarzanych czynności. Jeżeli jakieś czynności są często 2
powtarzane w programie Microsoft Excel, można je zautomatyzować przy użyciu makra. Makro jest serią poleceń i funkcji, które są przechowywane w module Visual Basic i mogą być uruchomione zawsze, gdy zachodzi potrzeba wykonania danych czynności. Oczywiście odpowiednie makro należy wcześniej utworzyć. Bez względu na to jaka jest Twoja wiedza na temat VBA (praktycznie żadnej wiedzy nie musisz posiadać w tym temacie), możesz skorzystać z pewnego narzędzia do tworzenia makr tj. Rejestratora makr. •
makro - napisany lub zarejestrowany program przechowujący szereg poleceń Microsoft Excel,
którego można później użyć jako pojedynczego polecenia. Makra są przeznaczone do automatyzacji złożonych zadań i zmniejszania liczby kroków wymaganych do wykonania często powtarzających się zadań. Makra są rejestrowane w języku programowania Visual Basic for Applications. Makra można także pisać bezpośrednio korzystając z edytora Visual Basic
Rejestrowanie makra: Jak już wspomniałem makra rejestrujemy za pomocą Rejestratora makr. Rejestrator ma pewne wady, o których przekonasz się w miarę nabywania doświadczenia. Ma jednak niepodważalną zaletę nie popełnia błędów składni często spotykanych u początkujących programistów. Rejestrowanie makra a następnie przeglądanie kodu jest też dobrym sposobem nauki języka VBA. Ja osobiście często korzystam z Rejestratora makr do napisania jakiegoś fragmentu kodu który sprawia mi trudność lub w celach poznawczych. Rejestrowanie makra możemy porównać do nagrywania muzyki przy użyciu magnetofonu. Tak jak nagraną muzykę możemy później odtworzyć tak samo, aby powtórzyć zarejestrowane wcześniej polecenia można uruchomić makro. Przed przystąpieniem do zarejestrowania makra, dobrze jest zaplanować kolejne kroki i polecenia, które makro ma wykonywać. Jeśli podczas rejestracji zostanie popełniony błąd, wykonane poprawki będą także zarejestrowane. Sposób rejestrowania makr najlepiej przedstawić na przykładzie. Poniżej zarejestrujemy makro którego zadaniem będzie wyczyszczenie zawartości kilku oddzielnych komórek (lub zakresów komórek) w arkuszu Excela. Aby zarejestrować nasze makro wykonaj następujące czynności:
Sposób klasyczny: 1. Z menu Narzędzia wybierz Makro następnie kliknij na polecenie Zarejestruj nowe makro.... 2. Powinno się otworzyć okno Rejestruj makro (patrz rysunek poniżej). W oknie tym możesz ustawić następujące opcje rejestrowanego makra:
o
W polu Nazwa makra: wpisz nazwa dla nowego makra (na przykład: Czyszczenie).
3
W polu Klawisz skrótu: możesz określić skrót klawiaturowy po naciśnięciu którego makro zostanie uruchomione. Ponieważ nasze makro będzie uruchamiane w inny sposób pole te pozostawiamy bez zmian. o Przechowuj makro w: w polu tym po wybraniu z listy możesz określić miejsce przechowywania a tym samym dostępność makra. W naszym przypadku pole te też pozostawiamy bez zmian. o W polu Opis: możesz zmienić opis makra. Domyślnie Excel umieszcza tam datę zarejestrowania makra oraz dane autora. 3. Kliknij na przycisk OK aby rozpocząć rejestrację. UWAGA: od tego momentu wszystkie czynności jakie wykonasz w arkuszu będą zarejestrowane. W obrębie arkusza powinien się pojawić specjalny pasek poleceń z dwoma przyciskami: Zatrzymaj rejestrowanie i Odwołanie względne. o
o
Przycisk Zatrzymaj rejestrowanie umożliwia zakończenie rejestrowania makra w odpowiednim dla Ciebie momencie.
Wciśniecie przycisku Odwołanie względne spowoduje że adresy komórek będą zapisywane względnie. Jeśli więc przemieścimy się z komórki A1 do B3, Excel zapamięta to jako przejście z komórki znajdującej się o jedną kolumnę w prawo i dwa wiersze w dół. Dzięki temu możemy tworzyć makro, które będzie na przykład wpisywało dowolny tekst w komórce obok tej która jest aktywna w momencie uruchomienia makrodefinicji. 4. Pora na wykonanie odpowiednich czynności które będzie wykonywało nasze makro. o Umieść kursor myszy na przykład w komórce B2 arkusza a następnie naciśnij przycisk Delete na klawiaturze. o Powtórz te czynność jeszcze dla kilku komórek arkusza lub zakresów komórek. 5. Po wykonaniu odpowiednich kroków kliknij na przycisk Zatrzymaj rejestrowanie. o
Za pomocą paska narzędzi Visual Basic: Innym sposobem którego ja używam jest uruchomienie rejestracji makra z poziomu paska narzędzi Visual Basic. Pasek ten przedstawiłem na stronie pasek narzędzi Visual Basic. W pasku tym znajduje się na między innymi przycisk Zarejestruj makro pozwala on na zarejestrowanie (nagranie, utworzenie) nowego makra. 1. Z menu Widok wybierz Paski narzędzi a następnie opcje Visual Basic, (jeżeli pasek nie jest widoczny). 2. Z paska narzędzi Visual Basic wybierz przycisk Zarejestruj makro. 3. Powinno się otworzyć okno Rejestruj makro w oknie tym ustaw odpowiednie opcje. 4. Wykonaj pozostałe czynności jak w sposobie opisanym powyżej. 5. Aby zakończyć rejestrowanie makra kliknij na przycisk Zatrzymaj rejestrowanie, który znajduje się w miejscu przycisku Zarejestruj makro w pasku narzędzi Visual Basic. Uwaga: Aby zatrzymać rejestrowanie makra możemy użyć przycisku Zatrzymaj rejestrowanie zarówno z paska narzędzi Visual Basic lub jak w pierwszym sposobie z paska Zatrzymaj rejestrowanie.
Uruchamianie makra: Utworzyliśmy makro które czyści zawartość określonych komórek arkusza, aby zarejestrowane czynności mogły być automatycznie wykonane nasze makro należy uruchomić. Zarejestrowane makra można uruchomić na wiele sposobów. Do uruchomienia makra możemy wykorzystać odpowiednie paski narzędzi różnego rodzaju obiekty czy zdarzenia lub też inne makro. Sposób uruchamiania zależy od wiedzy i inwencji autora makra oraz konkretnych potrzeb. Poniżej przedstawiam niektóre sposoby uruchamiania makra. 4
Tradycyjny start: 1. Z menu Narzędzia wybierz Makro a następnie kliknij na polecenie Makra... (lub wciśnij Alt+F8). 2. W nowo otwartym oknie dialogowym Makro (patrz rysunek poniżej) zaznacz odpowiednią nazwę makra (w naszym przypadku: Czyszczenie) i kliknij na przycisk Uruchom. Zostanie uruchomione makro które wykona wszystkie czynności jakie wykonywaliśmy podczas jego rejestracji.
Za pomocą okna dialogowego Makro po kliknięciu na odpowiedni przycisk możemy wykonywać różne czynności związane z makrem. Jeżeli chcemy na przykład przeglądać lub modyfikować kod makra, klikamy na przycisk Edycja.
Za pomocą paska narzędzi Visual Basic: 1. Z menu Widok wybierz Paski narzędzi a następnie opcje Visual Basic, (jeżeli pasek nie jest widoczny). 2. Z paska narzędzi Visual Basic wybierz przycisk Uruchom makro. 3. W nowo otwartym oknie dialogowym Makro zaznacz odpowiednią nazwę makra (czyli: Czyszczenie) i kliknij na przycisk Uruchom.
Za pomocą obiektu graficznego: Jak już wspomniałem makra możemy uruchamiać na wiele sposobów, możemy w tym celu wykorzystać też różnego rodzaju obiekty graficzne. Poniżej przedstawiam sposób uruchomienia makra za pomocą obiektu WordArt. 1. Z menu Wstaw wybierz Obraz (Rysunek) a następnie opcje WordArt.... 2. W oknie Galeria WordArt wybierz odpowiedni styl i naciśnij OK. 3. W następnym oknie Edytuj WordArt w polu Tekst: wpisz na przykład: WYCZYŚĆ i naciśnij przycisk OK. 4. Dopasuj jeszcze rozmiar i położenie obiektu WordArt. 5. Umieść kursor myszy na naszym tekście (obiekcie WordArt) następnie kliknij prawym przyciskiem myszy i menu podręcznego wybierz Przypisz makro.... 5
6. W nowo otwartym oknie dialogowym Przypisz makro zaznacz odpowiednią nazwę makra (w naszym przypadku: Czyszczenie) i kliknij na przycisk OK.
7. Kliknij lewym przyciskiem myszy na obiekt WordArt celem uruchomienia makra. Jeżeli w oknie dialogowym Przypisz makro klikniemy na przycisk Edycja możemy również przeglądać i modyfikować kod makra.
Aby przetestować nasz przykład zarejestruj makro, wprowadź jakieś wartości do komórek arkusza które makro będzie czyściło a następnie wykorzystując odpowiedni sposób uruchom makro. Spróbuj też samodzielnie zarejestrować i uruchomić kilka innych makr.
Pora na samodzielne napisanie pierwszego programu w VBA. W przykładzie po naciśnięciu na Przycisk polecenia wyświetlany będzie napis w komórce arkusza Excela. Za pomocą tego przykładu zapoznam Was wstępnie ze środowiskiem VBA, w następnych stronach przedstawię opis tego środowiska i jak z niego korzystać. Przykład jest prosty i postępując zgodnie punktami powinno się go z powodzeniem wykonać. Jak to jest w zwyczaju w pierwszym stworzonym przez nas programie powitamy świat.
Kod pierwszego programu: Private Sub CommandButton1_Click() Range("A1").Value = "WITAJ ŚWIECIE, WŁAŚNIE NARODZIŁ SIĘ NOWY PROGRAMISTA" End Sub
Kroki: • • • •
Uruchom Microsoft Excel. Z menu Widok wybieramy Paski narzędzi a następnie Przybornik formantów (jeżeli nie jest widoczny). W Przyborniku formantów wyszukaj i kliknij na ikonę Przycisk polecenia a następnie miejsce w arkuszu gdzie chcesz go umieścić. Ikona Tryb projektowania w przyborniku powinna się uaktywnić. Kliknij dwa razy lewym przyciskiem myszy na wstawiony przycisk (ikona Tryb projektowania w przyborniku powinna być aktywna). Powinien uruchomić się Edytor Visual Basic z widocznym 6
•
oknem Kod programu (Code), w oknie tym zawarta powinna być deklaracja procedury Click naszego Przycisku polecenia. W procedurze zdarzenia Click Przycisku polecenia wpisz kod:
Range("A1").Value = "WITAJ ŚWIECIE, WŁAŚNIE NARODZIŁ SIĘ NOWY PROGRAMISTA" •
Cały kod przykładu powinien mniej więcej wyglądać jak na rysunku poniżej (jeżeli posiadasz np. wersje Excela 97 menu Edytor Visual Basic może być w języku polskim):
• •
Pozamykaj wszystkie okienka, zapisz i zamknij dokument. Po ponownym otwarciu (z opcjo Włącz makra) kliknij na nasz Przycisk polecenia i przetestuj działanie przykładu. Celem ponownego przetestowania, usuń zawartość komórki A1 arkusza i ponownie kliknij na przycisk.
•
Objaśnienia linii kodu: •
•
•
Private Sub CommandButton1_Click() - deklarowana jest procedura w której słowo Private oznacza że dana zmienna widoczna jest tylko w danym module. Zaś Sub to słowo kluczowe Visual Basic określające, że dany blok to procedura. Procedura ta będzie wykonywana przy zaistnieniu zdarzenia Click (kliknięcie) naszego Przycisku polecenia CommandButton1. Inaczej mówiąc jeżeli użytkownik kliknie na Przycisk polecenia CommandButton1, zostaną wykonane instrukcje zawarte poniżej aż do słów End Sub, które wskazują koniec bloku kodu. Range("A1").Value = "WITAJ ŚWIECIE, WŁAŚNIE NARODZIŁ SIĘ NOWY PROGRAMISTA" w tej linii kodu określamy zawartość (wartość) komórki A1 arkusza czyli wstawiamy do niej nasz tekst powitania. End Sub - to słowo kluczowe Visual Basic wskazujące koniec bloku kodu.
Słownictwo: •
•
•
moduł - jest to zbiór deklaracji, instrukcji, procedur przechowywanych razem jako całość i opatrzonych jedną nazwą. Są dwa rodzaje modułów, najczęściej stosowanym jest moduł standardowy, w którym umieszcza się kod zwykłych procedur. Drugi rodzaj to moduł klasy, który służy do definiowania obiektów. procedura - jest to najmniejsza część kodu którą można uruchomić niezależnie od innych części kodu, procedura jest to sekwencja deklaracji i instrukcji w module wykonywana jako jedna całość. Procedury w języku Visual Basic obejmują procedury Sub i procedury Function. zdarzenie - akcja rozpoznawana przez obiekt (taka jak kliknięcie myszą czy naciśnięcie klawisza), dla której można zdefiniować odpowiedź. Zdarzenie może być spowodowane działaniem 7
•
użytkownika, poleceniem języka Visual Basic lub działaniami systemu. Korzystając z właściwości skojarzonych ze zdarzeniami można ustalić, aby odpowiedzią na zdarzenie było uruchomienie makra, wywołanie funkcji języka Visual Basic lub uruchomienie procedury zdarzenia. zmienna - miejsce o określonej nazwie służące do przechowywania danych. Zmienna zawiera dane, które można modyfikować podczas wykonywania programu. Każda zmienna ma nazwę jednoznacznie ją identyfikującą w obrębie danego poziomu zakresu.
Na tej stronie przedstawiam Edytor Visual Basic - środowisko, w którym można edytować zarejestrowane makra oraz pisać nowe makra i programy w języku Visual Basic for Application. Jest to praktycznie właściwy warsztat naszej pracy w którym będziemy pisać kody programów (jeżeli posiadasz np. wersję Excela 97 menu Edytor Visual Basic powinno być w języku polskim). Aby uruchomić Edytor Visual Basic możemy użyć kilku sposobów: • • •
Z menu Narzędzia dokumentu Excela wybieramy opcję Makro a następnie Edytor Visual Basic. Będąc w arkuszu Excela możemy użyć kombinacji klawiszy skrótu Alt+F11. Jeżeli mamy widoczny pasek narzędzi Visual Basic (opisałem go wcześniej) wybieramy z niego przycisk Edytor Visual Basic.
Na rysunku poniżej przedstawiam nasz edytor z rozmieszczonymi kilkoma oknami - opiszę je w dalszej części strony.
Aby zamknąć Edytor Visual Basic możemy też użyć kilku sposobów: •
Z menu File edytora wybieramy polecenie Close and Return to Microsoft Excel. 8
• •
Możemy użyć kombinacji klawiszy skrótu Alt+Q. Możemy zamknąć Edytor tak jak zamykamy każde okno.
Okno Project: Okno Project (Eksplorator projektów) wyglądem i działaniem przypomina Explorator Windows. Wyświetla hierarchiczny spis wszystkich elementów projektu, okno to służy do poruszania się pomiędzy elementami projektu. Aby w Edytorze Visual Basic otworzyć zamknięte okno Project: • • •
Z menu View wybieramy opcję Project Explorer. Możemy użyć kombinacji klawiszy skrótu Ctr+R. Kliknij ikonę Project Explorer na pasku narzędzi (pasek standard).
Górna część okna zawiera trzy jakby przyciski: • • •
View Code - otwiera moduł kodu zaznaczonego w oknie obiektu. View Obiect - możemy użyć tego przycisku aby otworzyć zaznaczony w oknie obiekt na przykład:
formularz lub powrócić do arkusza Excela jeżeli jest on zaznaczony (jak na rysunku powyżej). Toggle Folders - ukrywa lub pokazuje foldery obiektów przy czym stale widoczne są zawarte w nich poszczególne elementy. Jeżeli usuniemy foldery, obiekty wyświetlane będą w porządku alfabetycznym.
Okno Properties: Okno Properties (Właściwości) - wyświetla właściwości opisujące zaznaczony (aktywny) obiekt, oczywiście wartości tych właściwości można zmieniać modyfikując w ten sposób zaznaczony obiekt. Aby w edytorze wyświetlić okno Properties: • • •
Naciśnij klawisz F4. Z menu View wybieramy opcję Properties Window. Kliknij przycisk Properties Window na pasku narzędzi (standard).
9
W górnej części okna znajduje się lista rozwijana. Lista ta daje nam możliwość wyboru obiektu (po kliknięciu na strzałkę), którego właściwości chcemy wyświetlić. Poniżej znajdują się dwie karty właściwości za pomocą których możemy wyświetlić właściwości obiektu alfabetycznie lub według kategorii. Lewa kolumna każdej z kart (patrząc od strony użytkownika) jest zbiorem nazw parametrów określającym nasz element, zaś prawa strona to wielkości i właściwości tych parametrów.
Okno Code: Okno Code (Kod programu) - służy do wpisywania kodu programu w języku Visual Basic, jak również do przeglądania i edycji programu. Okno to będzie chyba najczęściej przez nas używane. Możemy otworzyć tyle okien kodu programu ile program ma modułów. Aby w edytorze otworzyć okno kodu programu, w oknie Project kliknij dwukrotnie lewym przyciskiem myszy odpowiedni obiekt. Innym sposobem jest zaznaczenie odpowiedniego obiektu w oknie Project a następnie: • • • •
Z menu View wybierz pozycję Code. Naciśnij klawisz F7. kliknij ikonę View Code w oknie Project. Kliknij obiekt prawym przyciskiem myszy i z menu kontekstowego wybierz pozycję View Code.
10
W górnej części okna możemy wyróżnić dwa elementy: •
•
Pole (lista rozwijana) Obiect - znajduje się z lewej (patrząc od strony użytkownika) części okna i pokazuje listę (po kliknięciu na strzałkę) związanych obiektów. Jeżeli z listy rozwijanej Obiect wybierzesz nazwę obiektu , VBA utworzy szablon domyślnej procedury tego obiektu. Pole (lista rozwijana) Procedure - prawa część okna, pokazuje listę możliwych zdarzeń związanych z zaznaczonym obiektem w polu Obiect.
Należy wspomnieć jeszcze o dwóch przyciskach umieszczonych w lewej dolnej części okna. Przycisk Procedure View, który wyświetla tylko wybraną procedurę. Drugi przycisk Full Module View wyświetla całość kodu modułu.
Miedzy opisanymi wyżej oknami możemy przedstawić kilka zależności: • • •
Jeżeli zmienimy zaznaczenie w oknie Project, w oknie Properties nastąpi analogiczna zmiana. Gdy w oknie Project klikniemy dwukrotnie lewym przyciskiem myszy na określony obiekt, otworzy się okno Code (moduł kodu) danego obiektu. Gdy mamy otwartych kilka okien Code, przy przechodzeniu z jednego okna Code w inne analogiczna zmiana nastąpi w Oknie Project jak i w oknie Properties.
Po zapoznaniu się z Edytorem Visual Basic możemy zająć się tworzeniem programu. Na tej stronie przedstawię z jakich podstawowych części składa się program VBA.
Program VBA złożony jest z instrukcji (rozkazów), które w procesie kompilacji przetwarzane są na kod wykonywalny zrozumiały dla procesora. Instrukcje te wykonywane są w określonym porządku zdefiniowanym przez programistę. Pojedynczą instrukcje możemy nazwać zdaniem języka VBA. Oczywiście zdanie takie musi być odpowiednio zbudowane, ale o tym w dalszej części kursu. Informacyjnie tylko podam że instrukcja może zawierać słowa kluczowe, wyrażenia, stałe, operatory oraz zmienne. Pojedyncza instrukcja może np. zadeklarować zmienną, ustawić wartość lub wykonać określoną operację.
Instrukcje programu zorganizowane są w procedury, moduły i projekty.
11
•
•
•
Procedura jest bardzo ważną częścią programu, ponieważ aby kod mógł być wykonany należy umieścić go w procedurze. Jest to najmniejsza część kodu którą można uruchomić niezależnie od innych części kodu. Procedura składa się z przynajmniej jednej instrukcji umieszczonej między dwiema specjalnymi instrukcjami: z których pierwsza z nich deklaruje procedurę a ostatnia ją zamyka. Więcej informacji na temat procedur znajdziesz na stronie Procedury. Moduł zawiera z jedną lub więcej procedur oraz sekcje deklaracji w której umieszczamy instrukcje wspólne dla w wszystkich procedur tego modułu. Możemy wyróżnić dwa rodzaje modułów: moduł standardowy i moduł klasy. Projekt obejmuje wszystkie moduły, formularze, obiekty aplikacji macierzystej dokumentu oraz sam dokument.
Programy VBA mogą być bardzo skomplikowane, mogą zawierać wiele instrukcji i procedur rozmieszczonych w rożnych modułach a nawet projektach. My na razie nie będziemy tworzyć tak skomplikowanych programów.Najprostszy program składa się z jednej procedury w której jest jedna instrukcja, procedura ta umieszczona jest w module co daje nam już cały projekt. Poniżej przedstawiam kod takiego programu, składa się on z jednej procedury o nazwie Powitanie, w której umieszczona jest jedna instrukcja. Instrukcja ta wyświetla okienko komunikatu i z napisem: Witam i życzę miłej zabawy. Sub Powitanie() MsgBox "Witam i życzę miłej zabawy" End Sub
Jak już wspomniałem procedury zorganizowane są w modułach. Aby umieścić kod przykładu w module wykonaj następujące czynności: • • • •
•
•
Uruchamiamy Microsoft Excel. Z menu Widok wybieramy Paski narzędzi a następnie opcje Visual Basic (jeżeli pasek nie jest widoczny). Z paska narzędzi Visual Basic wybieramy przycisk Edytor Visual Basic. W nowo otwartym oknie Microsoft Visual Basic-Zeszyt1 z menu View (Widok) wybieramy opcję ProjectExplorer (Eksploator projektu). Powinno się otworzyć okno Project-VBAProject (ProjektVBAProject) oczywiście punktu tego nie wykonujemy, jeżeli okienko było wcześniej otwarte. Następnie z menu Insert (Wstaw) wybieramy opcję Module (Moduł). Wstawiony obiekt Module1 (Moduł1) powinien się pojawić oknie Project-VBAProject. Powinno się też pojawić okno Zeszyt1Module1(Code) (Zeszyt1-Moduł1(Kod programu)). Jeżeli okno się nie pojawi aby je uaktywnić w oknie Project-VBAProject klikamy dwa razy lewym przyciskiem myszy na obiekt Module1 (Moduł1). W nowo otwartym oknie Zeszyt1-Module1(Code) (Zeszyt1-Moduł1(Kod programu)) piszemy (wstawiamy) kod z przykładu. Całość powinna wyglądać podobnie jak na rysunku poniżej.
12
Jest wiele sposobów uruchomienia kodu programu zależy to od pewnych warunków na przykład w jakiego typu procedurze czy module umieszczone są nasze instrukcje. Ponieważ nasza procedura jest podprogramem bez parametrów możemy potraktować ją jak makro i wykorzystać przycisk z paska narzędzi Formularze. Aby tego dokonać wykonaj następujące czynności. • • • •
•
•
Zamykamy Edytor VisualBasic (Alt+Q) i powracamy do Microsoft Excel. Z menu Widok dokumentu Excela wybieramy Paski narzędzi a następnie opcję Formularze. Z paska narzędzi Formularze wybieramy ikonę Przycisk a następnie miejsce w arkuszu gdzie chcemy go umieścić. Powinno się otworzyć okno Przypisz makro, (jeżeli okno się nie otworzy klikamy prawym przyciskiem myszy na nasz wstawiony przycisk i wybieramy opcję Przypisz makro...). W oknie tym zaznaczamy nazwę Powitanie i klikamy przycisk OK. Kliknij na jakieś miejsce w arkuszu (celem zlikwidowania zaznaczenia przycisku) a następnie na przycisk (Przycisk 1) i przetestuj działanie przykładu.
Uwaga: - w dalszych częściach kursu często będę stosował procedury zdarzenia. Procedury tego typu są automatycznie wykonywane przy zaistnieniu pewnego zdarzenia związanego z określonym obiektem np. formantem z Przybornika formantów.
Dla dociekliwych: A oto bardziej rozbudowany kod tej samej procedury Powitanie. W przykładzie oprócz wyświetlenia napisu powitania, wyświetlana jest bieżąca data pobierana z systemu Twojego komputera. Sub Powitanie() Dim MojaData MojaData = Format(Date, "Long Date") MsgBox "Witam dziś mamy " & MojaData & ". Pozdrawiam i życzę miłej zabawy." End Sub
Przechodzimy do następnej części kursu w której zapoznamy się procedurami. Być może nie jest to zbyt ciekawy temat ale znając zasady pisania procedur łatwiej nam będzie zrozumieć i pisać programy VBA. •
Procedura - jest to najmniejsza część kodu która posiada własną nazwę, jest to też najmniejsza część
kodu którą można uruchomić niezależnie od innych części kodu. Procedura jest bardzo ważną częścią programu aby kod mógł działać należy umieścić go w procedurze. Przypomnij sobie poprzednie strony w których kody przykładów umieszczane były właśnie w procedurach. Procedura 13
składa się z instrukcji deklarującej procedurę, linii kodu wykonywanych wewnątrz procedury oraz instrukcji zamykającej.
Typy procedur: Najogólniej procedury możemy podzielić na dwa typy tj. podprogramy i funkcje. •
•
Podprogram - jest to podstawowy typ procedur języka VBA. Procedurę deklarujemy za pomocą słowa kluczowego Sub, instrukcja End Sub zamyka procedurę. Instrukcja deklarująca procedurę kończy się parą nawiasów - można w niej umieszczać parametry podprogramu. Jest to typ procedury, który można uruchomić niezależnie od innych procedur. Procedury tego typu wykonują akcje, lecz nie zwracają wartości. Podprogram może wywołać inną procedurę. Funkcja - procedura deklarowana za pomocą słowa kluczowego Function, instrukcja End Function kończy procedurę. Funkcja może pobierać argumenty które są do niej przekazywane np. przez procedurę wywołującą. Procedura Function jest podobna do procedury Sub, jednak w przeciwieństwie do podprogramu zwraca wartość np. do procedury która ją wywołała.
Strona ta ogólnie omawia procedury, ale aby obraz był pełniejszy jeszcze kilka informacji chciałbym przekazać. •
• •
Innym typem procedury którym na razie nie będziemy się zajmować jest Procedura właściwości, deklarujemy ją za pomocą słowa kluczowego Property i służy do modyfikowania lub odczytania wartości właściwości. Pracując w Excelu mamy możliwość nagrywania makr, powinniśmy wiedzieć że Makro jest podprogramem z tym że bez parametrów. W naszych przykładach często będziemy stosować też Procedurę zdarzenia. Składnia procedury zdarzenia jest podobna do podprogramu czyli procedury zadeklarowanej za pomocą słowa kluczowego Sub.
Przykład podprogramu: Poniżej przedstawiam przykład prostego podprogramu. Procedura ta wykonuje tylko jedną czynność, wyświetla okienko komunikatu z informacją aby użytkownik wprowadził wartość numeryczną większą od zera. Sub BłędnaWartość() MsgBox "Wprowadź wartość numeryczną większą od zera" End Sub
Wywołanie podprogramu: Jest wiele sposobów uruchomienia podprogramu, poniżej przedstawiam kilka z nich. •
•
•
Podprogram można wywołać (uruchomić) z innego podprogramu. Aby wywołać podprogram z innego podprogramu należy w procedurze wywołującej wpisać instrukcję zawierającą jego nazwę. Sposób ten wykorzystałem w dalszej części strony w przykładzie z punku strony "Dla dociekliwych". Jeżeli podprogram przez nas napisany nie posiada parametrów możemy wywołać go tak jak uruchamia się makro. Będąc w arkuszu Excela naciskamy kombinacje klawiszy Alt + F8, w nowo otwartym oknie wybieramy nazwę odpowiedniej procedury a następnie przycisk Uruchom. Możemy odpowiednią procedurę (bez parametrów) przypisać do Przycisku z paska narzędzi Formularze. Sposób ten opisany jest na stronie Instrukcja For... Next. 14
Przykład funkcji: Przykład funkcji jest również bardzo prosty. Nasza funkcja oblicza pole kwadratu w którym długość boku kwadratu określona jest przez parametr bok. Jak już wspomniałem funkcja zwraca pewną wartość. Aby funkcja mogła zwrócić wartość, wewnątrz funkcji wartość ta musi zostać przypisana do nazwy tej funkcji. W przykładzie poniżej do nazwy funkcji PoleKwadratu przypisujemy wartość jako daje nam wynik mnożenia parametru bok. Oczywiście wartość zwróconą przez funkcje możemy wykorzystać w instrukcjach np. w procedurze wywołującej. Function PoleKwadratu(bok) PoleKwadratu = bok * bok End Function
Wywołanie funkcji: Funkcje można wywołać (uruchomić) z podprogramu. Aby wywołać funkcje z podprogramu w procedurze wywołującej do zmiennej przypisujemy nazwę funkcji, oczywiście w nawiasach podajemy też potrzebne argumenty. Jak wiemy funkcja zwraca wartość dlatego poprzez przypisanie w procedurze wywołującej nazwy funkcji do zmiennej to do tej zmiennej przypisujemy wartość zwracaną przez podaną funkcje. Za pomocą tego sposobu wywołałem funkcje w punkcie strony "Dla dociekliwych". Innym sposobem wywołania funkcji jest uruchomienie jej z poziomu arkusza Excela, poprzez wstawienie funkcji do komórki arkusza. Funkcje przez nas napisaną (umieszczoną w module standardowym) wstawiamy do arkusza tak samo jak każdą funkcje wbudowaną. Załóżmy ze chcemy wstawić przedstawioną wcześniej funkcję PoleKwadratu. • • •
•
•
•
Zaznaczamy dowolną komórkę Arkusza Excela np. H12. Z Menu Wstaw wybieramy opcje Funkcja. W nowo otwartym oknie z pola Kategoria funkcji: wybieramy kategorie Użytkownika, następnie z pola Nazwa funkcji: nazwę naszej funkcji PoleKwadratu i naciskamy OK (nazwy pól w tym oknie mogą być trochę inne od podanych, zależy to jaką wersję Excela posiadasz). W następnym oknie wpisujemy argumenty funkcji, możesz tam wpisać odpowiednie wartości lub nazwę komórki z której wartości mają być pobierane np. jako argument wpisujemy B12, naciskamy przycisk OK. Jeżeli jako argument podałeś adres komórki, wpisz przykładowe wartości do komórki B12 i przetestuj działanie funkcji.
Uwaga - Na tej stronie często używam pojęć parametr i argument. Parametr pełni role zmiennej i jest rozpoznawany wewnątrz procedury. Parametry procedury podajemy deklarując procedurę. Umieszczamy je w nawiasach po nazwie procedury. Jeżeli procedura posiada kilka parametrów oddzielamy je przecinkiem. Argument zaś jest to wartość jaka przekazujemy do parametru danej procedury. Argumenty podajemy np. w instrukcji wywołującej procedurę. W instrukcji wywołującej procedurę po nazwie procedury podajemy odpowiednie argumenty umieszczamy je w nawiasach i oddzielając przecinkiem
Dla dociekliwych: Dla dociekliwych przedstawiam procedurę (podprogram) ObliczPole. Procedura ta jest przykładem wywołania podprogramu i funkcji. 15
Opis przykładu: W przykładzie obliczamy pole kwadratu. Po uruchomieniu procedury wyświetlane jest okienko dialogowe w które możemy wpisać jakieś wartości. W pierwszej kolejności sprawdzamy czy wartość wprowadzona jest wartością numeryczną. Jeżeli nie jest to wartość numeryczna np. litera uruchomiana jest procedura BłędnaWartość, która wyświetla okienko komunikatu z informacją aby użytkownik wprowadził wartość numeryczną większą od zera. Jeżeli jest to wartość numeryczna np. liczba sprawdzamy czy wartość ta jest większa od zera. Jeżeli wartość wprowadzona jest wartością numeryczna większa od zera uruchomiana jest funkcja PoleKwadratu. Jeżeli wartość wpisana jest np. liczbą ujemną również uruchomiana jest procedura BłędnaWartość. Przy okazji przykładu mamy pierwszy kontakt z komentarzem umieszczonym w kodzie programu (kolor zielony). Temat komentarzy przedstawię w dalszych częściach kursu. Kod przykładu: Sub ObliczPole() Dim wartość, pole wartość = InputBox("Podaj długość boku kwadratu do obliczenia pola powierzchni") If IsNumeric(wartość) = True Then If wartość > 0 Then pole = PoleKwadratu(wartość) ' wywołujemy funkcje PoleKwadratu. MsgBox "Pole kwadratu wynosi " & pole Else BłędnaWartość ' wywołujemy podprogram BłędnaWartość. End If Else BłędnaWartość ' wywołujemy podprogram BłędnaWartość. End If End Sub
kroki: Aby wykonać przykład wstaw w module standartowym kody z wszystkich przykładów na tej stronie. Dla
zasady przedstawiam kroki do wykonania. • • • •
• • • •
Uruchom Microsoft Excel. Z menu Widok wybieramy Paski narzędzi a następnie opcje Visual Basic, (jeżeli pasek nie jest widoczny). Z paska narzędzi Visual Basic wybieramy przycisk Edytor Visual Basic. W nowo otwartym oknie Microsoft Visual Basic-Zeszyt1 z menu Insert (Wstaw) wybieramy opcję Module (Moduł). Powinno się pojawić okno Zeszyt1-Module1(Code) (Zeszyt1-Moduł1(Kod programu)). W nowo otwartym oknie Zeszyt1-Module1(Code) (Zeszyt1-Moduł1(Kod programu)) piszemy (wstawiamy) kolejną kody z wszystkich przykładów na stronie. Zamykamy Edytor VisualBasic (Alt+Q) i powracamy do Microsoft Excel. Będąc w arkuszu Excela naciskamy kombinacje klawiszy Alt + F8, w nowo otwartym oknie wybieramy nazwę ObliczPole a następnie przycisk Uruchom. Powinna się pojawić okienko dialogowe. Wpisz w nim przykładowo wartość i przetestuj działanie przykładu.
Informacje dodatkowe: Procedury zdarzenia: 16
Jak już wspomniałem w czasie tego kursu do przetestowania przykładów często będziemy stosować Procedurę zdarzenia. Procedura taka wykonywana jest automatycznie przy zaistnieniu określonego zdarzenia związanego z konkretnym obiektem. Więcej informacji na temat Procedury zdarzenia znajdziesz w dalszej części kursu na stronie Zdarzenia. Informacyjnie tylko podam że w składni procedury zdarzenia słowo Private oznacza, że procedura ta może być dostępna tylko dla procedur umieszczonych w tym samym module.
Zakres procedury: Zakres określa w których częściach programu procedura jest widoczna i z jakich części programu można ją wywołać. Temat zakresu omówię w dalszej części kursu po omówieniu tematu Modułu. Nadmienię tylko że standardową procedura VBA posiada zakres publiczny (z wyjątkiem procedury zdarzenia). Zakres publiczny określa to że procedurę można wywołać (uruchomić) z dowolnej części programu.
Słownictwo: • • •
•
•
argument - stała, zmienna lub wyrażenie przekazywane do procedury. komentarz - dodany do kodu programu tekst, wyjaśniający sposób działania kodu programu. parametr - nazwa zmiennej, pod którą argument przekazywany do pewnej procedury jest w tej procedurze rozpoznawany. Zmienna otrzymuje przekazywany do procedury argument, a jej zakres działania kończy się wraz z końcem procedury. właściwość - opatrzony nazwą atrybut obiektu. Właściwości definiują takie cechy obiektu, jak np. rozmiar, kolor i położenie na ekranie, a także stan obiektu, na przykład to, czy jest on aktywny czy nieaktywny. Właściwości możemy określać (zmieniać) w oknie właściwości lub za pomącą języka Visual Basic. zmienna - opatrzone nazwą miejsce w pamięci do przechowywania danych, które mogą ulegać modyfikacjom w trakcie wykonywania programu. Każda zmienna zaopatrzona jest w unikatową nazwę, która identyfikuje ją w obrębie danego zakresu.
Naukę języka VBA rozpocznę od przedstawienia instrukcji If... Then... Else. Jest to instrukcja bardzo pospolita (prawdopodobnie najczęściej stosowana instrukcja warunkowa), dlatego też często nie zdajemy sobie sprawy z jej ważności. Instrukcja If... Then... Else warunkowo wykonuje blok instrukcji: jeśli pewien warunek jest spełniony (ma wartość True), należy wykonać pewien zestaw poleceń, w przeciwnym zaś przypadku gdy warunek jest fałszywy (ma wartość False) program powinien wykonać inny blok poleceń. Instrukcja ta ma wiele postaci, poniżej przedstawiam podstawową jej formę.
Składnia: If warunek Then [blok kodu wykonywany w przypadku gdy warunek jest spełniony] Else [blok kodu wykonywany w przypadku gdy warunek nie jest spełniony] End If
Objaśnienie: • •
If oraz Then - to słowa kluczowe języka VBA będące swego rodzaju nawiasami warunku. warunek - jest wyrażeniem logicznym lub zmienną dającą wartość True (prawda) lub False
(fałsz). 17
•
Else - słowo kluczowe wstawiane pomiędzy ostatnią instrukcją, która ma być wykonana jeżeli
•
warunek jest prawdziwy oraz pierwszą instrukcją, która ma być wykonana jeżeli warunek jest fałszywy. End If - to słowa kluczowe zaznaczające koniec bloku instrukcji If... Then... Else.
W najprostszy sposób naszą instrukcje możemy przetłumaczyć: Jeżeli coś jest prawdą to wykonaj pewne czynności jeżeli nie to wykonaj inne czynności.
Przykład kod przykładu: Private Sub CommandButton1_Click() If Range("A1").Value = 0 Then Range("A2").Value = "wartość wynosi zero" Else Range("A2").Value = "wartość jest różna od zera" End If End Sub
Przykład opis przykładu: W powyższym przykładzie jeżeli wartość komórki A1 arkusza wynosi 0 (zero), w komórce A2 wyświetlany jest napis: wartość wynosi zero. W przeciwnym przypadku w komórce A2 wyświetlany jest napis: wartość jest różna od zera. Zaznaczam, że przykład powstał dla zobrazowania działania instrukcji If... Then... Else i nie posiada np. obsługi błędów. Dlatego dla zagwarantowania prawidłowego działania przykładu w komórce A1 powinny znajdować się wartości numeryczne. Celem przetestowania przykładu wykonaj następujące czynności: • • • •
•
Uruchom Microsoft Excel. Z menu Widok wybieramy Paski narzędzi a następnie Przybornik formantów (jeżeli nie jest widoczny). W Przyborniku formantów wyszukaj i kliknij na ikonę Przycisk polecenia a następnie miejsce w arkuszu gdzie chcesz go umieścić. Ikona Tryb projektowania w przyborniku powinna się uaktywnić. Kliknij dwa razy lewym przyciskiem myszy na wstawiony przycisk (ikona Tryb projektowania w przyborniku powinna być aktywna). Powinien uruchomić się Edytor Visual Basic z widocznym oknem Kod programu (Code), w oknie tym zawarta powinna być deklaracja procedury Click naszego Przycisku polecenia. W procedurze zdarzenia Click Przycisku polecenia wpisz kod:
If Range("A1").Value = 0 Then Range("A2").Value = "wartość wynosi zero" Else Range("A2").Value = "wartość jest różna od zera" End If • • • •
Zamknij Edytor Visual Basic Alt+Q i powróć do arkusza Excela. Następnie wyłącz tryb projektowania (jeżeli jest aktywny) klikając na ikonę Zakończ tryb projektowania w Przyborniku formantów. Wpisz wartość 0 (zero) do komórki A1 arkusza następnie kliknij na Przycisk polecenia. Celem ponownego przetestowania, wpisz inną wartość numeryczną do komórki A1 arkusza i ponownie kliknij na przycisk.
Dla dociekliwych: 18
Dla dociekliwych przedstawiam bardziej rozbudowany kod przykładu w którym umieściliśmy jedną instrukcję warunkową If... Then... Else w drugiej celem dokładniejszego określenia warunków. Przy okazji chciałem pokazać że możemy osiągać ciekawe (bardziej złożone) efekty wykorzystując kilka prostych instrukcji. Private Sub CommandButton1_Click() If Range("A1").Value = 0 Then Range("A2").Value = "wartość wynosi zero" Else If Range("A1").Value > 0 Then Range("A2").Value = "wartość dodatnia" Else Range("A2").Value = "wartość ujemna" End If End If End Sub •
UWAGA: do komórki A1 w obydwu przykładach powinniśmy wpisywać wartości numeryczne. Jeżeli
wpiszemy inną wartość jak numeryczną program wykaże błąd: Niezgodność typów lub może działać nieprawidłowo (w zależności jaką wersję Excela posiadasz). Jak omijać podobne błędy opisze w dalszej części kursu.
Słownictwo: • •
•
instrukcja - jest to najmniejsza część kodu, poprawna ze względu na składnię całość wyrażająca jeden określony rodzaj operacji, deklaracji lub definicji. słowo kluczowe - słowo, które jest elementem języka programowania Visual Basic for Applications. Do słów kluczowych zaliczają się nazwy instrukcji, typy danych, metody, operatory, obiekty i predefiniowane funkcje. Słów kluczowych nie należy używać jako nazw zmiennych i obiektów. zmienna - miejsce o określonej nazwie służące do przechowywania danych. Zmienna zawiera dane, które można modyfikować podczas wykonywania programu. Każda zmienna ma nazwę jednoznacznie ją identyfikującą w obrębie danego poziomu zakresu.
Inna drogą realizacji procesu podjęcia decyzji w programie jest użycie instrukcji (struktury) Select Case.Instrukcja Select Case ocenia wyrażenie tylko raz i w zależności od jego wartości, wykonuje zadany blok instrukcji. Każda instrukcja Case struktury Select Case określa jedną z potencjalnych wartości, którą może zwrócić wyrażenie. Gdy wartość wyrażenia pasuje do wartości określonej przez instrukcje Case wykonywany jest kod związany z tą instrukcją Case. Jeżeli wartość wyrażenia nie pasuje do żadnej wartości określonej przez instrukcje Case wtedy wykonywany jest blok kodu związany z instrukcją Case Else. Struktura Select Case może zawierać wiele instrukcji Case ale może zawierać tylko jedną instrukcje Case Else. Instrukcja Case Else nie jest obowiązkowa w bloku instrukcji Select Case ale jeżeli jest to powinna się znajdować za wszystkimi instrukcjami Case. Struktura Select Case może przybierać różne formy i być bardzo rozbudowana, poniżej przedstawiam jej podstawową formę.
Składnia: Select Case Wyrażenie Case Wartość1 [blok kodu wykonywany, jeżeli Wyrażenie równa się Wartość1] Case Wartość2 [blok kodu wykonywany, jeżeli Wyrażenie równa się Wartość2] ... Case Else
19
[blok kodu wykonywany, jeżeli Wyrażenie nie równa się żadnej z wartości określonej przez instrukcje Case] End Select
Objaśnienie: • • • • •
Select Case - instrukcja ta występuje jako pierwsza określa ona wartość która będzie testowana na
równość możliwym wartościom. Wyrażenie - to jest to co testujemy może to być dowolne wyrażenie numeryczne lub wyrażenie tekstowe. Case - określa wartość do której próbujemy dopasować wartość testowaną. Case Else - poniżej tej linii kodu wykonywane są instrukcje jeżeli wartość testowana nie pasuje do żadnej z wartości określonej przez instrukcje Case. End Select - kończy blok instrukcji Select Case.
Przykład kod przykładu: Private Sub CommandButton1_Click() Dim NumerDnia NumerDnia = Range("A1").Value If IsNumeric(NumerDnia) = True Then Select Case NumerDnia Case 1 Range("A2").Value = "Niedziela" Case 2 Range("A2").Value = "Poniedziałek" Case 3 Range("A2").Value = "Wtorek" Case 4 Range("A2").Value = "Środa" Case 5 Range("A2").Value = "Czwartek" Case 6 Range("A2").Value = "Piątek" Case 7 Range("A2").Value = "Sobota" Case Else Range("A2").Value = "Poza zakresem wpisz wartość od 1 do 7" End Select Else Range("A2").Value = "Wpisz wartość liczbową" End If End Sub
Przykład opis przykładu: Przykład na pierwszy rzut oka wygląda być może skomplikowanie ale już wszystko wyjaśniam. Na początku za pomocą instrukcji Dim deklarujemy zmienną o nazwie NumerDnia, która będzie przechowywała wartości. Temat deklarowania zmiennych opiszę w dalszej części kursu. W następnej linii kodu określamy wartość zmiennej czyli nasza zmienna NumerDnia = Range("A1").Value. W przykładzie wykorzystaliśmy też poznaną wcześniej instrukcje If... Then... Else oraz funkcje IsNumeic do sprawdzenia czy wartości wprowadzane do komórki A1 arkusza są numeryczne. Funkcja IsNumeric sprawdza czy dane wyrażenie może być przekształcone w liczbę. Główna część kodu to blok naszej instrukcji Select Case, w której sprawdzamy wartość zmiennej NumerDnia czyli wartość jaka jest w komórce A1 arkusza. Jeżeli wartość zmiennej NumerDnia wynosi 1 w komórce A2 arkusza wyświetlany jest napis: Niedziela jeżeli 2: 20
poniedziałek itd. Gdy wartość wprowadzona do komórki A1 arkusza jest różna od wartości od 1 do 7, wyświetlany jest napis: Poza zakresem wpisz wartość od 1 do 7. Jeżeli zaś wartość nie jest wartością numeryczną wyświetlany jest napis: Wpisz wartość liczbową. Na podstawie tego przykładu
chciałbym też pokazać jak zagwarantować aby potrzebne wartości były prawidłowo wprowadzane. Celem przetestowania przykładu wykonaj następujące czynności: • • • •
• • • • •
Uruchom Microsoft Excel. Z menu Widok wybieramy Paski narzędzi a następnie Przybornik formantów (jeżeli nie jest widoczny). W Przyborniku formantów wyszukaj i kliknij na ikonę Przycisk polecenia a następnie miejsce w arkuszu gdzie chcesz go umieścić. Ikona Tryb projektowania w przyborniku powinna się uaktywnić. Kliknij dwa razy lewym przyciskiem myszy na wstawiony przycisk (ikona Tryb projektowania w przyborniku powinna być aktywna). Powinien uruchomić się Edytor Visual Basic z widocznym oknem Kod programu (Code), w oknie tym zawarta powinna być deklaracja procedury Click naszego Przycisku polecenia. W procedurze zdarzenia Click Przycisku polecenia wpisz odpowiednie linie kodu. Zamknij Edytor Visual Basic Alt+Q i powróć do arkusza Excela. Następnie wyłącz tryb projektowania (jeżeli jest aktywny) klikając na ikonę Zakończ tryb projektowania w Przyborniku formantów. Wpisz wartość np. 2 do komórki A1 arkusza następnie kliknij na Przycisk polecenia. Celem ponownego przetestowania, wpisz inną wartość do komórki A1 arkusza i ponownie kliknij na przycisk.
Dla dociekliwych: Dla dociekliwych przedstawiam przykład w którym przy każdym uruchomieniu dokumentu Excela wyświetlany jest napis, odpowiedni w zależności od dnia tygodnia. Napis wyświetlany jest w komórce A2 arkusza, który jest aktywny przy otwarciu dokumentu. W przykładzie do określenia dnia tygodnia wykorzystaliśmy funkcje DatePart. Kod przykładu umieszczamy w procedurze zdarzenia Workbook_Open() obiektu ThisWorkbook. Aby umieścić kod wykonaj czynności. • • •
Będąc w Edytorze Visual Basic w oknie Project kliknij dwa razy na obiekt ThisWorkbook. W otwartym oknie Code wpisz kod z przykładu. Zamknij a następnie uruchom dokument celem przetestowani przykładu.
Private Sub Workbook_Open() Select Case DatePart("w", Date) Case 1 Range("A2").Value = "Niedziela, jutro ch... poniedziałek" Case 2 Range("A2").Value = "Dzisiaj jest poniedziałek, początek wspaniałego tygodnia" Case 3 Range("A2").Value = "Wtorek, na szczęście to nie poniedziałek" Case 4 Range("A2").Value = "Środa, za chwilę z górki" Case 5 Range("A2").Value = "Czwartek, wczoraj chyba przesadziłeś, boli głowa co ?" Case 6 Range("A2").Value = "Cudownie już piątek" Case 7 Range("A2").Value = "Sobota, co Ci będę mówił" End Select End Sub
21
Słownictwo: •
wyrażenie - kombinacja słów kluczowych, operatorów, zmiennych i stałych, która daje w wyniku ciąg znaków, liczbę lub obiekt. Wyrażenia mogą być używane do przeprowadzania obliczeń, wykonywania operacji na znakach lub testowania danych.
Następnym bardzo wygodnym narzędziem są pętle, służą one do wielokrotnego wykonywania danego bloku kodu. Pętle możemy użyć do obliczeń matematycznych, wyodrębniania fragmentów danych lub do wykonywania tych samych operacji na wielu obiektach. VBA pozwala tworzyć kilka typów pętli, jedną z nich jest pętla Do...Loop. Instrukcji Do...Loop użyjemy jeżeli nie wiemy ile razy pętla ma być wykonana. Jest to pętla warunkowa, w której kluczową cechą jest warunek. Instrukcje umieszczone wewnątrz pętli są powtarzane tak długą jak długą pewien warunek jest spełniony (ma wartość True) lub do momentu gdy ten warunek zostanie spełniony (uzyska wartość True). Mamy do dyspozycji jakby pięć odmian pętli Do...Loop, wszystkie z nich działają w podobny sposób różnice przedstawiam w tabeli poniżej. Tabela. Odmiany pętli Do...Loop Typ pętli
Opis
Do...Loop
Wielokrotnie wykonuje blok kodu tak długą aż instrukcja warunkowa umieszczona wewnątrz tej pętli wykona instrukcje Exit Do. W tym przypadku użycie instrukcji Exit Do jest praktycznie obowiązkowe gdybyśmy jej nie zastosowali pętla byłaby wykonywana w nieskończoność.
Do While...Loop
Rozpoczyna i powtarza blok kodu umieszczony wewnątrz pętli jeżeli jest spełniony warunek umieszczony na początku tej pętli. Jest to prawdopodobnie najczęściej stosowana odmiana pętli warunkowej, szczegółowo opisałem ją w dalszej części strony.
Do...Loop While
Wykonuje blok kodu umieszczony wewnątrz pętli jeden raz i powtarza go tak długą jak długo jest spełniony warunek umieszczony na końcu pętli.
Do Until...Loop
Rozpoczyna i powtarza blok kodu umieszczony wewnątrz pętli dopóki nie zostanie spełniony warunek umieszczony na początku tej pętli.
Do...Loop Until
Wykonuje blok kodu umieszczony wewnątrz pętli jeden raz i powtarza go do czasu gdy zostanie spełniony warunek umieszczony na końcu pętli .
Instrukcja Exit Do Wewnątrz pętli warunkowej można posłużyć się instrukcją Exit Do. Instrukcja ta kończy działanie pętli i następuje wykonanie pierwszej instrukcji poza pętlą. Konstrukcje taką stosujemy w pierwszej odmianie pętli Do...Loop (patrz tabela powyżej) lub w pozostałych odmianach gdy wykonanie pętli chcemy uzależnić od dodatkowego warunku. Instrukcja Exit Do najczęściej występuje wewnątrz instrukcji If...Then lub Select Case. Wewnątrz pętli można umieścić dowolną liczbę instrukcji Exit Do. Instrukcje Exit Do może być stosowana tylko wewnątrz przedstawionych powyżej odmian pętli Do...Loop. Sposób użycia instrukcji Exit Do przedstawiłem w zaprezentowanym przykładzie na tej stronie.
Pętla Do While...Loop Jak już wspomniałem wszystkie odmiany pętli Do...Loop działają w podobny sposób. Podstawową (prawdopodobnie najczęściej stosowano) odmianą pętli warunkowej Do..Loop jest postać Do While...Loop. W przypadku tej pętli wykonanie kodu VBA rozpoczyna od sprawdzenia warunku który jest umieszczony na początku pętli. Jeżeli warunek nie jest spełniony instrukcje umieszczone wewnątrz pętli są pomijane (pętla nie jest wykonywana) i wykonywany jest kod umieszczony poniżej instrukcji Loop. Jeżeli zaś warunek jest spełniony, VBA wykonuje blok kodu umieszczony w pętli (pętla jest wykonywana). 22
Wewnątrz pętli znajdują się instrukcje z których przynajmniej jedna zmienia wartość warunku. Po dojściu do instrukcji Loop, VBA wraca do instrukcji Do While, aby ponownie sprawdzić warunek. Jeżeli okaże się że warunek nie jest spełniony wykonanie pętli będzie przerwane. Jeżeli jednak warunek nadal jest spełniony blok kodu pętli zostanie wykonany ponownie. Proces ten powtarza się do momentu w którym warunek nie jest już spełniony. Dlatego z góry nie możemy przewidzieć ile razy pętla będzie wykonana. Gdyby warunek byłby zawsze spełniony pętla wykonywała by się bez końca.
Składnia: Do While warunek [instrukcje] Loop
Objaśnienie:
• •
Do - słowo kluczowe świadczące o rozpoczęciu pętli. While - słowo kluczowe mówiące programowi że pętla ma być powtarzana tak długo, dopóki jest spełniony (prawdziwy, daje wartość True) podany warunek. warunek - wyrażenie numeryczne lub wyrażenie znakowe, które powinno być spełnione. instrukcje - jedna lub więcej instrukcji które mają być wykonane w pętli a z których przynajmniej
•
jedna ma wpływ na wartość warunku. Loop - słowo kluczowe oznaczające koniec pętli.
• •
Przykład kod przykładu: Private Sub CommandButton1_Click() Dim NumerWiersza As Integer Dim NumerKolumny As Integer NumerWiersza = 1 NumerKolumny = 1 Do While Arkusz2.Cells(NumerWiersza, NumerKolumny).Value <> "" If NumerWiersza >= 1000 Then Exit Do End If NumerWiersza = NumerWiersza + 1 Loop If NumerWiersza >= 1000 Then MsgBox "Baza przepełniona, dane nie mogą być zapisane. Dokonaj archiwizacji" Else Arkusz2.Cells(NumerWiersza, NumerKolumny).Value = Arkusz1.Range("A1").Value Arkusz2.Cells(NumerWiersza, NumerKolumny + 1).Value = Arkusz1.Range("B1").Value Arkusz2.Cells(NumerWiersza, NumerKolumny + 2).Value = Arkusz1.Range("C1").Value Arkusz1.Range("A1").Value = "" Arkusz1.Range("B1").Value = "" Arkusz1.Range("C1").Value = "" MsgBox "Dane zostały zapisane do Arkusza2" End If End Sub
Przykład opis przykładu: 23
W przykładzie po naciśnięciu (kliknięciu) przycisku polecenia (CommandButton1) zapisywane są dane z komórek A1, B1, i C1 Arkusza1 do odpowiednich komórek w Arkuszu2. Aby przetestować ten przykład wykonaj następujące czynności: • • • •
• • • • •
Uruchom Microsoft Excel. Z menu Widok wybierz Paski narzędzi a następnie Przybornik formantów (jeżeli nie jest widoczny). W Przyborniku formantów wyszukaj i kliknij na ikonę Przycisk polecenia a następnie miejsce w arkuszu gdzie chcesz go umieścić. Ikona Tryb projektowania w przyborniku powinna się uaktywnić. Kliknij dwa razy lewym przyciskiem myszy na wstawiony przycisk (ikona Tryb projektowania w przyborniku powinna być aktywna). Powinien uruchomić się Edytor Visual Basic z widocznym oknem Kod programu (Code), w oknie tym zawarta powinna być deklaracja procedury Click naszego Przycisku polecenia. W procedurze zdarzenia Click Przycisku polecenia wpisz odpowiedni kod: Zamknij Edytor Visual Basic Alt+Q i powróć do arkusza Excela. Następnie wyłącz tryb projektowania (jeżeli jest aktywny) klikając na ikonę Zakończ tryb projektowania w Przyborniku formantów. Wprowadź jakieś wartości do komórek A1, B1, i C1 Arkusza1 i kliknij przycisk. Przejdź do Arkusza2 i sprawdź czy dane zostały zapisane.
W kodzie przykładu zastosowaliśmy instrukcje Exit Do. Instrukcja ta w naszym przypadku spełnia dwa zadania. Pierwsze ogranicza ilość zapisanych wierszy aby nasza baza danych nie była zbyt rozbudowana. Drugie powoduje wyjście z pętli Do While...Loop gdyby z jakiegoś powodu nasza pętla miała być wykonywana w nieskończoność. Jeszcze uwaga do przykładu. Kod ten w Arkuszu2 przeszukuje po kolei wiersze w określonej przez nas jednej kolumnie. Po natrafieniu na pustą komórkę w tej kolumnie zapisywane są dane do wiersza w którym jest ta komórka. Aby kod działał poprawnie komórka umieszczona w kolumnie którą przeszukuje kod powinna być za każdym razem zapisywana. Możemy tam umieszczać na przykład numer porządkowy czy datę zapisania. Pętle warunkowe są niewątpliwie bardzo silnym i wygodnym narzędziem programistycznym. Jednak musimy bardzo uważać by nie stworzyć pętli nieskończonej, czyli takiej która była by wykonywana w nieskończoność. Aby się przed tym zabezpieczyć możemy użyć instrukcji Exit Do celem określenia dodatkowego warunku wyjścia z pętli. Pętla For... Next powtarza blok instrukcji określoną liczbę razy, stosujemy ją jeżeli z góry wiadomo ile razy pętla ma być wykonana. Podstawowa składnia pętli For... Next jest następująca.
Składnia: For Licznik = Początek To Koniec Step Krok [blok instrukcji] Next Licznik
Objaśnienie: • • • • •
For - słowo kluczowe reprezentujące początek pętli. Licznik - zmienna numeryczna, która pełni rolę licznika pętli. Początek - jest to wartość początkowa licznika pętli. To - słowo kluczowe separujące wartość początkową licznika od wartości końcowej licznika pętli. Koniec - wartość końcowa licznika, liczba na której pętla się zatrzymuje.
24
• •
Step - opcjonalne słowo kluczowe sygnalizujące istnienie Kroku. Krok - element nieobowiązkowy, jest to wielkość o jaką zwiększany jest licznik przy każdym
•
wykonaniu pętli. Jeśli wielkość ta nie jest podana przyjmuje się Krok równy 1. Next - słowo kluczowe będące swego rodzaju nawiasem zamykającym pętle.
Informacje dodatkowe:
•
Krok (czyli wielkość o jaką zwiększany jest licznik przy każdym wykonaniu pętli) może być wartością dodatnią lub ujemną. Gdy Krok jest wartością ujemną to wartość początkowa licznika (Początek), powinna być większa od wartości końcowej licznika (Koniec). Inną możliwością zakończenia wykonywania pętli jest umieszczenie w niej instrukcji Exit For.
•
Instrukcja Exit For występuje przeważnie po sprawdzeniu pewnego warunku, np. w instrukcji If Then Else. Pętle For... Next mogą być zagnieżdżane przez umieszczenie jednej pętli wewnątrz drugiej.
•
Przykład kod przykładu: Sub PrzykładPętli() Dim kolumna As Integer For kolumna = 1 To 10 Cells(1, kolumna) = kolumna Next kolumna End Sub
Przykład opis przykładu: W przykładzie wstawiane są wartości liczbowe od 1 do 10 do komórek arkusza, odpowiednio od A1 do A10. Kod przykładu jest krótki jest to jedna z zalet pętli, które pozwalają wykonywać te same operacje wielokrotnie. W naszym przypadku zamiast oddzielnie określać wartość dla poszczególnych komórek tworzymy pętlę, która wstawia po kolei wartości do tych komórek. Poniżej przedstawiam opis poszczególnych linii kodu z przykładu. •
Sub PrzykładPętli() - w tej linii kodu deklarujemy procedurę, w której Sub to słowo kluczowe Visual Basic określające, że dany blok to procedura. PrzykładPętli jest to nazwa naszej procedury. Procedura ta będzie wykonywana i instrukcje zawarte poniżej aż do słów End Sub, które
wskazują koniec bloku kodu. •
•
•
Dim kolumna As Integer - za pomocą instrukcji Dim deklarujemy zmienną o nazwie kolumna
typu Integer. Zmienna ta w naszym przypadku będzie przechowywała wartości licznika pętli. Temat deklarowania zmiennych oraz typy danych opiszę w dalszej części kursu. For kolumna = 1 To 10 - dalej występuje nasza właściwa pętla, w której wyraz kolumna jest to zmienna numeryczna pełniąca rolę licznika pętli. Przy pierwszym wykonaniu pętli wartość zmiennej kolumna równa się 1. Ponieważ nie określiliśmy wartości kroku pętli, przyjmowana jest wartość domyślna 1, czyli zmienna kolumna zwiększana jest o wartość 1 przy każdym wykonaniu pętli. Pętla jest wykonywana ostatni raz gdy wartość tej zmiennej osiągnie 10. Cells(1, kolumna) = kolumna - jak już wspomniałem zmienna kolumna przybiera wartości numeryczne od 1 do 10 i pełni role licznika pętli, jak można zauważyć zmienną tą (jej wartości) wykorzystaliśmy jeszcze w tej linii kodu. W opisywanej linii właściwość Cells określa adres komórki i posiada dwa argumenty pierwszy określa numer wiersza, w którym znajduje się komórka a drugi numer kolumny. W naszym przypadku jest to pierwszy wiersz arkusza (pozostaje on niezmienny), numer kolumny zaś określany jest przez zmienną kolumna i jak wiemy przy każdym wykonaniu pętli jest inny. W tej linii kodu określamy adres komórki, jednocześnie też określamy wartość 25
•
komórki o podanym adresie. Wartość określonej komórki jest to wartość reprezentowana przez aktualną wartość zmiennej kolumna. A tak po prostu przy pierwszym wykonaniu pętli do komórki A1 wstawiana jest liczba 1 przy drugim do komórki A2 stawiana jest wartość 2 i analogicznie dalej aż do komórki A10 arkusza. Next kolumna - zamykamy i wychodzimy z pętli. W instrukcji tej nazwa licznika (kolumna) nie jest wymagana, jednak dzięki podaniu nazwy licznika w instrukcji kończącej pętle staje się ona bardziej czytelna.
Przykład informacje dodatkowe: Zmienna kolumna w naszym przykładzie przybiera wartości liczbowe od 1 do 10 i jednocześnie spełnia trzy zadania. • • •
pełni rolę licznika pętli. określa numer kolumny, w którym znajduje się komórka. określa wartość tej komórki.
Aby przetestować przykład wykonaj następujące czynności: • • • •
•
• •
Uruchom Microsoft Excel. Z menu Widok wybieramy Paski narzędzi a następnie opcje Visual Basic, (jeżeli pasek nie jest widoczny). Z paska narzędzi Visual Basic wybieramy przycisk Edytor Visual Basic. W nowo otwartym oknie Microsoft Visual Basic-Zeszyt1 z menu View (Widok) wybieramy opcję ProjectExplorer (Eksploator projektu). Powinno się otworzyć okno Project-VBAProject (ProjektVBAProject) oczywiście punktu tego nie wykonujemy, jeżeli okienko było wcześniej otwarte. Następnie z menu Insert (Wstaw) wybieramy opcję Module (Moduł). Wstawiony obiekt Module1 (Moduł1) powinien się pojawić oknie Project-VBAProject. Powinno się też pojawić okno Zeszyt1Module1(Code) (Zeszyt1-Moduł1(Kod programu)). Jeżeli okno się nie pojawi aby je uaktywnić w oknie Project-VBAProject klikamy dwa razy lewym przyciskiem myszy na obiekt Module1 (Moduł1). W nowo otwartym oknie Zeszyt1-Module1(Code) (Zeszyt1-Moduł1(Kod programu)) piszemy (wstawiamy) kod z przykładu. Zamykamy Edytor VisualBasic (Alt+Q) i powracamy do Microsoft Excel.
Nasz kod możemy uruchomić na różne sposoby, ja wykorzystałem przycisk z paska narzędzi Formularze. Aby tego dokonać wykonaj następujące czynności. • • •
• •
Z menu Widok dokumentu Excela wybieramy Paski narzędzi a następnie opcję Formularze. Z paska narzędzi Formularze wybieramy ikonę Przycisk a następnie miejsce w arkuszu gdzie chcemy go umieścić. Powinno się otworzyć okno Przypisz makro, (jeżeli okno się nie otworzy klikamy prawym przyciskiem myszy na nasz wstawiony przycisk i wybieramy opcję Przypisz makro...). W oknie tym zaznaczamy PrzykładPętli i klikamy przycisk OK. Kliknij na jakieś miejsce w arkuszu (celem zlikwidowania zaznaczenia przycisku) a następnie na przycisk (Przycisk 1) i przetestuj działanie przykładu. Celem ponownego przetestowania przykładu wyczyść zawartość komórek od A1 do A10 arkusza i ponownie kliknij na przycisk.
Dla dociekliwych: 26
Dla dociekliwych przedstawiam kod przykładu, w którym tworzymy "tabliczkę mnożenia". Przy okazji chciałbym pokazać jak można zagnieżdżać pętle, czyli umieszczać jedną w drugiej. Dla celów wizualnych zmieniamy kolor zakresu komórek od A1 do J10 i od A2 do A10 na szary. Aby przetestować przykład wykonaj kroki jak w przykładzie opisanym wyżej. Sub PrzykładPętli() Dim wiersz, kolumna As Integer Range("A1", "J1").Interior.ColorIndex = 15 Range("A2", "A10").Interior.ColorIndex = 15 For wiersz = 1 To 10 For kolumna = 1 To 10 Cells(wiersz, kolumna) = wiersz * kolumna Next kolumna Next wiersz End Sub
Słownictwo: •
argument - dane dostarczające informacji dla akcji, zdarzenia, metody, właściwości lub procedury. Argument może być stałą, zmienną lub jakimś wyrażeniem.
Pewną odmianą pętli For... Next jest instrukcja For Each... Next, służy ona do wykonywania operacji na obiektach kolekcji (powtarza grupę instrukcji dla każdego elementu tablicy lub obiektu kolekcji). Praktycznym zastosowaniem może być np. przeszukiwanie komórek arkusza Excela w celu znalezienia określonej wartości. Podstawowa składnia pętli For Each... Next jest następująca:
Składnia: For Each element In kolekcja [blok kodu wykonywany dla każdego elementu kolekcji] Next element
Objaśnienie: • •
element - jest to zmienna która przebiega wszystkie elementy zbioru lub tablicy. kolekcja - jest to nazwa przeszukiwanego zbioru obiektów lub tablicy
Informacje dodatkowe: •
•
Inną możliwością zakończenia wykonywania pętli jest umieszczenie w niej instrukcji Exit For. Instrukcja Exit For występuje przeważnie po sprawdzeniu pewnego warunku, np. w instrukcji If Then Else. Pętla For Each... Next, w przeciwieństwie do do instrukcji For... Next, nie wymaga licznika kontrolującą liczbę wykonań pętli. Jeżeli nie zastosujemy instrukcji Exit For to pętla zostanie wykonana tyle razy, ile elementów posiada kolekcja.
Przykład kod przykładu: Sub Wyszukaj() For Each element In Range("A1:M25")
27
If IsNumeric(element.Value) = True Then If element.Value < 0 Then element.Interior.ColorIndex = 3 Exit For End If End If Next End Sub
Przykład opis przykładu: W przykładzie przeszukiwany jest zakres komórek A1:M25 arkusza Excela w celu znalezienia wartości numerycznej mniejszej od zera. Jeżeli w aktualnie przeszukiwanej komórce jest wartość numeryczna mniejsza od zera, kolor wypełnienia tej komórki zmieniany jest na czerwony i pętla kończy działanie. Na podstawie tego przykładu chciałem pokazać jak zastosować instrukcję Exit For do wcześniejszego wyjścia z pętli. Gdybyśmy nie zastosowali tej instrukcji pętla byłaby wykonana tyle razy ile jest komórek w zakresie A1:M25. Oczywiście pętla będzie wykonana do końca jeżeli w żadnej komórce w przeszukiwanym zakresie nie ma wartości numerycznej mniejszej od zera. Kolekcją czyli zbiorem do przeszukania w naszym przypadku jest zakres komórek A1:M25 aktywnego arkusza, zaś zmienna element określa aktualnie przeszukiwaną komórkę. Aby przetestować przykład wykonaj analogiczne czynności jak w przykładzie ze strony opisującej pętle For Next. Oczywiście w punkcie przypisującym makro do przycisku formularza wybieramy nazwę Wyszukaj. Po wykonaniu tych punktów wpisz różne wartości (dodatnie i ujemne) do komórek arkusza z podanego zakresu. Kliknij na przycisk i przetestuj przykład.
Słownictwo: •
• •
kolekcja - obiekt zawierający zestaw powiązanych ze sobą obiektów. Pozycje obiektów w kolekcji mogą zmieniać się pod wpływem zmian w kolekcji; pozycja każdego konkretnego obiektu kolekcji może zatem ulegać zmianie. obiekt - kombinacja kodu programu i danych, które mogą być traktowane jako całość, na przykład jako formant, formularz lub część aplikacji. tablica - zbiór kolejno indeksowanych elementów mających ten sam wewnętrzny typ danych. Każdy element tablicy posiada unikatowy numer indeksu. Przeprowadzenie zmian dla jednego elementu tablicy nie wpływa na inne jej elementy.
Zmienne Pisząc kod programu rzadko posługujemy się konkretnymi wartościami liczbowymi lub tekstowymi. Częściej posługujemy się pewnymi symbolami (nazwami), którym podczas działania programu możemy przypisywać odpowiednie wartości. Symbole te nazywamy zmiennymi. Dzięki zmiennym możemy pisać programy, których sposób działania zależy od aktualnych informacji. Kiedy zmienia się wartość zmiennej, zmienia się sposób działania programu. A więc aby w pełni wykorzystać możliwości języka VBA należy stosować zmienne. •
zmienna - opatrzone nazwą miejsce w pamięci do przechowywania danych, które mogą ulegać
modyfikacjom w trakcie wykonywania programu. Każda zmienna zaopatrzona jest w unikatową nazwę, która identyfikuje ją w obrębie danego zakresu. Typ danych może być określony lub nie. Nazwy zmiennych muszą zaczynać się literą, muszą być unikatowe w obrębie swego zakresu, nie mogą być dłuższe niż 255 znaków i nie mogą zawierać kropki ani znaku deklarującego typ.
Deklarowanie zmiennych: 28
Deklarowanie zmiennej jest to operacja polegająca na nadaniu jej nazwy oraz określeniu typu i dostępności. Jeżeli zadeklarujemy zmienną to jednocześnie przydzielamy jej pamięć. Zmienną możemy zadeklarować wewnątrz konkretnej procedury lub w sekcji deklaracji modułu kodu. Miejsce deklaracji ma wpływ na dostępność danej zmiennej. Do deklarowania zmiennej zazwyczaj stosowane jest słowo kluczowe Dim. Instrukcja deklaracji w której użyliśmy słowa kluczowego Dim może być umieszczona wewnątrz procedury, wówczas zostanie utworzona zmienna na poziomie procedury. Jeżeli natomiast deklaracja zostanie umieszczona na początku modułu w sekcji deklaracji, utworzona będzie zmienna na poziomie modułu. Poniżej przedstawiam przykład deklaracji w którym deklarujemy zmienną o nazwie MojaLiczba. Dim MojaLiczba
Oprócz deklarowania zmiennych za pomocą słowa kluczowego Dim, w deklarowaniu zmiennych możemy użyć słów kluczowych Private, Public, oraz Static. Słowa te służą nie tylko do deklarowania zmiennych ale i do określania ich zakresu. Temat ten rozwinę w dalszej części strony.
Typy danych: Deklarując zmienne możemy określić jakiego typu dane zmienna będzie przechowywać. Jak już wspomniałem deklaracja zmiennej to jednocześnie rezerwacja w pamięci komputera miejsca potrzebnego do przechowania wartości, która zostanie przypisana do zmiennej. Jeżeli podczas deklarowania zmiennej podasz jej typ określasz tym samym bardziej precyzyjnie ile miejsca VBA ma zarezerwować dla tej zmiennej. W poniższym przykładzie deklarujemy zmienną typu Integer która zajmuje 2 bajty pamięci. Dla porównania podam, że ta sama zmienna zadeklarowana bez podania typu danych, będzie zajmować najmniej 16 bajtów. Dim MojaLiczba As Integer
Zagadnienia określania typów danych podczas ich deklaracji nie warto jednak wyolbrzymiać. Przy obecnym stanie technicznym sprzętu i przy wielkości programów jakie będziemy tworzyć w tym kursie, temat określania typu danych nie ma aż tak dużego znaczenia. Przypuszczam też, że dla osób początkujących wygodniej będzie podczas deklaracji nie podawać typu danych. Oczywiście to czy deklarując zmienną podawać jej typ należy rozpatrywać pisząc konkretny program. Więcej informacji na temat typów danych znajdziesz na stronie Typy danych - gdzie umieszczona jest tabela przedstawiająca dopuszczalne typy danych stosowane w VBA, włączając w to ich rozmiar oraz zakres.
Jawne deklarowanie: Deklarowanie zmiennych za pomocą słów kluczowych Dim, Private, Public, oraz Static nazywamy jawnym deklarowaniem. Zmienna w języku Visual Basic może być też niejawnie zadeklarowana po prostu przez użycie jej w instrukcji przypisania. Wszystkie zmienne zadeklarowane niejawnie są typu Variant. Zmienne typu Variant wymagają więcej zasobów pamięci niż większość innych zmiennych. Jawne deklarowanie wszystkich zmiennych redukuje niebezpieczeństwo wystąpienia błędów wynikających z konfliktów nazw i pomyłek w pisowni. Aby uniknąć przykrych niespodzianek dobrze byłoby wyrobić sobie nawyk jawnego deklarowania wszystkich zmiennych. Bardzo pomocna w tym może okazać się instrukcja Option Explicit. Jeżeli w sekcji deklaracji modułu kodu wpiszesz: Option Explicit
29
VBA wyświetli komunikat o błędzie, ilekroć wykryje niezadeklarowaną zmienną. W takim przypadku możemy dodać brakującą deklarację. Instrukcja Option Explicit wykorzystywana jest na poziomie modułu w celu wymuszenia jawnego deklarowania wszystkich zmiennych w danym module.
Zakres zmiennej: Zakres zmiennej czyli to, w jakich częściach programu jest ona dostępna, określamy podczas jej deklarowania. Zakres ten zależy od: • •
miejsca, w którym zmienna jest zadeklarowana, w sekcji deklaracji modułu czy wewnątrz konkretnej procedury. za pomocą jakiego słowa kluczowego tj. Dim, Public, Private, lub Static, zmienna została zadeklarowana.
Poniżej przedstawiam kilka przykładów deklaracji. Tekst w kolorze zielonym zaczynający się od znaku ' jest komentarzem i nie ma wpływu na działanie przykładów. Dim MojaLiczba 'Instrukcja ta może być umieszczona wewnątrz procedury, wówczas zostanie utworzona zmienna na poziomie procedury. Jeżeli natomiast deklaracja zostanie umieszczona na początku modułu, w sekcji deklaracji, utworzona będzie zmienna na poziomie modułu. Private MojaZmienna 'Stosowana na poziomie modułu do deklaracji zmiennych prywatnych oraz do przydziału pamięci. Zmienne te są dostępne tylko w tym module, w którym zostały zadeklarowane. Słowa kluczowego Private nie można użyć wewnątrz procedury. Public WynikRazem 'Stosowana do deklarowania zmiennych publicznych na poziomie modułu. Zmienne zadeklarowane za pomocą instrukcji Public są dostępne dla wszystkich procedur we wszystkich modułach wszystkich projektów. Słowo kluczowe Public należy stosować wyłącznie w sekcji deklaracji modułu. Static Licznik 'Wykorzystywana na poziomie procedury do deklaracji zmiennych i przydziału pamięci. Zadeklarowana w ten sposób zmienna zachowuje swoją wartość między wywołaniami procedury. Zmienne statyczne można deklarować tylko wewnątrz procedur.
Więcej informacji na temat zakresu zmiennych znajdziesz na stronie: http://dzono4.webpark.pl/basic/opisvb/zmizakr.htm
Przypisanie wartości do zmiennej: Jak już wspomniałem zmienne służą do przechowywania wartości, które mogą się zmieniać podczas działania programu. Aby zmienna mogła przechowywać pewne określone wartości musimy to wartość przypisać do zmiennej. Operacje przypisania wartości do zmiennej nazywamy instrukcją przypisania. Instrukcja przypisania składa się z nazwy zmiennej, znaku równości oraz wartości (lub wyrażenia określającego wartość), która ma być przypisana do zmiennej. Poniżej przedstawiam kilka przykładów przypisania wartości do zmiennej. MojaWartosc = 3 'Zmiennej o nazwie MojaWartosc przypisujemy wartość 3.
30
Przywitanie = "Pozdrawiam wszystkich" 'W tym przypadku instrukcja przypisania przypisuje tekst umieszczony z prawej strony znaku równości do zmiennej Powitanie. Łańcuchy znakowe przypisywane do zmiennych należy ujmować w cudzysłów. Nazwisko = InputBox("Jak się nazywasz?") 'W instrukcji przypisania możemy użyć funkcji. W przykładzie przypisujemy wartość zwróconą przez funkcje InputBox, zmiennej Nazwisko. MojaLiczba = Int((6 * Rnd) + 1) 'A oto inny przykład przypisania. Zmiennej MojaLiczba przypisujemy wartość wyrażenia z prawej strony znaku równości.
Wartości domyślne: Być może zastanawiacie się co się kryje w zmiennych po ich zadeklarowaniu ale jeszcze przed przypisaniem im wartości. W tym czasie VBA nadaje zmiennym następujące wartości domyślne: Tabela. Wartości domyślne zmiennych Typ danych
Wartość domyślna
Wszystkie numeryczne typy danych
0 (zero)
String (o zmiennej długości)
Łańcuch znaków o zerowej długości ("").
String (o stałej długości)
Łańcuch znaków o zadanej długości wypełniony znakami o kodzie ASCII równym 0 (jest to znak niedrukowany).
Variant
Empty (specjalna wartość wskazująca zmienną bez wartości).
Obiect
Wartość umowna Nothing (nic).
Zmienne statyczne: Z tematem zmiennych statycznych zetknęliśmy się już na tej stronie przy omawianiu zakresu zmiennej. Jeżeli chcemy aby zmienna zachowała swoją wartość nawet po wykonaniu procedury, w której jest zadeklarowania skorzystamy ze słowa kluczowego Static. Instrukcja Static wykorzystywana jest na poziomie procedury do deklaracji zmiennych i przydziału pamięci. Zadeklarowana w ten sposób zmienna zachowuje swoją wartość między wywołaniami procedury. Static Licznik
Zmienne statyczne zachowują swoją wartość nadaną im w efekcie wykonania procedury. W przypadku ponownego wykonania procedury zmienna statyczna ma początkowo tę samą wartość, jaką uzyskała w poprzednim wykonaniu tej procedury. Zmienne statyczne można deklarować tylko wewnątrz procedur. Mała uwaga: zmiennych statycznych nie należy mylić ze stałymi, temat stałych przedstawię w dalszej części kursu.
Przykład: Przykład kod przykładu:
31
Private Sub CommandButton1_Click() Dim MojaLiczba As Integer Static Licznik MojaLiczba = Int((6 * Rnd) + 1) Licznik = Licznik + 1 MsgBox "To jest Twoje " & Licznik & " losowanie " & "wylosowałeś " & MojaLiczba End Sub
Przykład opis: Przykład być może nie jest zbyt ciekawy chciałem w nim po prostu praktycznie zademonstrować wiedzę zawarto na tej stronie. W przykładzie deklarujemy dwie zmienne. Za pomocą instrukcji Dim deklarujemy zmienną o nazwie MojaLiczba, ponieważ wiemy jakie wartości zmienna będzie przechowywać określamy też jej typ czyli Integer. Następnie deklarujemy zmienną statyczną o nazwie Licznik. Wykorzystując funkcje Int i Rnd zmiennej MojaLiczba przypisujemy losowo wybrano wartość z przedziału od 1 do 6. Następnie zwiększamy wartość zmiennej Licznik o 1 przy każdym wykonaniu procedury. Na koniec za pomocą funkcji MsgBox wyświetlamy komunikat o wartości wylosowanej i liczbie losowań. Opisany kod umieściliśmy w procedurze zdarzenia Click Przycisku polecenia CommandButton1. Przykład kroki: Aby przetestować przykład stosując analogie wykonaj kroki jak na przykład na stronie pierwszy program.
Słownictwo: •
•
Empty - wartość specjalna wskazuje, że do zmiennej typu Variant nie przypisano żadnej początkowej wartości. Zmienna Empty dla wartości numerycznych jest równa 0, a dla ciągów znaków jest ciągiem znaków o długości zerowej (""). Nothing - wartość specjalna oznacza, że zmienna nie odwołuje się do żadnego określonego wystąpienia obiektu.
Stałe Nieraz w kodzie programu stosujemy wartości, które nie zmieniają się podczas jego wykonywania lub też stosujemy wartości trudne do zapamiętania i nie mające oczywistego znaczenia. Możemy jednak kod programu uczynić łatwiejszym do czytania i modyfikowania wykorzystując stałe. Stała jest nazwą o określonym znaczeniu, która zastępuje niezmienną w kodzie programu wartość liczbową lub ciąg znaków. Nie można zmodyfikować stałej lub przypisać do niej nowej wartości, tak jak jest to możliwe w przypadku zmiennej. Stałą możemy zastosować w kodzie programu celem na przykład zagwarantowania niezmienności pewnej wartości. •
stała - element o nadanej nazwie, który zachowuje stałą wartość przez cały czas działania programu.
Stała może być ciągiem znaków lub literałem numerycznym, inną stałą lub dowolną kombinacją zawierającą operatory arytmetyczne i logiczne, z wyjątkiem operatora Is oraz operatora potęgowania. Każda aplikacja główna może definiować własny zestaw stałych. Dodatkowe stałe mogą być definiowane przez użytkownika za pomocą instrukcji Const. Stałych można użyć w dowolnym miejscu kodu programu zamiast ich rzeczywistych wartości.
Deklarowanie stałych:
32
Jeżeli chcemy utworzyć stałą to musimy ją zadeklarować. Jest to operacja polegająca na nadaniu jej nazwy i przypisaniu odpowiedniej wartości oraz na ewentualnym określeniu typu i dostępności. Jeżeli zadeklarujemy stałą to jednocześnie przydzielamy jej pamięć. Stałą możemy zadeklarować wewnątrz konkretnej procedury lub w sekcji deklaracji modułu kodu. Miejsce deklaracji ma wpływ na dostępność danej stałej. Do deklaracji stałej i nadania jej wartości służy słowo kluczowe Const. Const WartośćGraniczna = 459
Możemy też podczas deklaracji określić typ danych jakie dana stała będzie przechowywała. Const WartośćGraniczna As Integer = 459
Zwróćmy uwagę że w bardzo podobny sposób deklarujemy zmienne. Różnica polega na tym że w instrukcji deklaracji stałej stosując operacje przypisania podajemy jej (niezmienną) wartość. W instrukcji deklaracji stałej celem określenia jej zasięgu możemy też użyć słów kluczowych: Public i Private, szczegóły przedstawiam poniżej.
Zakres stałej: Zakres stałej czyli to, w jakich częściach programu jest ona dostępna, określamy podczas jej deklarowania. Zakres ten zależy od: • •
miejsca, w którym stała jest zadeklarowana, w sekcji deklaracji modułu czy wewnątrz konkretnej procedury. za pomocą jakiego słowa kluczowego tj. Public, Private stała została zadeklarowana.
Poniżej przedstawiam kilka przykładów deklaracji. Tekst w kolorze zielonym zaczynający się od znaku ' jest komentarzem i nie ma wpływu na działanie przykładów. Const LiczbaPi = 3.14159265359 'za pomocą słowa kluczowego Const deklarujemy stałą o nazwie LiczbaPi, która w naszym przypadku przechowuje właśnie wartość liczby Pi. Jeżeli instrukcje deklarującą stałą umieścimy wewnątrz procedury to stała ta dostępna jest tylko wewnątrz tej procedury. Jeżeli zaś instrukcję tą umieścimy poza procedurą w sekcji deklaracji modułu to stała ta będzie dostępna dla wszystkich procedur danego modułu. Public Const LiczbaPi = 3.14159265359 'stałe zadeklarowane na poziomie modułu są domyślnie prywatne czyli widoczne i dostępne tylko wewnątrz tego modułu. Aby zadeklarować stałą publiczną czyli dostępną we wszystkich procedurach wszystkich modułów, należy poprzedzić instrukcję Const słowem kluczowym Public. Stałe publiczne możemy deklarować tylko w sekcji deklaracji modułu standardowego. Nie można deklarować stałych publicznych w procedurach czy modułach klas. Private Const LiczbaPi = 3.14159265359 'możliwe jest także jawne zadeklarowanie stałej prywatnej, przez poprzedzenie instrukcji Const słowem kluczowym Private. Słowo kluczowe Private wykorzystujemy do jawnego zadeklarowania stałej prywatnej, celem poprawienia czytelności kodu. Stosowanie go w procedurach jest niedozwolone.
Stałe wbudowane:
33
Stałe są bardzo bogato reprezentowane jako elementy wbudowane języka VBA oraz aplikacji Office. Informacje na temat tych stałych znajdziesz między innymi w Przeglądarce obiektów. Ponieważ stałe te są zawsze dostępne, nie można definiować stałych użytkownika o takich samych nazwach. Z tego typu stałymi spotkasz się w dalszej części kursu na przykład na stronie Okno komunikatu funkcji MsgBox.
Przykład: Przykład kod przykładu: Private Sub CommandButton1_Click() On Error GoTo problem Const LiczbaPi = 3.14159265359 Dim Promień, Pole, Obwód Promień = InputBox("Podaj promień koła") If Promień = "" Then MsgBox "Brak poprawnych wartości lub operacja została anulowana" Exit Sub Else Pole = LiczbaPi * Promień * Promień Obwód = 2 * LiczbaPi * Promień MsgBox "Pole koła wynośi " & Pole & ", obwód " & Obwód End If Exit Sub problem: MsgBox "Wystąpił błąd w programie. " & Err.Description & ", wprowadź poprawne wartości" End Sub
Przykład opis: Jest to praktycznie w pełni funkcjonalny przykład w którym na podstawie podanego promienia obliczamy pole i obwód koła. W przykładzie wykorzystaliśmy instrukcje Const do zadeklarowania stałej przechowującej wartość liczby Pi. Przykład kroki: Celem sprawdzenia nabytej wiedzy chciałbym abyś samodzielnie wykonał przykład. Jeżeli masz jakieś trudności to zapoznaj się z innymi przykładamy kursu lub po prostu napisz. Podam tylko że przykład w przedstawionej formie działa po kliknięciu na Przycisk polecenia o nazwie CommandButton1.
Słownictwo: •
Przeglądarka obiektów - okno dialogowe, które służy do przeglądania zawartości biblioteki obiektów w celu znalezienia informacji na temat dostępnych obiektów.
Tablice Mimo że nie jest to niezbędne dla początkujących programistów, ale żeby tematyka tego działu była kompletna opisze jeszcze zmienne tablicowe. Zmienne tego typu możemy wykorzystać na przykład do pracy ze zbiorem powiązanych ze sobą informacji. Zmienna tablicowa inaczej tablica jest zmienną zawierającą wiele komórek przeznaczonych do przechowywania wartości, podczas gdy typowa zmienna ma jedynie jedną komórkę, w której można przechowywać tylko jedną wartość. Obrazowo można to przedstawić w ten sposób: Zwykłą zmienną możemy porównać do kontenera, który zawiera jeden pojemnik do 34
przechowywania zmieniających się zawartości, tablice zaś możemy porównać do zestawu pojemników umieszczonych w takim właśnie kontenerze z których każdy może przechowywać inną zawartość. Pojemniki te ułożone są w odpowiednim porządku inaczej strukturze. Każdy taki pojedynczy pojemnik (element) zmiennej tablicowej jest oznaczony indeksem liczbowym określającym jego miejsce w danej strukturze tablicy. •
tablica - zbiór kolejno indeksowanych elementów mających ten sam wewnętrzny typ danych. Każdy
element tablicy posiada unikatowy numer indeksu. Przeprowadzenie zmian dla jednego elementu tablicy nie wpływa na inne jej elementy.
Zmienne tablicowe mogą być jedną lub wielowymiarowe (dla naszych skromnych potrzeb z powodzeniem wystarczą tablice jedno a co najwyżej o dwóch wymiarach). Tablica jednowymiarowa jest zbiorem kolejno po sobie następujących elementów. Przykładem zaś tablicy dwuwymiarowej może być tabela czy arkusz kalkulacyjny z wieloma wierszami i kolumnami. Tablica trójwymiarowa to już prostopadłościan. Większa liczba wymiarów jest trudna do wyobrażenia (przynajmniej dla mnie) ale jako ciekawostkę podam, że za pomocą VB możemy deklarować tablice zawierające do 60 wymiarów.
Deklarowanie tablicy: Tablice są w zasadzie deklarowane w ten sam sposób co inne zmienne, to jest z użyciem instrukcji Dim, Static, Private lub Public. Słowa te tak jak w przypadku zmiennych służą nie tylko do deklarowania ale i do określania zakresu tablic. Za jednym z tych słów należy podać nazwę tablicy (zmiennej tablicowej) zakończonej parą nawiasów wewnątrz których określamy rozmiar tablicy (lub pozostawiamy puste). Tablica, dla której rozmiar jest określony, jest tablicą o stałym rozmiarze. Tablica, dla której rozmiar nie jest określony (nawiasy puste) i może zmieniać się podczas działania programu, jest tablicą dynamiczną.
Poniżej przedstawiam przykład prostej deklaracji tablicy. W przykładzie za pomocą słowa kluczowego Dim deklarujemy jednowymiarowo tablice o nazwie DniTygodna. Nazwa tablicy kończy się parą nawiasów w której określamy rozmiar tablicy, czyli liczbę elementów które tablica ma przechowywać. Nasza tablica zawiera siedem elementów, dlaczego siedem a nie sześć jak to podaliśmy. Ponieważ domyślnie elementy tablicy są numerowane od zera. Dim DniTygodnia(6)
Jak wspomniałem elementy tablicy są domyślnie numerowane od zera. Przeważnie nie ma to większego znaczenia ale nieraz ustawienie takie może być niewygodne. Numer początkowy indeksu tablic możemy zmienić z 0 na 1 stosując instrukcje Option Base 1. Instrukcje tę należy zastosować na początku modułu kodu w sekcji deklaracji tego modułu, czyli przed pierwszą występującą w nim procedurą. Ustalenie indeksu początkowego tablicy za pomocą instrukcji Option Base 1 odnosi się do wszystkich tablic deklarowanych w danym module. Jeżeli takie generalne rozwiązanie jest dla nas mało wygodne możemy użyć innego sposobu ustalenia indeksu początkowego tablicy odnoszącego się do pojedynczych tablic. W sposobie tym w instrukcji deklaracji konkretnej tablicy określamy numer (index) pierwszego elementu i liczbę elementów tablicy. Poniżej deklarujemy tablice o składającą się z siedmiu elementów, index pierwszego elementu ustawiony jest na jeden. Dim DniTygodnia(1 To 7)
35
Tablice stosuje się zazwyczaj do przechowywania danych tego samego typu. Dlatego też w instrukcji deklaracji tablicy możemy a nawet powinniśmy podać typ danych jaki dana tablica ma przechowywać. Wyjątkiem od zasady jednolitości typu danych jest tablica zadeklarowana jako Variant, pozwala to przypisywać poszczególnym elementom tablicy dane dowolnych typów. Rozwiązanie takie jest nieraz wygodne ale jak wiemy bardzo pamięciożerne. A oto przykład deklaracji tablicy typu String Dim DniTygodnia(1 To 7) As String
UWAGA: podobnie jak w przypadku deklaracji pojedynczych zmiennych, jeżeli dla tablicy nie zostanie określony typ danych, jako typ danych elementów deklarowanej tablicy przyjmowany jest Variant.
Do tej pory deklarowaliśmy tablice o jednym wymiarze, w tym punkcie przedstawię sposób deklaracji tablicy dwuwymiarowej. Tablice dwuwymiarową możemy porównać na przykład do tabeli lub arkusza kalkulacyjnego. Odpowiednie liczby określają liczbę kolumn i wierszy w tablicy. Jeżeli tablicę wyobrazimy sobie jako macierz, to pierwszy z argumentów reprezentuje wiersze, a drugi argument reprezentuje kolumny. Poniżej deklarujemy tablice typu Byte składającą się ze 100 elementów (zawierającą 10 wierszy i 10 kolumn). Dim Oceny(9, 9) As Byte
Lub też Dim Oceny(1 To 10, 1 To 10) As Byte
Zapisywanie danych do tablic: Aby zapisać dane do tablicy należy wybranemu elementowi tablicy przypisać odpowiednią wartość. W pierwszym przykładzie tworzymy tablice do przechowywania nazw dni tygodnia, następnie poszczególnym elementom tablicy przypisujemy odpowiednie wartości. Dim DniTygodnia(1 To 7) As String DniTygodnia(1) = "Poniedziałek" DniTygodnia(2) = "Wtorek" 'idt.
A oto inny przykład zapisywania danych do tablicy tym razem dwuwymiarowej. Dim Oceny(1 To 10, 1 To 10) As Byte Oceny(1, 1) = 5 Oceny(1, 2) = 4 'idt.
Do zapisania danych do tablicy możemy też użyć funkcji InputBox, funkcję to poznamy w dalszej części kursu. Dim DniTygodnia(1 To 7) As String DniTygodnia(1) = InputBox("Podaj nazwę dnia") 'idt.
Dane umieszczane w tablicy mogą być pobierane też bezpośrednio z komórek arkusza Excela.
36
Dim DniTygodnia(1 To 7) As String DniTygodnia(1) = Range("A1").Value 'idt.
Odczytywanie danych z tablicy: Wartość pojedynczego elementu tablicy (tak jak w przypadku zmiennych) możemy odczytać i wykorzystać na wiele sposobów. Możemy jej użyć na przykład w wyrażeniu, przypisać do innej zmiennej czy też wyświetlić w oknie funkcji MsgBox lub komórce arkusza Excela. W przedstawionym przykładzie za pomocą funkcji MsgBox (funkcja ta dokładnie omówiona jest w dalszej części kursu) wyświetlamy wartość elementu tablicy o indexie 2. Dim DniTygodnia(1 To 7) As String DniTygodnia(1) = "Poniedziałek" DniTygodnia(2) = "Wtorek" 'idt. MsgBox DniTygodnia(2)
A oto sposób pobrania wartości z elementu (index 1, 2) tablicy dwuwymiarowej. Dim Oceny(1 To 10, 1 To 10) As Byte Oceny(1, 1) = 5 Oceny(1, 2) = 4 MsgBox Oceny(1, 2)
Poniżej przedstawiam sposób przypisania wartości pojedynczego elementu tablicy do innej zmiennej, którą możemy w jakiś sposób wykorzystać w dalszej części naszego programu. Dim NumerDnia Dim DniTygodnia(1 To 7) As String DniTygodnia(1) = "Poniedziałek" DniTygodnia(2) = "Wtorek" 'idt. NumerDnia = DniTygodnia(2)
UWAGA: do zapisu jak i odczytu danych z tablicy często też używane są pętle.
Tablice dynamiczne: W przykładach przedstawionych do tej pory deklarowaliśmy tablice o określonym rozmiarze. Jeżeli nie znamy rozmiaru tablicy lub wiemy ze rozmiar tablicy zmieni się podczas działania programu możemy zadeklarować tablice dynamiczną. Aby zadeklarować tablice dynamiczną w instrukcji która ją deklaruje nie podajemy jej rozmiaru. Dim WybraneDni() As String
Jednak ponieważ zadeklarowana w ten sposób tablica nie może przechowywać żadnych danych to przed jej użyciem musimy określić jej aktualny rozmiar. Robimy to za pomocą instrukcji ReDim. ReDim WybraneDni(4) As String
37
Array: Informacyjnie tylko podam że inną (nietypową) tablice możemy utworzyć wykorzystując funkcje Array. Funkcja ta zwraca wartość typu Variant zawierającą tablicę.
Przykład 1: A oto przykład w którym wykorzystujemy informacje przedstawione do tej pory. Deklarujemy tablice o nazwie DniTygodna składającą się z siedmiu elementów. Tablica ta służy do przechowywania nazw dni tygodnia. Poszczególnym elementom tablicy przypisujemy odpowiednie wartości. Następnie za pomocy funkcji Weekday określamy numer bieżącego dnia aktualnego tygodnia i przypisujemy do zmiennej NumerDnia. Numer ten w naszym przypadku (jak widać z przypisania) jest indeksem określającym wartość jaką pobieramy z tablicy DniTygodna. Wartość to (nazwę dnia) pokazujemy w komórce A1 arkusza, który jest wyświetlany w momencie otwarcia dokumentu Excela. Przykład 1 kod przykładu: Private Sub Workbook_Open() Dim NumerDnia Dim DniTygodnia(1 To 7) As String DniTygodnia(1) = "Niedziela" DniTygodnia(2) = "Poniedziałek" DniTygodnia(3) = "Wtorek" DniTygodnia(4) = "Środa" DniTygodnia(5) = "Czwartek" DniTygodnia(6) = "Piątek" DniTygodnia(7) = "Sobota" NumerDnia = Weekday(Date) Range("A1").Value = DniTygodnia(NumerDnia) End Sub
Przykład 1 kroki: • • • •
• • •
Uruchom Microsoft Excel. Z menu Widok wybieramy Paski narzędzi a następnie opcje Visual Basic, (jeżeli pasek nie jest widoczny). Z paska narzędzi Visual Basic wybieramy przycisk Edytor Visual Basic. Będąc w Edytorze Visual Basic, z menu View (Widok) wybieramy opcję Project Explorer (Eksploator projektu). Powinno się otworzyć okno Project-VBAProject (Projekt-VBAProject) oczywiście punktu tego nie wykonujemy, jeżeli okienko było wcześniej otwarte. W oknie tym kliknij dwa razy na obiekt ThisWorkbook. W nowo otwartym oknie Zeszyt1 - ThisWorkbook(Code) (Zeszyt1 - ThisWorkbook(Kod programu)) piszemy (wstawiamy) kod z przykładu. Zamknij a następnie uruchom dokument celem przetestowani przykładu.
Dla dociekliwych: Przykład 2: Poniżej przedstawiam funkcje o nazwie: słownie, za pomocą której zamieniamy wartości liczbowe na wartości słowne. Jest to jakby wstęp do prawdziwej funkcji tego typu, ale za pomocą tego przykładu 38
chciałbym pokazać w jaki można wykorzystać tablice. Nasza funkcja zmienia wartości liczbowe od 0 d 19 na wartości słowne. Tekst w kolorze zielonym zaczynający się od znaku ' jest komentarzem i nie ma wpływu na działanie przykładu. Przykład 2 kod przykładu: Function słownie(liczba) Dim Wynik Static jednosci(19) As String jednosci(0) = "zero" jednosci(1) = "jeden" jednosci(2) = "dwa" jednosci(3) = "trzy" jednosci(4) = "cztery" jednosci(5) = "pięć" jednosci(6) = "sześć" jednosci(7) = "siedem" jednosci(8) = "osiem" jednosci(9) = "dziewięć" jednosci(10) = "dziesięć" jednosci(11) = "jedenaście" jednosci(12) = "dwanaście" jednosci(13) = "trzynaście" jednosci(14) = "czternaście" jednosci(15) = "piętnaście" jednosci(16) = "szesnaście" jednosci(17) = "siedemnaście" jednosci(18) = "osiemnaście" jednosci(19) = "dziewiętnaście" If IsNumeric(liczba) = False Then Wynik = "zły typ danych - funkcja konwertuje poprawnie liczby całkowite z przedziału od 0 do 19" słownie = Wynik Exit Function End If 'Za pomocą instrukcji If...Then...Else sprawdzamy czy wartość argumentu liczba naszej funkcji jest liczbą. Czyli jeżeli argument liczba nie jest liczbą wyświetlany jest komunikat o złym typie danych i kończymy działanie naszej funkcji. If liczba > 19 Or liczba < 0 Then Wynik = "Zły zakres - funkcja konwertuje poprawnie liczby całkowite z przedziału od 0 do 19" słownie = Wynik Exit Function End If 'Opis analogicznie jak wyżej, sprawdzamy czy argument liczba jest liczbą która mieści się w przedziale od 0 do 19. liczba = Int(liczba) Wynik = jednosci(liczba) słownie = Wynik End Function
Przykład 2 kroki: 1. Uruchom Microsoft Excel. 2. Z menu Widok wybieramy Paski narzędzi a następnie opcje Visual Basic, (jeżeli pasek nie jest widoczny). 3. Z paska narzędzi Visual Basic wybieramy przycisk Edytor Visual Basic. 4. Będąc w Edytorze Visual Basic, z menu Insert (Wstaw) wybieramy opcję Module (Moduł). Powinno się pojawić okno Zeszyt1 - Module1(Code) (Zeszyt1 - Moduł1(Kod programu)). 39
5. W nowo otwartym w oknie Zeszyt1 - Module1(Code) (Zeszyt1 - Moduł1(Kod programu)) piszemy (wstawiamy) kod z naszego przykładu. 6. Zamykamy Edytor VisualBasic (Alt+Q) i powracamy do Microsoft Excel. 7. W arkuszu Excela kliknij np. komórkę B2, następnie z menu Wstaw wybierz opcje Funkcja. 8. W oknie Wstawianie funkcji (Wklej funkcję) wybieramy: o Z pola Lub wybierz kategorię: (Kategoria funkcji:), opcje Użytkownika. o Następnie z pola Wybierz funkcję: (Nazwa funkcji:), naszą funkcję słownie. Wybór zatwierdzamy przyciskiem OK 9. W następnym oknie wpisujemy adres komórki z której funkcja ma pobierać argumenty np. A2 i naciskamy przycisk OK. 10. Przetestuj przykład wpisując odpowiednie liczby do komórki A2. Przykład zasada działania: Po wpisaniu do komórki A2 liczby z przedziału od 0 do 19, w komórce B2 pojawi się interpretacja słowna tej liczby. Oczywiście wpis musimy zatwierdzić klawiszem Enter lub kliknięciem przyciskiem myszy w inną komórkę arkusza. Operatory arytmetyczne W tej części kursu zajmiemy się operatorami. Operator - jest to symbol lub słowo, które oznacza operację wykonywaną na jednym lub większej liczbie elementów. Operatory które posiada VBA możemy podzielić na operatory arytmetyczne, porównania, logiczne oraz łączące. Na tej stronie przedstawiam krótki opis chyba najbardziej znanych operatorów tj. operatory arytmetyczne. Składnia:
wynik = liczba1 odpowiedni operator arytmetyczny liczba2 • • •
wynik - element obowiązkowy, jest to dowolna zmienna numeryczna. liczba1 - element obowiązkowy, jest to dowolne wyrażenie numeryczne (dla operatora + jest to dowolne wyrażenie). liczba2 - element obowiązkowy, jest to dowolne wyrażenie numeryczne (dla operatora + jest to dowolne wyrażenie).
Składnia dla operatora negacji: -liczba •
liczba - element obowiązkowy, jest to dowolne wyrażenie numeryczne.
Tabela operatory arytmetyczne: Operator
Operacja i opis
^
Potęgowanie - podnosi wartość do potęgi określonej w wykładniku.
*
Mnożenie - wykonuje mnożenie .
Przykład Dim Wynik Wynik = 10 ^ 3 ' Wynikiem jest 1000 MsgBox Wynik Dim Wynik Wynik = 10 * 3 ' Wynikiem jest 30
40
MsgBox Wynik
/
Dzielenie - wykonuje dzielenie i zwraca wynik w postaci zmiennoprzecinkowej.
Dim Wynik Wynik = 10 / 3 ' Wynikiem jest 3.333333 MsgBox Wynik
\
Dzielenie - wykonuje dzielenie i zwraca wynik w postaci liczby całkowitej.
Dim Wynik Wynik = 10 \ 3 ' Wynikiem jest 3 MsgBox Wynik
Mod
Modulo - wykonuje dzielenie i zwraca Dim Wynik Wynik = 10 Mod 3 ' Wynikiem jest 1 tylko resztę z przeprowadzonego MsgBox Wynik dzielenia.
+
Dodawanie - sumuje dwie wartości (operatora tego możemy też użyć do łączenia ciągów).
Dim Wynik Wynik = 10 + 3 ' Wynikiem jest 13 MsgBox Wynik
-
Operator ten stosuje się do znajdowania różnicy - Odejmowanie lub do zaznaczania ujemnej wartości wyrażenia numerycznego - Negacja.
Dim Wynik Wynik = 10 - 3 ' Wynikiem jest 7 MsgBox Wynik Wynik = -Wynik ' Wynikiem jest -7 MsgBox Wynik
W przykładach zawartych w tabeli w pierwszej linii kodu za pomocą instrukcji Dim deklarujemy zmienną Wynik. W następnej linii stosując odpowiedni operator wykonujemy działanie na wartościach 10 i 3. Rezultat tej operacji przypisujemy zmiennej Wynik. W ostatniej linii kodu za pomącą instrukcji MsgBox wyświetlamy wartość jaką posiada zmienna Wynik. Pamiętając o tym że kod musi być zawarty w procedurze spróbuj przetestować przykłady samodzielnie lub skorzystaj ze sposobu przedstawionego poniżej. Opisane wyżej przykłady możemy przetestować w następujący sposób: • • • •
• •
Uruchom Microsoft Excel. Z menu Widok wybieramy Paski narzędzi a następnie Przybornik formantów (jeżeli nie jest widoczny). W Przyborniku formantów wyszukaj i kliknij na ikonę Przycisk polecenia a następnie miejsce w arkuszu gdzie chcesz go umieścić. Ikona Tryb projektowania w przyborniku powinna się uaktywnić. Kliknij dwa razy lewym przyciskiem myszy na wstawiony przycisk (ikona Tryb projektowania w przyborniku powinna być aktywna). Powinien uruchomić się Edytor Visual Basic z widocznym oknem Kod programu (Code), w oknie tym zawarta powinna być deklaracja procedury Click naszego Przycisku polecenia. W procedurze zdarzenia Click Przycisku polecenia wpisz kod z określonego przykładu. Przykładowy kod może wyglądać:
Private Sub CommandButton1_Click() Dim Wynik Wynik = 10 Mod 3 ' Wynikiem jest 1 MsgBox Wynik End Sub • •
Pozamykaj wszystkie okienka, zapisz i zamknij dokument. Po ponownym otwarciu (z opcją Włącz makra), kliknij na Przycisk polecenia i przetestuj działanie przykładu.
41
Słownictwo: •
•
wyrażenie - kombinacja słów kluczowych, operatorów, zmiennych i stałych, która daje w wyniku ciąg znaków, liczbę lub obiekt. Wyrażenia mogą być używane do przeprowadzania obliczeń, wykonywania operacji na znakach lub testowania danych. wyrażenie numeryczne - każde wyrażenie, którego wartością może być liczba. Elementy wyrażenia mogą zawierać dowolną kombinację słów kluczowych, zmiennych, stałych i operatorów, które dają w wyniku liczbę.
Operatory łączące Na tej stronie przedstawię Operatory łączące. Nie wdając się w szczegóły najogólniej możemy powiedzieć że operatora łączącego użyjemy jeżeli chcemy złączyć różne wartości tekstowe w jedną całość. Kiedy sklejamy np. dwa teksty używając operatora łączącego, drugi tekst jest dodawany od razu na końcu pierwszego. Podstawowym a praktycznie jedynym operatorem łączącym (czyli konkatenacji) jest &. Operator ten wymusza przeprowadzenie operacji łączenia ciągów w odniesieniu do dwóch wyrażeń. Składnia:
wynik = wyrażenie1 & wyrażenie2 • • •
wynik - element obowiązkowy, jest to dowolna zmienna typu String lub Variant. wyrażenie1 - element obowiązkowy, jest to dowolne wyrażenie. wyrażenie2 - element obowiązkowy, jest to dowolne wyrażenie.
Operator konkatenacji (&) łączy dwa łańcuchy znaków w jeden. Współdziała on nie tylko z łańcuchami znaków, ale i ze zmiennymi przechowującymi łańcuchy znaków oraz funkcjami zwracającymi łańcuchy znaków. Wiersz kodu może zawierać wiele operatorów konkatenacji. Przykład 1: Dim tekst tekst = "Witam" & " wszystkich" ' wynikiem jest "Witam wszystkich" MsgBox tekst Przykład 2: Dim tekst tekst = "Stop " & 200 & " Stop" ' wynikiem jest "Stop 200 Stop" MsgBox tekst Przykład 3: ' W przykładzie poniższym wyświetlane jest okno dialogowe, w którym użytkownik powinien wpisać swoje imię. Następnie wyświetlone jest okno komunikatu z tekstem powitania. Dim imię, powitanie imię = InputBox("Podaj swoje imię") powitanie = "Witaj " & imię & " miłej zabawy" MsgBox powitanie Celem przetestowania przykładów, umieść kod określonego przykładu np. w procedurze zdarzenia Click Przycisku polecenia. Odpowiednie kroki znajdziesz między innymi na stronie Operatory arytmetyczne.
42
Dla dociekliwych: Dla dociekliwych przedstawiam kod przykładu, który umieściliśmy w procedurze zdarzenia Workbook_Open. Procedura ta uruchamiana jest w momencie otwarcia pliku (dokumentu Excela). Private Sub Workbook_Open() Dim imię imię = InputBox("Podaj swoje imię") MsgBox "Witaj " & imię & " miłej zabawy" End Sub
Poniżej podaję skróconą wersję kroków do wykonania. • • • •
Będąc w Edytorze Visual Basic w oknie Project (Eksplorator projektów) klikamy dwa razy na obiekt ThisWorkbook. W nowo otwartym oknie kodu obiektu ThisWorkbook wstawiamy kod z przykładu. Zapisujemy i zamykamy dokument. Celem przetestowania przykładu otwieramy ponownie dokument.
Inne operatory łączące: Operator + (plus) jaką operator łączący: Jak już wspomniałem przedstawiając operatory arytmetyczne, operatora + używamy do sumowania ale możemy też użyć go jako operatora konkatenacji do łączenia łańcuchów znaków (patrz przykład poniżej). Sposób ten podaje jako ciekawostkę. Zaznaczam że dużo lepszym sposobem jest łączenie ciągów operatorem &. Przykład: Dim Wynik Wynik = "10" + "3" ' Wynikiem jest 103 MsgBox Wynik
Słownictwo: •
•
•
typ danych String - typ danych stanowiący sekwencję następujących po sobie znaków, które interpretowane są jako znaki tekstowe, a nie jako określone wartości numeryczne. Dane typu String mogą zawierać litery, cyfry, spacje i znaki przestankowe. wyrażenie - kombinacja słów kluczowych, operatorów, zmiennych i stałych, która daje w wyniku ciąg znaków, liczbę lub obiekt. Wyrażenia mogą być używane do przeprowadzania obliczeń, wykonywania operacji na znakach lub testowania danych. typ danych Variant - specjalny typ danych, które mogą oprócz danych liczbowych, ciągów znaków lub dat zawierać także wartości specjalne Empty i Null.
Uwagi: •
Operatory łączące służą do pracy z łańcuchami a konkretnie do ich łączenia. Szerzej o łańcuchach napiszę w dalszej części kursu. Dla informacji podam że każdy łańcuch symboli umieszczony (ograniczamy z obydwu stron) znakiem cudzysłowu (" ") jest traktowany jako wartość tekstowa.
43
•
Tekst w kolorze zielonym zaczynający się od znaku ' jest komentarzem i nie ma wpływu na działanie przykładów.
Operatory porównania Na tej stronie przedstawiam krótki opis chyba najczęściej używanych operatorów tj. operatory porównania. Zasady działania i zastosowania operatorów porównania to bardzo szeroki temat. Ponieważ jest to strona dla początkujących skupię się na podstawowych informacjach. VBA posiada operatory do porównywania wartości numerycznych i łańcuchów znaków. Zakładając, że porównywane wyrażenia zawierają poprawne wartości (nie zawierają wartości Null), wynikiem porównania będzie wartość True (Prawda) lub False (Fałsz). Za pomocą operatorów porównania możemy porównywać łańcuchy znaków i wartości numeryczne, ja na tej stronie przedstawię zastosowanie operatorów porównania do porównywania wartości numerycznych.
Operatory porównania stosowane w VBA: Operator < <= > >= = <>
Znaczenie
Przykład wyniku porównania
Mniejsze niż
10 < 5 ' Wynikiem jest False
Mniejsze lub równe
10 <= 5 ' Wynikiem jest False
Większe niż
10 >= 5 ' Wynikiem jest True
Większe lub równe
10 >= 5 ' Wynikiem jest True
Równe
10 = 5 ' Wynikiem jest False
Nierówne
10 <> 5 ' Wynikiem jest True
Informacyjnie tylko podam, że oprócz wymienionych wyżej operatorów VBA posiada jeszcze dwa specjalne operatory porównania. • •
Like - operator służący do porównywania łańcucha znaków ze wzorcem. Is - operator służący do sprawdzania czy dwa elementy (zmienne obiektowe) odwołują się do tego samego obiektu.
Operatorów porównania możemy użyć w standardowej instrukcji przypisania. Wynik porównania który jest przypisany do zmiennej możemy wykorzystać w wielu instrukcjach. Składnia w tym momencie dla większości operatorów (z wyjątkiem operatorów Like i Is) wygląda następującą. Składnia:
warunek = wyrażenie1 odpowiedni operator porównania wyrażenie2 • • •
warunek - element obowiązkowy, jest to dowolna zmienna numeryczna. wyrażenie1 - element obowiązkowy, jest to dowolne wyrażenie. wyrażenie2 - element obowiązkowy, jest to dowolne wyrażenie.
Poniżej przedstawiam przykład użycia operatora porównania w standardowej instrukcji przypisania
44
•
Uwaga: - dla potrzeb kursu, kod przykładu umieściłem w procedurze zdarzenia Click Przycisku polecenia. Oczywiście odpowiedni kod z przykładu możemy wykorzystać w dowolnej procedurze.
Przykład - kod przykładu: Private Sub CommandButton1_Click() On Error GoTo problem Dim Warunek As Boolean Dim Dzielna, Dzielnik, Iloraz Dzielna = Range("B2").Value Dzielnik = Range("D2").Value Warunek = Dzielnik <> 0 'Nasza instrukcja przypisania. If Warunek = True Then Iloraz = Dzielna / Dzielnik Range("F2").Value = Iloraz Else MsgBox "Dzielenie przez zero, wprowadź poprawną wartość" End If Exit Sub problem: MsgBox "Wystąpił błąd w programie. " & Err.Description & ", wprowadź poprawne wartości" End Sub Przykład - opis:
Jest to praktycznie w pełni funkcjonalny przykład w którym użyliśmy operatora <> (nierówność) w standardowej instrukcji przypisania. W przykładzie deklarujemy zmienne Dzielna, Dzielnik i Iloraz, oraz zmienną Warunek typu Boolean. Wartość zmiennej Dzielna to zawartość komórki B2 arkusza Excela, natomiast wartość zmiennej Dzielnik jest zawartością komórki D2 arkusza. W przykładzie sprawdzamy czy wartość zmiennej Dzielnik jest różna od zera, jeżeli tak jest wykonywane jest dzielenie. Wynik dzielenia wyświetlany jest w komórce F2. Dodałem też obsługę błędów gdyby użytkownik wprowadził do określonych komórek wartości inne niż numeryczne. Temat obsługi błędów jak i deklarowania zmiennych omówię w dalszej części kursu. W przykładzie wykorzystujemy również niektóre operatory przedstawione na poprzednich stronach kursu.
Możemy też użyć operatorów porównania bezpośrednio w instrukcjach warunkowych. Wynik operacji porównania decyduje o tym, czy dany fragment kodu zostanie wykonany. Poniżej przedstawiam przykład użycia operatora porównania bezpośrednio w instrukcjach warunkowych. Przykład - kod przykładu: Private Sub CommandButton1_Click() On Error GoTo problem Dim Dzielna, Dzielnik, Iloraz Dzielna = Range("B2").Value Dzielnik = Range("D2").Value If Dzielnik <> 0 Then 'Operator użyty bezpośrednio w instrukcji. Iloraz = Dzielna / Dzielnik Range("F2").Value = Iloraz Else MsgBox "Dzielenie przez zero, wprowadź poprawną wartość" End If Exit Sub problem:
45
MsgBox "Wystąpił błąd w programie. " & Err.Description & ", wprowadź poprawne wartości" End Sub Przykład - opis:
Jest to przykład praktycznie identyczny jak wyżej, różnica polega na sposobie wykorzystania operatora <> (nierówność), operator ten umieszczony jest bezpośrednio w instrukcji warunkowej.
Aby wykonać przykłady, umieść odpowiedni kod w procedurze zdarzenia Click Przycisku polecenia. Przykładowe kroki znajdziesz między innymi na stronie Operatory arytmetyczne. Następnie wprowadź wartości do komórek arkusza B2 i D2 arkusza i kliknij na przycisk.
Słownictwo: • • •
•
Boolean - typ danych przyjmujący tylko dwie wartości: True (-1) lub False (0). Zmienne typu Boolean są przechowywane jako liczby 16-bitowe (2-bajtowe). False - słowo kluczowe False (Fałsz) jest to stała wbudowana i ma wartość 0. Null - wartość wskazująca, że dana zmienna nie zawiera żadnych poprawnych danych. Wartość ta jest wynikiem jawnego przypisania wartości Null do danej zmiennej lub wynikiem dowolnej operacji przeprowadzonej pomiędzy wyrażeniami zawierającymi wartość Null. True - słowo kluczowe True (Prawda) jest to stała wbudowana i ma wartość -1.
Operatory logiczne Operatory logiczne - operatory stosowane do wykonywania operacji logicznych. Operator logiczny sprawdza wartość (True lub False) każdego z dwóch podwyrażeń wyrażenia warunkowego, a następnie określa (w zależności od operacji logicznej) końcowy wynik wyrażenia. VBA posiada kilka operatorów logicznych (z tego co wiem sześć), na tej stronie przedstawię dwa z nich tj. operator And i Or. •
•
And - operator ten służy do wyznaczania iloczynu logicznego dwóch wyrażeń (Koniunkcja). Przy zastosowaniu tego operatora zwracana jest wartość True (Prawda) jeżeli oba podwyrażenia mają wartość True. W innym wypadku zwracana jest wartość False (Fałsz). Inaczej mówiąc jeżeli wyrażenie z lewej strony operatora jest prawdą i wyrażenie z prawej strony jest prawdą to całe wyrażenie jest prawdą. Or - Operator ten służy do wyznaczania sumy logicznej dwóch wyrażeń (Alternatywa). Przy zastosowaniu tego operatora zwracana jest wartość True wystarczy że jedno z podwyrażeń ma wartość True. Czyli jeżeli wyrażenie z lewej strony operatora jest prawdą lub wyrażenie z prawej strony jest prawdą to całe wyrażenie jest prawdą. Oczywiście jeżeli oba podwyrażenia są zgodne z prawdą to całe wyrażenie zwróci wartość True.
Tabela operatory logiczne And i Or: Operator And
Or
Opis
Przykład zwracania wyniku
Zwracana jest wartość True tylko jeżeli oba podwyrażenia mają wartość True
10 10 10 10
> > < <
5 5 5 5
And And And And
10 10 10 10
Zwracana jest wartość True, wystarczy aby
10 > 5 Or 10 + 5 = 15 ' Wynikiem jest True 10 > 5 Or 10 + 5 = 16 ' Wynikiem jest True
46
+ + + +
5 5 5 5
= = = =
15 16 15 16
' ' ' '
Wynikiem Wynikiem Wynikiem Wynikiem
jest jest jest jest
True False False False
jedną z podwyrażeń ma wartość True
10 < 5 Or 10 + 5 = 15 ' Wynikiem jest True 10 < 5 Or 10 + 5 = 16 ' Wynikiem jest False
Użycie: Operatorów logicznych możemy użyć w standardowej instrukcji przypisania. Wynik operacji logicznej który jest przypisany do zmiennej możemy wykorzystać w wielu instrukcjach. Składnia w tym momencie wygląda podobnie jak przy operatorach porównania. Składnia:
warunek = wyrażenie1 odpowiedni operator logiczny wyrażenie2 • • •
warunek - element obowiązkowy, jest to dowolna zmienna numeryczna. wyrażenie1 - element obowiązkowy, jest to dowolne wyrażenie. wyrażenie2 - element obowiązkowy, jest to dowolne wyrażenie.
Możemy też użyć operatorów logicznych bezpośrednio w instrukcjach warunkowych. Wynik operacji logicznej decyduje o tym, czy dany fragment kodu zostanie wykonany.
Przykład: W przykładzie przedstawiam sposób zastosowania operatorów And i Or. Operatora And zastosowaliśmy w standardowej instrukcji przypisania, zaś operatora Or użyliśmy bezpośrednią w instrukcji warunkowej. •
Uwaga: - dla potrzeb kursu, kod przykładu umieściłem w procedurze zdarzenia Click Przycisku polecenia. Oczywiście odpowiedni kod z przykładu możemy wykorzystać w dowolnej procedurze.
Przykład - kod przykładu: Private Sub CommandButton1_Click() On Error GoTo problem Dim Warunek As Boolean Dim Długość, Szerokość, Pole Długość = Range("B2").Value Szerokość = Range("D2").Value Warunek = Długość > 0 And Szerokość > 0 'Operator And użyty w instrukcji przypisania. If Warunek = True Then If Długość > 100 Or Szerokość > 100 Then 'Operatora Or użyty bezpośrednią w instrukcji warunkowej. MsgBox "Wprowadź poprawne wartości" Else Pole = Długość * Szerokość Range("F2").Value = Pole End If Else MsgBox "Wprowadź wartości większe od zera" End If Exit Sub problem: MsgBox "Wystąpił błąd w programie. " & Err.Description & "Wprowadź poprawne wartości"
47
End Sub Przykład - opis:
W przykładzie obliczamy pole powierzchni. Na początku deklarujemy zmienne Długość, Szerokość i Pole, oraz zmienną Warunek typu Boolean. Wartość zmiennej Długość to zawartość komórki B2 arkusza Excela, natomiast wartość zmiennej Szerokość jest zawartością komórki D2 arkusza. W przykładzie za pomocą operatora And sprawdzamy czy wartości zmiennej Długość i Szerokość są większe od zera. Dodatkowo za pomocą operatora Or określamy górne granice zmiennych Długość i Szerokość czyli górne granice długości boków. Jeżeli określone warunki są spełnione wykonywane jest mnożenie i obliczane pole powierzchni. Wynik mnożenia wyświetlany jest w komórce F2. Dodałem też obsługę błędów gdyby użytkownik wprowadził do określonych komórek wartości inne niż numeryczne. Temat obsługi błędów jak i deklarowania zmiennych omówię w dalszej części kursu. W przykładzie wykorzystujemy również niektóre operatory przedstawione na poprzednich stronach kursu.
Aby wykonać przykład, umieść odpowiedni kod w procedurze zdarzenia Click Przycisku polecenia. Przykładowe kroki znajdziesz między innymi na stronie Operatory arytmetyczne. Następnie wprowadź wartości do komórek arkusza B2 i D2 arkusza i kliknij na przycisk. Okno komunikatu funkcji MsgBox VBA posiada narzędzia do tworzenia złożonych okien dialogowych, ale jeżeli chcesz szybko utworzyć proste okno komunikatu, możesz użyć funkcji MsgBox. Funkcja MsgBox - wyświetla okno dialogowe z jednym lub więcej przyciskami i czeka na reakcję, po czym zwraca wartość typu Integer określającą który przycisk został naciśniety.
Składnia:
MsgBox(prompt[, buttons] [, title] [,helpfile, context]) W składni funkcji MsgBox argumenty zawarte w nawiasach prostokątnych są nieobowiązkowe. Samych nawiasów prostokątnych nie należy umieszczać w kodzie programu pisanego w języku Visual Basic. Dla funkcji MsgBox jedynym argumentem, który trzeba podać jest tekst wyświetlany w oknie (argument prompt). Nawiasów okrągłych używamy jeżeli funkcja jest przypisana do zmiennej. Funkcja MsgBox ma następujące argumenty: •
•
prompt - argument obowiązkowy, wyrażenie znakowe wyświetlane jako komunikat w oknie dialogowym. Maksymalna długość prompt wynosi około 1024 znaki, zależnie od szerokości znaków w zastosowanej czcionce. Jeśli prompt składa się z kilku wierszy, należy je rozdzielić wstawiając znak powrotu karetki Chr(13) lub znak nowego wiersza Chr(10) albo kombinację znaków powrót karetki i nowy wiersz Chr(13) & Chr(10). Jeżeli chcemy wyświetlić zwykły tekst musimy go umieścić w cudzysłowie " ". Możemy też wyświetlić inne wartości, które wcześniej przypisaliśmy do zmiennej, wtedy wpisujemy nazwę zmiennej (bez cudzysłowu). Jeżeli treść komunikatu ma się składać z kilku ciągów musimy je połączyć operatorem &. buttons - argument nieobowiązkowy, wyrażenie numeryczne określające liczbę i typ wyświetlanych przycisków, rodzaj i styl używanych ikon, identyfikator domyślnego przycisku oraz modalność okna komunikatu. Brak parametru buttons spowoduje przyjęcie wartości domyślnej równej 0 (zero). W dalszej części podaje ustawienia argumentu buttons. 48
•
• •
title - argument nieobowiązkowy, wyrażenie znakowe wyświetlane na pasku tytułu okna dialogowego. Brak argumentu title spowoduje, że na pasku tytułu zostanie umieszczona nazwa aplikacji. helpfile - argument nieobowiązkowy, wyrażenie znakowe określające plik Pomocy zawierający pomoc kontekstową. Argument helpfile musi być zawsze podany z argumentem context. context - argument nieobowiązkowy, wyrażenie numeryczne określające identyfikator tematu w pliku Pomocy. Jeśli podany jest argument context, to musi być również podany argument helpfile.
Okno komunikatu utworzone za pomocą funkcji MsgBox oprócz tekstu może zawierać jedną z kilku ikon oraz jeden z kilku zestawów przycisków. To, jaką ikonę i jaki zestaw przycisków zawiera okno komunikatu, zależy od wartości przekazanej do parametru buttons. Przy określaniu parametru buttons możemy korzystać z wartości numerycznych jak i ze stałych. Argument buttons ma następujące ustawienia: Stała
Wartość
Opis
vbOKOnly
0
Wyświetl tylko przycisk OK.
VbOKCancel
1
Wyświetl przycisk OK i Anuluj.
VbAbortRetrylgnore
2
Wyświetl przycisk Przerwij, Ponów i Ignoruj.
VbYesNoCancel
3
Wyświetl przyciski Tak, Nie i Anuluj.
VbYesNo
4
Wyświetl przycisk Tak i Nie.
VbRetryCancel
5
Wyświetl przyciski Ponów i Anuluj.
VbCritical
16
Wyświetl ikonę Komunikat krytyczny.
VbQuestion
32
Wyświetl ikonę Pytanie ostrzegawcze.
VbExclamation
48
Wyświetl ikonę Komunikat ostrzegawczy.
VbInformation
64
Wyświetl ikonę Komunikat informacyjny.
VbDefaultButton1
0
Domyślnym przyciskiem jest przycisk pierwszy.
VbDefaultButton2
256
Domyślnym przyciskiem jest przycisk drugi.
VbDefaultButton3
512
Domyślnym przyciskiem jest przycisk trzeci.
VbDefaultButton4
768
Domyślnym przyciskiem jest przycisk czwarty.
VbApplicationModal
0
Okno modalne w aplikacji; działanie bieżącej aplikacji zostanie wstrzymane, dopóki użytkownik nie odpowie na wyświetlony komunikat.
VbSystemModal
4096
Okno modalne w systemie; działanie wszystkich aplikacji zostanie wstrzymane, dopóki użytkownik nie odpowie na wyświetlony komunikat.
Ustawienia wartości argumentu buttons możemy podzielić na kilka grup. Pierwsza grupa wartości od 0 do 5 opisuje liczbę i typ przycisków. Druga grupa 16, 32, 48, 64 opisuje rodzaje ikon. Trzecia grupa 0, 256, 512 określa domyślny przycisk okna. Czwarta grupa 0, 4096 definiuje modalność okna komunikatu. Uwaga - tworząc wartość argumentu buttons, z każdej grupy należy wybrać tylko jedną wartość i te wartość zsumować.
49
Wartości zwracane przez funkcje MsgBox: Funkcja MsgBox po kliknięciu na odpowiedni przycisk w wyświetlanym oknie komunikatu zwraca określoną wartość, która odpowiada naciśnietemu przyciskowi. Jeśli zwracana wartość ma zostać zignorowana, zamiast funkcji MsgBox możemy użyć instrukcji MsgBox. Należy pominąć nawiasy, podać listę argumentów i nie przypisywać wyniku do zmiennej. Na przykład: MsgBox "Zakończono zadanie", 0, "Okno zadania"
Aby wykorzystać wartość zwracaną przez funkcję, należy umieścić argumenty w nawiasach i przypisać zwracaną wartość do zmiennej. Odp = MsgBox("Czy jesteś zadowolony ze swoich zarobków?", 4, "Pytanie 3")
Wartość zwracana określa który przycisk został naciśnięty, wartość ta jest liczbą całkowitą ale możemy również korzystać ze stałych przedstawionych poniżej. Jeżeli zatem użytkownik kliknie przycisk Anuluj funkcja MsgBox zwróci wartość 2 i stałą vbCancel. Poniżej przedstawiam wartości zwracane przez funkcję MsgBox. Stała
Wartość
Opis
vbOK
1
Naciśnięto przycisk OK.
vbCancel
2
Naciśnięto przycisk Anuluj.
vbAbort
3
Naciśnięto przycisk Przerwij.
vbRetry
4
Naciśnięto przycisk Ponów.
vbIgnore
5
Naciśnięto przycisk Ignoruj.
vbYes
6
Naciśnięto przycisk Tak.
vbNo
7
Naciśnięto przycisk Nie.
Zastosowanie: Funkcje MsgBox możemy wykorzystać na wiele sposobów np: podając informację, ostrzegając o czymś czy dając użytkownikowi możliwość wyboru sposobu dalszego działania programu. Poniżej przedstawiam kilka kodów przykładów, oczywiście kody z przykładów umieszczamy w odpowiedniej procedurze. Przykład 1: MsgBox "Witaj" ' Wyświetlane jest okno komunikatu z komunikatem Witaj. Przykład 2: MsgBox "Witaj" & " Przyjacielu" ' Wyświetlane jest okno komunikatu z komunikatem Witaj Przyjacielu. Do połączenia wyrazów użyliśmy operatora &. Przykład 3: MsgBox "Witaj" & Chr(10) & "Przyjacielu" ' Wyświetlane jest okno komunikatu z komunikatem umieszczonym w dwóch wierszach: górny to słowo Witaj dolny słowo Przyjacielu. Dla osiągnięcia tego efektu zastosowaliśmy znak nowego wiersza Chr(10), do połączenia wyrazów wykorzystaliśmy też operator łączący &.
50
Przykład 4: MsgBox "Witaj", , "dzono4" ' Wyświetlane jest okno komunikatu z komunikatem Witaj a na pasku tytułu napis dzono4. Pominęliśmy wartość argumentu buttons stawiając sam przecinek, brak tego parametru spowoduje przyjęcie wartości domyślnej 0. Przykład 5: MsgBox "Witaj", VbOKCancel, "dzono4" ' Wyświetlane jest okno komunikatu z komunikatem Witaj i dwoma przyciskamy Ok i Anuluj. Na pasku tytułu napis dzono4. Parametr buttons określa stała VbOKCancel. Przykład 6: MsgBox "Witaj", 321, "dzono4" ' W przykładzie argumeny buttons jest określony za pomącą wartości liczbowych. Dla przypomnienia dodam, że z każdej grupy ustawień argumentu buttons należy wybrać tylko jedną wartość i te wartość zsumować. Proponuję zastanowić się dlaczego niektóre ustawienia wartości argumentu buttons mają wartość 0. Przykład 7: MsgBox "Czy jesteś zadowolony ze swoich zarobków?", VbYesNo + VbInformation + VbDefaultButton1, "Kierownik" ' Wyświetlane jest okno komunikatu z pytaniem, dwoma przyciskami Tak i Nie oraz ikona Komunikat informacyjny. Na pasku tytułu napis Kierownik, domyślnym przyciskiem jest przycisk pierwszy (Tak). Przykład 8: Dim Kom, Styl, Tytul Kom = "Czy jesteś zadowolony ze swoich zarobków?" Styl = VbYesNo + VbInformation + VbDefaultButton1 Tytul = "Kierownik" MsgBox Kom, Styl, Tytul ' Przykład ten wyświetla okno komunikatu identyczne jak wyżej, różnica polega na formie zapisu. Deklarujemy zmienne i określamy wartości, wartości przypisujemy zmiennym. Jako argumenty funkcji MsgBox wpisujemy nazwy zmiennych. Przykład 9: Dim Odp, Kom, Styl, Tytul Kom = "Czy jesteś zadowolony ze swoich zarobków?" Styl = VbYesNo + VbInformation + VbDefaultButton1 Tytul = "Kierownik" Odp = MsgBox (Kom, Styl, Tytul) 'Przykład ten wyświetla okno komunikatu identyczne jak wyżej. Jak wiemy funkcja MsgBox zwraca argumenty, które możemy w jakiś sposób wykorzystać. Aby wykorzystać wartość zwracaną przez funkcję należy przypisać tę funkcję do zmiennej i ująć argumenty w nawiasy, jak pokazaną w tym przykładzie. Jeżeli nie przypiszemy funkcji do zmiennej a argumenty zostaną ujęte w nawiasy, instrukcja spowoduje błąd składniowy. Przykład 10: Dim Odp Odp = MsgBox ("Czy jesteś zadowolony ze swoich zarobków?", VbYesNo + VbInformation + VbDefaultButton1, "Kierownik") 'Przykład taki sam jak wyżej tylko lecz w innym wydaniu.
51
Przykład 11: Dim Odp Odp = MsgBox ("Czy jesteś zadowolony ze swoich zarobków?", VbYesNo + VbInformation + VbDefaultButton1, "Kierownik") If Odp = 6 Then MsgBox "To dobrze", , "Kierownik" Else MsgBox "Fatalnie", , "Kierownik" End If 'W tym przykładzie wykorzystaliśmy wartości zwracane przez funkcję MsgBox. Jeżeli użytkownik kliknie na przycisk Tak wyświetlany jest komunikat To dobrze, po kliknięciu na przycisk Nie wyświetlany jest komunikat Fatalnie . Oczywiście wartości zwracane przez funkcję MsgBox możemy wykorzystać na wiele sposobów, zależy to przede wszystkim od wiedzy i pomysłowości użytkownika.
Opisane wyżej przykłady możemy przetestować w następujący sposób: Uwaga: - dla potrzeb kursu, określony kod przykładu umieściłem w procedurze zdarzenia Click Przycisku polecenia. Oczywiście odpowiedni kod z przykładu możemy wykorzystać w dowolnej innej procedurze. • • • •
• •
Uruchom Microsoft Excel. Z menu Widok wybieramy Paski narzędzi a następnie Przybornik formantów (jeżeli nie jest widoczny). W Przyborniku formantów wyszukaj i kliknij na ikonę Przycisk polecenia a następnie miejsce w arkuszu gdzie chcesz go umieścić. Ikona Tryb projektowania w przyborniku powinna się uaktywnić. Kliknij dwa razy lewym przyciskiem myszy na wstawiony przycisk (ikona Tryb projektowania w przyborniku powinna być aktywna). Powinien uruchomić się Edytor Visual Basic z widocznym oknem Kod programu (Code), w oknie tym zawarta powinna być deklaracja procedury Click naszego Przycisku polecenia. W procedurze zdarzenia Click Przycisku polecenia wpisz kod z określonego przykładu. Przykładowy kod może wyglądać:
Private Sub CommandButton1_Click() MsgBox "Witaj", VbOKCancel, "dzono4" End Sub • •
Pozamykaj wszystkie okienka, zapisz i zamknij dokument. Po ponownym otwarciu (z opcją Włącz makra), kliknij na Przycisk polecenia i przetestuj działanie przykładu.
Słownictwo: •
stała - element o nadanej nazwie, który zachowuje stałą wartość przez cały czas działania programu. Każda aplikacja główna może definiować własny zestaw stałych. Dodatkowe stałe mogą być definiowane przez użytkownika za pomocą instrukcji Const. Stałych można użyć w dowolnym miejscu kodu programu zamiast ich rzeczywistych wartości.
Okno dialogowe funkcji InputBox Jeżeli chcemy szybko utworzyć proste okno do pobierania danych od użytkownika możemy użyć funkcji InputBox. Za pomocą funkcji InputBox użytkownik może przekazać programowi dowolną wartość wprowadzoną z klawiatury.
52
Funkcja InputBox wyświetla okno dialogowe z polem tekstowym i dwoma przyciskamy, po czym zwraca typ danych String będący zawartością pola tekstowego. Typ danych String stanowi sekwencję następujących po sobie znaków, które interpretowane są jako znaki tekstowe, a nie jako określone wartości numeryczne. Należy o tym pamiętać, gdy oczekujemy wprowadzenia cyfr używanych do obliczeń i w razie czego dokonać konwersji za pomocą funkcji Val. Kliknięcie przycisku OK lub naciśnięcie klawisza ENTER powoduje, że funkcja InputBox zwraca zawartość pola tekstowego. Funkcja zwróci ciąg o zerowej długości (""), jeśli klikniemy przycisk Anuluj.
Składnia:
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [,helpfile, context]) W składni funkcji InputBox argumenty zawarte w nawiasach prostokątnych są nieobowiązkowe. Samych nawiasów prostokątnych nie należy umieszczać w kodzie programu pisanego w języku Visual Basic. Dla funkcji InputBox jedynym argumentem, który trzeba podać jest tekst wyświetlany w oknie (argument prompt). Funkcja InputBox ma następujące argumenty: •
•
• •
•
• •
prompt - argument obowiązkowy, wyrażenie znakowe wyświetlane jako komunikat w oknie dialogowym. Maksymalna długość prompt wynosi około 1024 znaki, zależnie od szerokości znaków w zastosowanej czcionce. Jeśli prompt składa się z kilku wierszy, należy je rozdzielić wstawiając znak powrotu karetki Chr(13) lub znak nowego wiersza Chr(10) albo kombinację znaków powrót karetki i nowy wiersz Chr(13) & Chr(10). title - argument nieobowiązkowy, wyrażenie znakowe wyświetlane na pasku tytułu okna dialogowego. Brak argumentu title spowoduje, że na pasku tytułu zostanie umieszczona nazwa aplikacji. default - argument nieobowiązkowy, wyrażenie znakowe wyświetlane w polu tekstowym (jeśli nie zostanie podany inny tekst). Brak parametru default spowoduje, że pole tekstowe będzie puste. xpos - argument nieobowiązkowy, wyrażenie numeryczne określające w jednostkach zwanych "twips", odległość lewej krawędzi okna dialogowego od lewej krawędzi ekranu. Brak argumentu xpos spowoduje, że okno dialogowe zostanie umieszczone w równej odległości od lewej i prawej krawędzi ekranu. ypos - argument nieobowiązkowy, wyrażenie numeryczne określające w jednostkach zwanych "twips", odległość górnej krawędzi okna dialogowego od górnej krawędzi ekranu. Brak argumentu ypos spowoduje, że okno dialogowe zostanie umieszczone na poziomie dwóch trzecich wysokości ekranu. helpfile - argument nieobowiązkowy, wyrażenie znakowe określające plik Pomocy zawierający pomoc kontekstową. Argument helpfile musi być zawsze podany z argumentem context. context - argument nieobowiązkowy, wyrażenie numeryczne określające identyfikator tematu w pliku Pomocy. Jeśli podany jest argument context, to musi być również podany argument helpfile.
Zastosowanie: Za pomocą funkcji InputBox możemy uzyskać informacje od użytkownika które w jakiś sposób możemy wykorzystać. Aby wykorzystać informacje podane przez użytkownika, wartość zwróconą przez funkcję InputBox, czyli tekst wpisany w polu tekstowym okna dialogowego przypisujemy do zmiennej. Poniżej przedstawiam kilka przykładów zastosowani funkcji InputBox. Oczywiście kody z przedstawionych poniżej przykładów umieszczamy w odpowiedniej procedurze. 53
Przykład 1: Dim wartosc wartosc = InputBox("Podaj swoje imię") 'Wyświetlane jest okno dialogowe z zapytaniem o imię użytkownika. Przykład 2: Dim wartosc wartosc = InputBox("Podaj swoje imię", "dzono4") 'Wyświetlane jest okno dialogowe z zapytaniem o imię użytkownika. Na pasku tytułu okna dialogowego wyświetlony jest napis dzono4. Przykład 3: Dim wartosc wartosc = InputBox("Podaj swoje imię", "dzono4", "janek") 'Wyświetlane jest okno dialogowe z zapytaniem o imię użytkownika. Na pasku tytułu okna dialogowego wyświetlony jest napis dzono4. W polu tekstowym wyświetlana jest wartość domyślna tj. janek. Przykład 4: Dim wartosc wartosc = InputBox("Podaj imię", "dzono4", "janek", 500, 500) 'Wyświetlane jest okno dialogowe z zapytaniem o imię użytkownika, Na pasku tytułu okna dialogowego wyświetlony jest napis dzono4. W polu tekstowym wyświetlana jest wartość domyślna tj. janek. Określamy też położenie okna na ekranie. Przykład 5: Dim wartosc wartosc = InputBox("Podaj imię", "dzono4", "janek", 500, 500) Range("B2").Value = wartosc 'Przykład identyczny jak wyżej, wartość zwrócona przez okno dialogowe wpisywana jest do komórki B2 arkusza Excela. Przykład 6: Dim wartosc wartosc = InputBox("Podaj imię", "dzono4", "janek", 500, 500) If wartosc = "" Then wartosc = "bezimienny" MsgBox "Witaj " & wartosc & " życzę przyjemnej zabawy", vbInformation, "dzono4" 'przykład podobny jak wyżej, wartość zwrócona przez okno dialogowe wykorzystaliśmy do wyświetlenia okna komunikatu z powitaniem.Jeżeli chcemy aby okno dialogowe ukazywało się w momencie otwarcia dokumentu Excela, kod przykładu należy umieścić w zdarzeniu Workbook_Open() naszego dokumentu. Przykład 7: Dim haslo, ciag haslo = "lufa" ciag = InputBox("Wpisz hasło") If ciag = haslo Then MsgBox "Podałeś prawidłowe hasło" ' następne instrukcje programu. Else MsgBox "hasło nieprawidłowe" End
54
End If 'W przykładzie tym pytamy użytkownika o hasło. Jeżeli użytkownik poda prawidłowe hasło (w naszym przypadku lufa), wyświetlane jest okno komunikatu z tekstem: Podałeś prawidłowe hasło. Jeżeli wpiszemy nieprawidłowe hasło, wyświetlany jest komunikat że hasło jest nieprawidłowe i następuje przerwanie działania programu. Przykład 8: On Error GoTo anuluj Dim DataPodana As Date Dim kom DataPodana = InputBox("Wprowadź datę w formacie " & Date, , Date) kom = "Liczba dni od dzisiaj: " & DateDiff("d", Date, DataPodana) MsgBox kom Exit Sub anuluj: MsgBox "Nie podałeś odpowiedniej daty, operacja anulowana" 'Kod przykładu oblicza ilość dni pomiędzy aktualną datą a datą wprowadzoną za pomocą okna dialogowego wyświetlanego przez funkcje InputBox. Dodałem też obsługę błędów jeżeli np. użytkownik naciśnie przycisk Anuluj czy pozostawi pole bez wartości.
Celem przetestowania przykładów, umieść kod określonego przykładu np. w procedurze zdarzenia Click Przycisku polecenia. Odpowiednie kroki znajdziesz między innymi na stronie Okna komunikatów.
Formularze Na poprzednich stronach poznaliśmy okna komunikatów utworzone za pomocą funkcji MsgBox i okna dialogowe utworzone za pomocą funkcji InputBox. Jeżeli jednak okna te nie spełniają potrzeb programu możemy utworzyć formularz z formantami i dodać do niego kod VBA. •
•
Formularz - okno lub okno dialogowe. Możemy powiedzieć że formularze są kontenerami dla
formantów. Formularz jest obiektem, oznacza to że posiada on właściwości, metody i reaguje na zdarzenia. W edytorze VBA formularz nosi nazwę UserForm. Formant - obiekt, który można umieścić na formularzu, posiadający własny zestaw rozpoznawalnych właściwości, metod i zdarzeń. Formantów można używać do pobierania i wyświetlania danych oraz wyzwalania procedur obsługi zdarzeń. Większością formantów można operować używając metod. Niektóre formanty są interaktywne (reagują na akcje użytkownika), podczas gdy inne są statyczne (dostępne tylko poprzez kod programu).
Tworzenie formularza: Aby utworzyć nowy formularz należy uruchomić edytor VBA i z jego poziomu: • •
Z menu Insert (Wstaw) wybieramy opcję UserForm (UserForm). Inny sposób to w oknie Project (Projekt) klikamy prawym przyciskiem myszy nazwę projektu. Z menu kontekstowego wybieramy pozycję Insert (Wstaw) a następnie opcję UserForm (UserForm).
W oknie edytora pojawi się nowy (czysty, czyli bez formantów) formularz oraz przybornik (pasek narzędzi) o nazwie ToolBox. Przybornik ten zawiera właśnie formanty które możemy dodać do formularza. Dla własnej wygody, formularz jak i przybornik możemy odpowiednią rozmieścić w edytorze VBA. Technicznie okna te można przesunąć tak jak każde okno systemu Windows. Zakładając że mamy widoczne okna Project i Properties, całość powinna wyglądać mniej więcej tak. 55
Dodawanie formantów do formularza: Do formularza można dodać formanty czyli obiekty znajdujące się w przyborniku Toolbox. Pasek narzędzi Toolbox pojawia się na ekranie wraz z nowo utworzonym formularzem. Jeżeli klikniemy okno Properties (Właściwości) lub Project (Projekt), przybornik zostanie ukryty. Aby ponownie wyświetlić przybornik klikamy na formularz czy formant umieszczony na formularzu. Aby dodać nowy formant do formularza wykonaj czynności: • •
• •
Na przyborniku Toolbox klikamy przycisk oznaczający formant który chcemy umieścić na przykład duże A czyli Label (Etykieta). Przesuwamy kursor nad formularz w miejsce gdzie chcemy aby znajdował się nasz obiekt. Gdy przesuniemy kursor na formularz przybierze on kształt plus. Kursorowi towarzyszy symbol wybranego formantu. Wciskamy i przytrzymujemy lewy przycisk myszy, ciągniemy kursorem obserwując kreślony na formularzu zarys formatu. W chwili gdy formant osiągnie planowane wymiary zwalniamy przycisk myszy.
Właściwości formularzy i formantów: Formularze i formanty (podobnie jak inne obiekty), posiadają właściwości określające ich wygląd i sposób działania. Właściwości opiszę w dalszej części kursu na razie przedstawię kilka podstawowych informacji. Wartości właściwości możemy odczytywać i modyfikować za pomocą kodu VBA lub w oknie Properties (Właściwości). Okno to wyświetla właściwości opisujące zaznaczony (aktywny) obiekt. Czyli jeżeli zaznaczymy (klikniemy) na formularz okno Properties wyświetli właściwości formularza. Gdy zmienimy 56
zaznaczenie klikając na jakiś formant na formularzu lub na inny obiekt na przykład w oknie Project, to okno Properties wyświetli właściwości tego obiektu. Więcej informacji na temat okna Properties znajdziesz na stronie: Edytor Visual Basic. Poniżej przedstawiam przykładowy sposób odczytywania i zmiany właściwości za pomocą okna Properties. • • •
Jeżeli nie jest widoczne, wyświetl okno Properties ( naciskając na przykład F4). Zaznacz (kliknij) obiekt którego właściwości chcesz wyświetlić, może to być nasz formularz. W kolumnie z lewej strony okna Properties znajdź na liście określono właściwość na przykład Name. W polu obok umieszczona jest wartość tej właściwości, wpisz tam nową wartość na przykład frmWitaj.
Sposób zmiany właściwości zależy od jej rodzaju. Możemy wpisać nową wartość czy wybrać ją z listy lub z okna dialogowego.
metody:
Metoda jest akcją, którą może wykonać obiekt lub którą wykonujemy na obiekcie. Najogólniej możemy powiedzieć że metoda to procedura związana z konkretnym obiektem. Ponieważ kod metody jest częścią obiektu, obiekt że tak powiem wie co ma robić kiedy wywołamy określoną metodę. Oczywiście różne obiekty mogą posiadać i wykonywać różne metody. Wyświetlanie formularza za pomocą metody Show: Jeżeli chcemy wyświetlić formularz podczas działania programu w momencie w jakim wymaga tego program (ustalonym przez programistę) możemy użyć metody Show. Aby na przykład wyświetlić formularz o nazwie (właściwość Name) frmWitaj piszemy kod: frmWitaj.Show. W dalszej części strony przedstawiam przykład zastosowania tej metody. Ukrywanie formularza z pomocą metody Hide: Aby podczas działania programu ukryć formularz na przykład po to, by użytkownik miał dostęp do narzędzi aplikacji macierzystej, użyjemy jego metody Hide. Jeżeli chcemy ukryć formularz o nazwie (właściwość Name) frmWitaj piszemy kod: frmWitaj.Hide. W dalszej części strony przedstawiam przykład zastosowania tej metody.
Zdarzenia: Formularze a także ich formanty mogą reagować na różne zdarzenia na przykład naciśnięcie przycisku myszy (gdy kursor znajduje się na obiekcie). Jeżeli do wywołanego zdarzenia dodamy kod VBA to jest on wykonywany. Kod przypisany zdarzeniu związanemu z danym obiektem nazywamy procedurą zdarzenia. Formularz i formanty mogą reagować na wiele różnych zdarzeń. Na przykład formularz posiada zdarzenie Activate które zachodzi ilekroć formularz jest aktywowany. Zdarzenie to wykorzystałem w przykładzie poniżej.
Przykład: Poniżej przedstawiam przykład w którym przy uruchomieniu dokumentu Excela pokazuje się okienko, ładowany jest formularz o nazwie frmWitaj. Po upływie określonego czasu okienko znika i możemy korzystać z uruchamianego dokumentu. Forma naszego przywitania wizualnie jest bardzo skromna, możesz 57
a nawet powinieneś pod tym względem przykład ten udoskonalić. Wykorzystaj wiedzę przedstawiono na tej stronie i wykonaj kroki przedstawione poniżej. Kroki: 1. Uruchom Microsoft Excel. 2. Z menu Widok wybieramy Paski narzędzi a następnie opcje Visual Basic, (jeżeli pasek nie jest widoczny). 3. Z paska narzędzi Visual Basic wybieramy przycisk Edytor Visual Basic. 4. W nowo otwartym oknie Microsoft Visual Basic-Zeszyt1 z menu View (Widok) wybieramy kolejno opcję: o Project Explorer (Eksploator projektu) o Properties Window (Okno właściwości) Powinny się otworzyć okienka: Project-VBAProject i Properties, dla własnej wygody dopasowujemy rozmiar i położenie okienek (oczywiście punktu tego nie wykonujemy jeżeli okienka były wcześniej otwarte). 5. Wstaw nowy formularz. 6. W oknie właściwości zmieniamy właściwości naszego obiektu User Form: o Name na frmWitaj o Caption na Okienko powitalne 7. Wstaw do formularza etykietę. 8. W oknie właściwości ustawiamy właściwości etykiety: o Name na lblWitaj o Caption na WITAJ o Font na Ariar, wielkość czcionki na 18 (klikamy na wielokropek i zmieniamy właściwości) o TextAlign na fmTextAlignCenter Dopasuj ewentualnie rozmiar etykiety. 9. W oknie Project klikamy prawym przyciskiem myszy na obiekt ThisWorkbook i wybieramy opcję View Code (Pokaż kod programu). W nowo otwartym oknie klikamy na strzałkę u góry z lewej strony i wybieramy obiekt Workbook. Pomiędzy linie kodu: Private Sub Workbook_Open() i End Sub, wstawiamy (piszemy) kod: frmWitaj.Show
10. W oknie Project klikamy prawym przyciskiem myszy na obiekt frmWitaj i wybieramy opcję View Code (Pokaż kod programu). W nowo otwartym oknie klikamy na strzałkę (górna lewa) i wybieramy obiekt UserForm następnie klikamy na strzałkę (u góry) z prawej strony i wybieramy zdarzenie Activate. Pomiędzy linie kodu:Private Sub UserForm_Activate() i End Sub, wstawiamy (przepisujemy) kod: Dim Przerwa, Start Przerwa = 6 Start = Timer Do While Timer < Start + Przerwa DoEvents Loop frmWitaj.Hide
11. Pozamykaj wszystkie okienka, zapisz i zamknij arkusz. Po ponownym otwarciu (z opcją Włącz makra) przetestuj działanie programu. •
Uwaga - więcej informacji na temat działania kodu przykładu znajdziesz na stronie
http://dzono4.webpark.pl/basic/witaj.htm na której opisałem podobny przykład. 58
Właściwości Wcześniej zapoznaliśmy się już wstępnie z właściwościami obiektów, na tej stronie temat rozszerzę i opiszę niektóre z nich. Przedstawię kilka podstawowych właściwości przede wszystkim określające wygląd obiektów. •
właściwość - opatrzony nazwą atrybut obiektu. Właściwości definiują takie cechy obiektu jak
rozmiar, kolor i położenie na ekranie a także stan obiektu na przykład to czy jest on aktywny czy nieaktywny. Wartości właściwości możemy odczytywać i modyfikować za pomocą kodu VBA lub w oknie Właściwości czyli Properties. Więcej informacji na temat okna Properties znajdziesz na stronie: Edytor Visual Basic. Aby zmienić wartość własciwości w oknie Properties, w zależności od rodzaju własciwości wykonujemy jedną z nastepujących czynności: • •
•
W polu obok nazwy właściwości wpisujemy jej nową wartość. W ten sposób możemy zmieniać takie właściwości jak: Name, Caption, Width, Height, Top czy Left. Klikamy na pole obok nazwy właściwości a następnie na przycisk z grotem strzałki. Kliknięcie na przycisk powoduje wyświetlenie listy dostępnych wartości dla danej właściwości. Z listy tej wybieramy odpowiednią wartość. Za pomocą tej metody możemy ustawić na przykład: BackColor, ForeColor, Visible, TextAlign. Klikamy na pole obok nazwy właściwości (na przykład obok nazwy Font) a następnie na przycisk oznaczony wielokropkiem. Kliknięcie na przycisk powoduje wyświetlenie okna dialogowego, w oknie tym możemy ustawić odpowiednie wartości.
UWAGA: W niektórych przypadkach podwójne kliknięcie na pole obok nazwy wybranej właściwości spowoduje zmianę jej wartości (np. właściwość Visible).
Aby określić wartość właściwości za pomocą kodu VBA, stosujemy instrukcje przypisania. Z lewej strony znaku równości określamy obiekt i właściwość a z prawej podajemy wartość tej wlaściwości. W dalszej częsci strony przedstawiam kilka przykładów zastosowania tego sposobu. Oczywiście różne obiekty posiadają różne zestawy właściwości, odpowiednie dla danego typu obiektu. Właściwości obiektu często związane są z jego metodami i zdarzeniami. Na tej stronie przedstawię niektóre właściwości obiektów przede wszystkim formantów.
Name: Właściwość Name (nazwa) - jest to jeden z najważniejszych atrybutów, przechowuje wyrażenie typu ciąg znaków identyfikujące nazwę obiektu. Jeśli chodzi o nazewnictwo jest to bardzo szeroki temat powiem tylko, że prawidłowa nazwa musi być zgodna z zasadami nazywania obiektów. Nazwy są tak istotnym elementem, że w momencie gdy wstawiamy obiekt nazwa jest automatycznie generowana. Domyślną nazwą np. formantu niezwiązanego jest nazwa typu obiektu i unikatowy numer. Jeżeli np. do arkusza Excela czy do obiektu UserForm wstawimy formant Etykieta (Label), jego ustawieniem właściwości Name będzie Label1. Jeżeli wstawimy następną Etykietę będzie to Label2 itd. Trzeba jednak zauważyć że nazywanie obiektów według wyżej opisanej konwencji szczególnie budując duże projekty może być bardzo mylące. Na przykład jeśli dodamy dziesięć etykiet to jak zapamiętać akcję, która jest "podczepiona" pod etykietę Label9 ?. Sztuczka polega na tym że można zastąpić nazwy automatycznie nadawane własnymi. Ale jak nadać najlepszą nazwę ?. Istnieje pewna konwencja stosowana w Visual Basic 6, którą ja też stosuję w VBA. Otóż nazwa powinna zawierać skrót identyfikujący typ formantu i nazwę zaczynającą się z dużej litery opisującą do czego formant nam służy. Wstawiając np. 59
Przycisk polecenia (CommandButton), który ma wykonywać akcję obliczania czegoś nadajemy mu nazwę cmdOblicz. Poniżej przedstawiam najczęściej dodawane przedrostki do nazw obiektów: Obiekt
Przedrostek
Przykład
Etykieta (Label)
lbl
lblPowitanie
Przycisk poleceń (CommandButton)
cmd
cmdUruchom
Pole tekstowe (TextBox)
txt
txtWiek
Obraz (Image)
img
imgTata
Formularz (UserForm)
frm
frmHaslo
Właściwość Name czyli nazwę obiektu możemy ustawić w oknie Properties (Właściwości). Nazwa obiektu jest używana w kodzie VBA w czasie działania programu np. do zmiany innej właściwości danego obiektu lub uruchomienia jego metody.
Caption: Właściwość Caption (tytuł) - określa jaki tekst jest wyświetlany przez obiekt. Właściwość tą posiadają takie formanty jak np. etykieta, przycisk poleceń, pole wyboru, przycisk przełącznika czy obiekt UserForm. Dla formularza właściwość Caption (czyli tytuł) wyświetlana jest w jego pasku tytułu. Właściwość tą można ustawić za pomocą okna Properties (Właściwości) lub kodu VBA. Sposób zmiany właściwości za pomocą okna Properties poznaliśmy już wcześniej. Aby określić (zmienić) właściwość Caption za pomocą kodu VBA, podczas działania programu możemy napisać: lblKomunikat.Caption = "Limit przekroczony"
Powyższa linia kodu spowoduje, że etykieta o nazwie (właściwość Name) lblKomunikat będzie wyświetlała test: Limit przekroczony. Oczywiście kod umieszczamy w odpowiedniej procedurze.
BackColor: Właściwość BackColor (kolor tła) - określa nam kolor wnętrza obiektu. Właściwość tą możemy zmienić w oknie Properties (Właściwości) lub za pomocą kodu VBA wykorzystując funkcję QBColor lub RGB. lblKomunikat.BackColor = QBColor(14)
Za pomocą tej linii wykorzystując funkcję QBColor określamy kolor tła naszej etykiety lblKomunikat na żółty.
ForeColor: Właściwość ForeColor (kolor tekstu) - określa kolor tekstu wyświetlanego przez formant. Właściwość te możemy zmienić w oknie Properties (Właściwości) lub za pomocą kodu VBA wykorzystując funkcję QBColor lub RGB. lblKomunikat.ForeColor = RGB(255, 0, 0)
60
Za pomocą funkcji RGB określamy kolor wyświetlanego tekstu przez nasz formant na czerwony.
Width: Właściwość Width (szerokość) - określa szerokość obiektu (formantu). Właściwość tą możemy określić w oknie Properties (Właściwości) lub za pomocą kodu VBA. Poniżej przedstawiam przykład ustawienia tej właściwości za pomocą kodu VBA. lblKomunikat.Width = 240
Height: Właściwość Height (wysokość) - określa wysokość obiektu (formantu). Właściwość tą możemy określić w oknie Properties (Właściwości) lub za pomocą języka VBA. Poniżej przedstawiam przykład ustawienia tej właściwości za pomocą kodu VBA. lblKomunikat.Height = 32
Top: Właściwość Top (górny) - określa położenie górnej krawędzi formatu od górnej krawędzi obiektu (arkusz Excela, obiekt UserForm) zawierającego ten formant. Właściwość tą możemy określić w oknie Properties (Właściwości) lub za pomącą języka VBA. •
Uwaga: gdy przesuwa się format, nowe ustawienie jego właściwości Top jest automatycznie wprowadzana.
Left: Właściwość Left (lewy) - określa położenie lewej krawędzi formantu od lewej krawędzi obiektu (arkusz Excela, obiekt UserForm) zawierającego ten formant. Właściwości te możemy określić w oknie Properties (Właściwości) lub za pomącą kodu VBA. •
Uwaga: gdy przesuwa się format, nowe ustawienie jego właściwości Left jest automatycznie wprowadzana.
Font: Właściwość Font (czcionka) - pozwala wybrać czcionkę z czcionek zainstalowanych w systemie. Oraz na określenie innych parametrów wybranej czcionki takich jak na przykład: styl czcionki czy wielkość. Właściwość tą możemy określić w oknie Properties (Właściwości) lub za pomącą języka VBA. Aby ustawić parametry czcionki w oknie Properties, klikamy na właściwość Font a następnie na przycisk z wielokropkiem. Powinno się otworzyć okno dialogowe w którym możemy wybrać czcionkę i określić jej właściwości. Poniżej przedstawiam jak możemy określić właściwości czcionki za pomocą języka VBA. lblKomunikat.Font.Size = 24 'Określamy wielkość czcionki na 24. lblKomunikat.Font.Bold = True 'Pogrubiamy naszą czcionkę.
61
Visible: Właściwość Visible (widoczny) - określa czy podczas działania programu formant jest widoczny. Dla tej właściwości używane są następujące ustawienia: • •
True - (domyślnie) formant jest widoczny. False - formant jest niewidoczny.
Właściwość tą możemy określić w oknie Properties (Właściwości) lub za pomącą kodu VBA. W oknie Properties klikamy na pole obok nazwy właściwości Visible a następnie na przycisk z grotem strzałki i wybieramy ustawienie. Gdy zaś chcemy zmienić właściwość Visible za pomocą kodu VBA możemy napisać: lblKomunikat.Visible = True 'Po wykonaniu tej linii kodu etykieta będzie widoczna. lblKomunikat.Visible = False 'Etykieta staje się niewidoczna. UWAGA: W trybie projektowania wszystkie formanty będą widoczne, niezależnie od ustawienia właściwości Visible.
Przykład: Pora na wykorzystanie wiedzy przedstawionej na tej stronie. Poniżej przedstawiam kod przykładu w którym zmieniamy właściwości naszej etykiety w czasie działania programu. Przykład powstał na potrzeby kursu ale możemy go też praktycznie wykorzystać. Możemy na przykład założyć że wartość w komórce D4 jest finalnym wynikiem pewnych obliczeń, może to być bilans budżetu domowego. Nasza etykieta będzie sygnalizowała różne stany tego budżetu. Kod przykładu: Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim Limit Limit = Range("D4").Value If IsNumeric(Limit) = True Then If Limit > 100 Then lblKomunikat.TextAlign = fmTextAlignCenter lblKomunikat.Caption = "Limit przekroczony" lblKomunikat.BackColor = QBColor(14) lblKomunikat.ForeColor = RGB(255, 0, 0) lblKomunikat.Height = 32 lblKomunikat.Width = 240 lblKomunikat.Font.Name = "Arial" lblKomunikat.Font.Size = 24 lblKomunikat.Font.Bold = True lblKomunikat.Visible = True ElseIf Limit > 90 Then lblKomunikat.TextAlign = fmTextAlignCenter lblKomunikat.Caption = "Granica limitu" lblKomunikat.BackColor = QBColor(14) lblKomunikat.ForeColor = RGB(0, 0, 0) lblKomunikat.Height = 16 lblKomunikat.Width = 120 lblKomunikat.Font.Name = "Arial" lblKomunikat.Font.Size = 12 lblKomunikat.Font.Bold = False lblKomunikat.Visible = True
62
Else lblKomunikat.Visible = False End If Else MsgBox "Nieprawidłowy typ danych w komórce D4" lblKomunikat.Visible = False End If End Sub
Opis przykładu: W przykładzie w zależności od zawartości komórki D4 arkusza Excela wyświetlany jest lub nie odpowiedni komunikat. Kod przykładu umieściliśmy w zdarzeniu Change arkusza Excela. Zdarzenie to zachodzi przy każdej zmianie dokonanej w arkuszu. Jeżeli wartość w komórce D4 jest mniejsza od 90, komunikat czyli nasza etykieta nie jest widoczna. Jeżeli wartość w komórce D4 zawiera się w przedziale od 91 do 100 wyświetlana jest etykieta z napisem: Granica limitu. Gdy przekroczymy wartość 100 napis się zmienia na: Limit przekroczony a etykieta staje się większa i bardziej wyrazista. Do kodu przykładu dodałem też obsługę błędów gdyby w komórce D4 była wprowadzona wartość inna niż numeryczna. Kroki: • • •
•
• • • • •
•
•
Uruchom Microsoft Excel. Z menu Widok wybierz Paski narzędzi a następnie Przybornik formantów (jeżeli nie jest widoczny). W Przyborniku formantów wyszukaj i kliknij na ikonę Etykieta (duże A) a następnie miejsce w arkuszu gdzie chcesz ją umieścić (może to być prawa górna część ekranu, ważne jest aby nasza etykieta nie zasłaniała komórki D4 arkusza). Ikona Tryb projektowania w przyborniku powinna się uaktywnić. Kliknij prawym przyciskiem myszy na etykiecie (etykieta powinna być zaznaczona jeżeli nie jest wcześniej zaznaczamy ją klikając na niej lewym przyciskiem myszy). Z otwartego menu wybieramy Właściwości, powinno się otworzyć okno Właściwości, w oknie tym zmieniamy następujące właściwości etykiety: o Name na lblKomunikat o Visible na False Zamknij okno Właściwości. Z paska narzędzi Visual Basic wybieramy ikonę Edytor Visual Basic, powinno się otworzyć okno Microsofot Visual Basic.... W oknie tym z menu View (Widok) wybieramy Project Explorer (Eksploator projektu), oczywiście jeżeli okno nie jest widoczne. W Oknie Eksplorator projektu klikamy dwa razy na obiekt Arkusz1 (Arkusz1), powinno nam się otworzyć okno kodu programu naszego Arkusza1. W nowo otwartym oknie Zeszyt1-Arkusz1(Code) klikamy na strzałkę w górnej części okna z lewej strony i wybieramy obiekt Worksheet następnie klikamy na strzałkę (u góry) z prawej strony i wybieramy zdarzenie Change. Pomiędzy linie kodu: Private Sub Worksheet_Change(ByVal Target As Excel.Range) i End Sub, wstawiamy (przepisujemy) pozostały kod z przykładu. Pozamykaj wszystkie okienka, zapisz i zamknij dokument. Po ponownym otwarciu z opcją Włącz makra, przetestuj działanie programu. Oczywiście wprowadź przykładowe wartości do komórki D4 arkusza Excela. Celem ponownego przetestowania, wpisz inne wartości do komórki D4 arkusza.
Metody Z metodami spotkałeś się już w tym kursie, przypomnij sobie stronę Formularze. Przedstawiłem na niej dwie metody operujące na formularzach, metodę Show która wyświetla formularz i metodę Hide ukrywającą formularz. Na tej stronie przedstawię kilka metod których możemy użyć bezpośrednią w arkuszu Excela. 63
•
metoda - procedura podobna do instrukcji lub funkcji, operująca na konkretnych obiektach.
Metoda jest akcją, którą może wykonać obiekt lub którą wykonujemy na obiekcie. Najogólniej możemy powiedzieć że metoda to procedura związana z konkretnym obiektem. Ponieważ kod metody jest częścią obiektu, obiekt że tak powiem wie co ma robić kiedy wywołamy określoną metodę. Oczywiście różne obiekty mogą posiadać i wykonywać różne metody.
Zastosowanie: Jak już wspomniałem metody to zadania (akcje) które dany obiekt może wykonać lub które mogą być wykonane na danym obiekcie. Za pomocą metody możemy na przykład zapisać czy wydrukować dokument, lub wyczyścić zawartość komórek arkusza. W poniższych przykładach przedstawiam kilka praktycznych zastosowań niektórych metod. Tekst kodu przykładów w kolorze zielonym zaczynający się od znaku ' jest komentarzem i nie ma wpływu na działanie przykładów. Przykład 1: Sub WyczyscWszystko() Range("A1").Clear 'Za pomocą metody Clear czyścimy zawartość i przywracamy domyślne formatowanie komórkę A1 arkusza Excela. End Sub Przykład 2: Sub WyczyscZawartosc() Range("A1").ClearContents 'Wykorzystując metodę ClearContents czyścimy tylko zawartość komórki A1 arkusza. End Sub Przykład 3: Sub WyczyscFormat() Range("A1").ClearFormats 'Korzystając z metody ClearFormats przywracamy formatowanie domyślne dla komórki A1 . End Sub Przykład 4: Sub WyczyscZakres() Range("A1:D10").ClearContents 'Czyścimy zawartość komórek z zakresu A1:D10, analogicznie możemy zastosować metody Clear i ClearFormats. End Sub Przykład 5: Sub Czyszczenie() For Each obiekt In Worksheets("Arkusz1").Range("A1:M25") If IsNumeric(obiekt.Value) = True Then If obiekt.Value < 0 Then obiekt.ClearContents End If End If Next 'Za pomocą pętli For Each...Next przeszukiwany jest zakres komórek A1:M25 arkusza Excela o nazwie Arkusz1. Korzystając z metody ClearContents czyszczona
64
jest zawartość komórek o wartościach mniejszych od 0. End Sub Przykład 6: Sub Zapisywanie() ActiveWorkbook.Save 'Metoda Save zapisuje obiekt, nasz kod powoduje zapisanie zmian w aktywnym dokumencie Excela. End Sub Przykład 7: Sub Podgląd() Worksheets("Arkusz1").PrintPreview 'Za pomocą metody PrintPreview wyświetlamy podgląd wydruku arkusza o nazwie Arkusza1. End Sub Przykład 8: Sub Drukuj() Range("B4:H22").PrintOut 'Metoda PrintOut drukuje wskazany obiekt. Powyższy kod spowoduje wydrukowanie zawartości zakresu komórek B2:H22, na domyślnej drukarce z domyślnymi (lub zdefiniowanymi wcześniej) opcjami. End Sub
Aby przetestować przykłady umieść kody z przykładów w module standardowym, jeżeli nie wiesz jak to zrobić wykonaj następujące czynności: • • • •
•
• •
Uruchom Microsoft Excel. Z menu Widok wybieramy Paski narzędzi a następnie opcje Visual Basic, (jeżeli pasek nie jest widoczny). Z paska narzędzi Visual Basic wybieramy przycisk Edytor Visual Basic. W nowo otwartym oknie Microsoft Visual Basic-Zeszyt1 z menu View (Widok) wybieramy opcję ProjectExplorer (Eksploator projektu). Powinno się otworzyć okno Project-VBAProject (ProjektVBAProject) oczywiście punktu tego nie wykonujemy, jeżeli okienko było wcześniej otwarte. Następnie w celu wstawienia nowego modułu, z menu Insert (Wstaw) wybieramy opcję Module (Moduł). Wstawiony obiekt Module1 (Moduł1) powinien się pojawić oknie Project-VBAProject. Powinno się też pojawić okno Zeszyt1-Module1(Code) (Zeszyt1-Moduł1(Kod programu)). Jeżeli okno się nie pojawi aby je uaktywnić w oknie Project-VBAProject klikamy dwa razy lewym przyciskiem myszy na obiekt Module1 (Moduł1). W nowo otwartym oknie Zeszyt1-Module1(Code) (Zeszyt1-Moduł1(Kod programu)) piszemy (wstawiamy) kody z przykładów. Zamykamy Edytor VisualBasic (Alt+Q) i powracamy do arkusza Excela.
Nasze kody możemy uruchomić na różne sposoby, ja wykorzystałem przycisk z paska narzędzi Formularze. Aby tego dokonać wykonaj następujące czynności. • • •
Z menu Widok dokumentu Excela wybieramy Paski narzędzi a następnie opcję Formularze. Z paska narzędzi Formularze wybieramy ikonę Przycisk a następnie miejsce w arkuszu gdzie chcemy go umieścić. Powinno się otworzyć okno Przypisz makro, (jeżeli okno się nie otworzy klikamy prawym przyciskiem myszy na nasz wstawiony przycisk i wybieramy opcję Przypisz makro...). W oknie tym zaznaczamy odpowiednią nazwę procedury na przykład Zapisywanie i klikamy przycisk OK. 65
•
Kliknij na jakieś miejsce w arkuszu (celem zlikwidowania zaznaczenia przycisku) a następnie na wstawiony przycisk i przetestuj działanie przykładu.
Możemy też zmienić tekst wyświetlany na przycisku, odpowiedni do wykonywanej metody. • •
Klikamy prawym przyciskiem myszy na przycisku. Z otwartego menu wybieramy opcję Edytuj tekst i zmieniamy tekst na przycisku.
Zdarzenia Podczas tworzenia programów w języku VBA często korzystamy z obiektów. Elementy aplikacji takie jak na przykład: skoroszyt, komórka, formularz czy formant są właśnie obiektami. Jak już wspomniałem wcześniej, obiekt posiada właściwości (properties), metody (methods) i zdarzenia (events). My na tej stronie zajmiemy się zdarzeniami. •
zdarzenie - akcja rozpoznawana przez obiekt (taka jak kliknięcie myszą czy naciśnięcie klawisza),
dla której można zdefiniować odpowiedź. Zdarzenie może być spowodowane działaniem użytkownika, poleceniem języka Visual Basic lub działaniami systemu. Korzystając z właściwości skojarzonych ze zdarzeniami można ustalić, aby odpowiedzią na zdarzenie było uruchomienie makra, wywołanie funkcji języka Visual Basic lub uruchomienie procedury zdarzenia. Jest wiele zdarzeń jakie mogą występować podczas działania programu i na które mogą reagować odpowiednie obiekty. Nieraz nawet nie jesteśmy świadomi o zaistnieniu pewnego zdarzenia. Zdarzenia mogą być różne na przykład otwarcie dokumentu też jest zdarzeniem.
Niektóre zdarzenia formantów: Poniżej przedstawiam kilka zdarzeń na jakie mogą reagować formanty. Oczywiście różne formanty mogą reagować na rożne zdarzenia. Zdarzenie
Opis
Click
Jest to chyba najczęściej spotykane zdarzenie. Dla formantu zdarzenie to występuje, gdy na formancie zostanie naciśnięty, a następnie zwolniony (kliknięty) lewy przycisk myszy.
DblClick
Zachodzi kiedy użytkownik dwukrotnie klika formant.
MouseMove
Występuje za każdym razem gdy wskaźnik myszy przesuwa się po formancie.
MouseDown
Zachodzi gdy użytkownik naciska przycisk myszy. Zdarzenia tego możemy użyć jeżeli chcemy rozróżnić który przycisk myszy jest używany.
MouseUp
Zachodzi gdy użytkownik zwalnia przycisk myszy. Zdarzenia tego możemy użyć jeżeli chcemy rozróżnić który przycisk myszy jest używany.
Change
Występuje kiedy zmienia się właściwość Value formantu
KeyDown
Zachodzi gdy użytkownik naciska klawisz w czasie gdy formant ma fokus.
KeyUp
Zachodzi gdy użytkownik zwalnia klawisz w czasie gdy formant ma fokus.
KeyPress
Występuje gdy użytkownik naciska i zwalnia klawisz lub kombinacje klawiszy w czasie gdy formant ma fokus. Najważniejszą różnicą między zdarzeniami KeyUp i KeyDown a KeyPress jest to, że zdarzenie KeyPress jest związane ze znakiem a KeyUp/KeyDown z klawiszem. Zauważ
66
że klawisz "A" zwraca "A" lub "a" w zależności od tego czy naciśnięty został równocześnie klawisz Shift. Gdy interesuje nas wprowadzony znak, należy zastosować KeyPress. Gdy tylko to jaki klawisz został naciśnięty KeyUp lub KeyDown.
Procedury zdarzenia: Jak już wspomniałem obiekty (formularz i formanty) mogą reagować na rożne zdarzenia odpowiednie dla danego typu obiektu. Jeżeli do określonego zdarzenia związanego z danym obiektem dodamy kod VBA tworzona jest procedura zdarzenia. Kod związany ze zdarzeniem czyli nasza procedura zdarzenia, może wykonać wszystko to co wykonuje zwykła procedura. Przypomnij sobie przykłady z poprzednich stron, większość z nich to właśnie procedury zdarzenia. •
procedura zdarzenia - procedura wykonywana automatycznie w odpowiedzi na zdarzenie
zainicjowane przez użytkownika, kod programu lub system. Składnia procedury zdarzenia: Składnia procedury zdarzenia jest podobna do składni podprogramu czyli procedury typu Sub. Więcej informacji na temat procedur znajdziesz na stronie Procedury. Chciałbym jednak zwrócić uwagę na nazwę procedury zdarzenia. Nazwa procedury zdarzenia musi zawierać nazwę obiektu który ma reagować na zdarzenie oraz nazwę zdarzenia, elementy te łączymy znakiem podkreślenia _. Instrukcja deklarująca procedurę kończy się parą nawiasów. W nawiasach tych umieszczone są ewentualne parametry przekazywane do procedury. Jeżeli procedura nie posiada parametrów nawiasy pozostają puste. Składnie procedury zdarzenia przedstawię na podstawię zdarzenia Click przycisku polecenia CommandButton1. Private Sub CommandButton1_Click() 'odpowiednie instrukcje End Sub
W powyższym przykładzie słowo Private oznacza, że procedura może być dostępna tylko dla procedur umieszczonych w tym samym module. Słowo Sub oznacza że jest to podprogram. Dalej jest nazwa procedury tj. CommandButton1_Click składająca się z nazwy obiektu i nazwy zdarzenia. Ponieważ ta procedura nie posiada parametrów, na końcu linii deklarującej procedurę umieszczona jest pusta para nawiasów. Instrukcja End Sub zamyka procedurę. Jak już wspomniałem procedury zdarzenia mają z góry określone nazwy składające się z nazwy obiektu i nazwy zdarzenia. Dlatego też jeżeli po utworzeniu procedury zdarzenia dla jakiegoś obiektu, zmienisz nazwę obiektu to odpowiedniej zmiany musisz dokonać w nazwie procedury.
Pisanie procedur zdarzenia: Technika pisania procedury zdarzenia jest dość prosta (na poprzednich stronach spotkałeś się już z odpowiednimi krokami). Aby napisać procedurę zdarzenia wykonaj następujące czynności: • • •
•
Uruchom Edytor Visual Basic. Jeżeli nie jest widoczne, wyświetl okno Project (Eksplorator projektów). W oknie Project kliknij dwukrotnie na obiekt, w którym znajduje się formant dla którego chcesz utworzyć procedurę zdarzenia. Może to być arkusz Excela czy obiekt UserForm. Powinno się otworzyć okno Code (Kod programu). W oknie Code (Kod programu) z listy rozwijanej Obiect (Obiekt) - lewa górna część modułu kodu, wybierz nazwę obiektu do którego chcesz dodać kod (kliknij na grot strzałki i wybierz obiekt). Po wybraniu obiektu program Microsoft Excel automatycznie tworzy szablon domyślnej procedury zdarzenia, odpowiedni dla danego typu obiektu. Domyślnym zdarzeniem dla przycisku polecenia jest 67
•
zdarzenie Click ale na przykład dla pola tekstowego domyślnym zdarzeniem jest zdarzenie Change. Możemy też wybrać inne zdarzenie niż domyślne z listy rozwijanej Procedure (Procedura) - prawa górna część modułu kodu. Pole (lista rozwijana) Procedure - pokazuje listę możliwych zdarzeń związanych z zaznaczonym obiektem w polu Obiect (patrz rysunek poniżej). Po wybraniu jakiegoś zdarzenia zostanie utworzony odpowiedni szablon procedury zdarzenia.
Jeżeli wybierzesz nazwę obiektu i nazwę zdarzenia z odpowiednich list modułu kodu, zostanie utworzony szablon procedury zdarzenia, a kursor będzie umieszczony między wierszem deklarującym procedurę a wierszem zamykającym ją. Jeżeli procedura zawiera już kod, zostanie ona po prostu otwarta. •
Uwaga: Jeżeli będąc w trybie projektowania dwukrotnie klikniemy lewym przyciskiem myszy na formant też otworzymy okno Code z domyślnym szablonem procedury zdarzenia.
Przykład: Na poprzednich stronach kursu spotkałeś się już wiele razy z przykładamy zastosowań różnych zdarzeń. Poniżej przedstawiam następny przykład w którym chciałbym pokazać jak można wykorzystać funkcje Int i Rnd oraz zdarzenia Click i MouseMove do stworzenia dość zabawnej ankiety. Przykład jest raczej z serii dla dociekłiwych ale jeżeli uważnie zapoanałeś się z poprzednimi stronami powinieneś sobie spokojnie poradzić. Przykład kod przykładu: Private Sub cmdNie_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 'kod powyższy umieszczony jest w jednej linii. cmdNie.Left = Int((350 - 10 + 1) * Rnd + 10) cmdNie.Top = Int((270 - 80 + 1) * Rnd + 80) End Sub
68
Private Sub cmdTak_Click() lblPytanie.Caption = "TO PRACUJ TAK DALEJ - TWÓJ SZEF" End Sub
Opis linii kodu: •
•
Private Sub cmdNie_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) - w linii tej deklarujemy procedurę w której słowo Private oznacza, że dana procedura widoczna jest tylko w danym module, zaś Sub to słowo kluczowe Visual Basic określające, że dana procedura to podprogram. Procedura ta będzie wykonywana przy zaistnieniu zdarzenia MouseMove (ruch myszy) przycisku polecenia cmdNie. Inaczej mówiąc jeżeli przesuniemy wskaźnik myszy nad przyciskiem polecenia cmdNie zostaną wykonane instrukcje zawarte poniżej aż do słów End Sub, które wskazują koniec bloku kodu. cmdNie.Left = Int((350 - 10 + 1) * Rnd + 10) - określamy losowo położenie przycisku cmdNie względem lewej krawędzi arkusza lub formularza. W tym celu wykorzystujemy funkcje Int i Rnd do wylosowania liczby z określonego przedziału, wartość tej liczby przypisujemy właściwości Left przycisku polecenia cmdNie. Funkcja Int zwraca cześć całkowitą argumentu, zaś funkcja Rnd zwraca liczbę losową większą od zera lub równą zeru a mniejszą od 1. A oto ogólny wzór, którego należy użyć aby wylosować liczbę całkowitą z dowolnego przedziału: Int((GranicaGórna - GranicaDolna + 1) * Rnd + GranicaDolna)
• • •
•
cmdNie.Top = Int((270 - 80 + 1) * Rnd + 80) - określamy losowo położenie przycisku cmdNie względem górnej krawędzi arkusza lub formularza. End Sub - to słowo kluczowe Visual Basic wskazujące koniec bloku kodu. Private Sub cmdTak_Click() - deklarujemy procedurę która będzie wykonywana przy zaistnieniu zdarzenia Click przycisku polecenia cmdTak. Inaczej mówiąc jeżeli klikniemy na przycisk polecenia cmdTak zostaną wykonane instrukcje zawarte poniżej aż do słów End Sub, które wskazują koniec bloku kodu. lblPytanie.Caption = "TO PRACUJ TAK DALEJ - TWÓJ SZEF" - po kliknięciu na przycisk polecenia cmdTak zmienia się wyświetlany przez etykietę lblPytanie napis na: TO PRACUJ TAK DALEJ - TWÓJ SZEF.
Kroki do wykonania: Przykład ten w arkuszu Excela możemy wykonać na dwa sposoby. W pierwszym sposobie nasze obiekty (etykieta i dwa przyciski) wstawiamy bezpośrednio w arkuszu Excela.
1. Uruchom Microsoft Excel. 2. Z menu Widok wybierz Paski narzędzi a następnie Przybornik formantów (jeżeli nie jest widoczny). 3. Z Przybornika formantów wybieramy ikonę Przycisk polecenia a następnie miejsce w arkuszu gdzie chcemy go umieścić. Ikona Tryb projektowania w przyborniku powinna się uaktywnić. 4. Klikamy prawym przyciskiem myszy na przycisk polecenia. Z otwartego menu wybieramy Właściwości, powinno się otworzyć okno Właściwości (Properties), w oknie tym zmieniamy następujące właściwości przycisku. o Name na cmdNie o Caption na NIE o Left na 50 o Top na 249 o Height na 24 o Width na 75 69
5. Pozostając w trybie projektowania Kliknij dwa razy na nasz przycisk polecenia. W nowo otwartym oknie Code (Kod programu), wybierz zdarzenie MouseMove (kliknij na strzałkę w prawym górnym rogu okna i wybierz MouseMove) następnie wpisz kod: cmdNie.Left = Int((350 - 10 + 1) * Rnd + 10) cmdNie.Top = Int((270 - 80 + 1) * Rnd + 80)
6. Powróć do arkusza Excela i w analogiczny sposób jak przycisk polecenia dodaj do arkusza Etykietę (duże A), ustaw jej właściwości: o Name na lblPytanie o Caption na Czy jesteś zadowolony z pracy i zarobków ? o Heght na 33 o Left na 58 o Top na 49 o Width na 474 o Wielkość czcionki z właściwości Font na 24 (zaznaczamy właściwość Font klikamy wielokropek i ustawiamy wielkość). 7. Analogicznie dodaj do arkusza drugi Przycisk polecenia i ustaw jego właściwości: o Name na cmdTak o Caption na TAK o Left na 429 o Top na 249 o Height na 24 o Width na 75 8. Kliknij dwa razy na przycisk cmdTak. W procedurze zdarzenia Click przycisku poleceń cmdTak wpisz kod: lblPytanie.Caption = "TO PRACUJ TAK DALEJ - TWÓJ SZEF"
9. Pozamykaj wszystkie okienka, zapisz i zamknij arkusz. Po ponownym otwarciu (z opcją Włącz makra) przetestuj działanie programu.
W drugim sposobie wkraczamy głębiej w VBA i wstawiamy nasze obiekty do nowo utworzonego formularza. 1. 2. 3. 4.
Uruchom Microsoft Excel Z menu Widok wybierz Visual Basic (jeżeli nie jest widoczny). Z paska narzędzi Visual Basic wybierz ikonę Edytor Visual Basic. W nowo otwartym oknie (Microsoft Visual Basic... ) wybierz: o Menu View (Widok) a następnie Project Explorer (Eksploator projektu), powinno się otworzyć okno Project-VBAProject. Punktu tego nie wykonujemy jeżeli okienko jest już widoczne. o Menu View (Widok) a następnie Properties Window (Okno właściwości), powinno się otworzyć okno Properties (Właściwości). Punktu tego nie wykonujemy jeżeli okienko jest już widoczne. o Z menu Insert (Wstaw) wybierz opcję UserForm (UserForm). Następnie w oknie Properties (Właściwości) ustaw właściwości formularza: Name na frmAnkieta Caption na ANKIETA SZEFA Height na 320 Width na 570 5. Kliknij w dowolnym miejscu na nasz formularz, celem uaktywnienia przybornika Toolbox (Przybornik). 6. Z przybornika Toolbox wstaw do formularza dwa przyciski poleceń i etykietę. W oknie Properties (Właściwości) stosując analogię do kroków opisanych już wcześniej ustaw właściwości formantów. 70
7. Po określeniu właściwości wstawionych formantów możemy już praktycznie przetestować przykład ale zanim to zrobimy jeszcze kilka informacji chciałbym przekazać. Nasz formularz wyświetlany jest w trybie modalnym. Kiedy formularz modalny jest wyświetlany na ekranie, nie można pracować z żadną inną częścią aplikacji (na przykład z arkuszem Excela). Aby móc pracować z innymi częściami aplikacji najpierw trzeba zamknąć formularz modalny. Formularz powinien posiadać przycisk zamknij (prawy górny róg formularza) za pomocą którego możemy zamknąc formularz. Jeżeli z jakiś powodów przycisk zamknij nie jest widoczny możemy utworzyć włsny przycisk zamykający formularz, w tym celu wykonaj następujące czynności: o o
Wstaw do formularza dodatkowy przycisk polecenia, ustaw jego własciwości: Caption na Zamknij, Left na 0, Top na 0. W procedurze zdarzenia Click przycisku poleceń wpisz kod: frmAnkieta.Hide
8. Kliknij w dowolnym miejscu na nasz formularz. Uruchom i przetestuj program naciskając klawisz F5. Powinien wyświetlić się formularz z tekstem pytania i dwoma przyciskami. Możemy też przetestować program uruchamiając go z poziomu arkusza Excela aby to zrobić wykonaj następujące czynności: • • •
Powróć do arkusza Excela. W arkuszu wstaw przycisk polecenia, ustaw jego właściwość Caption na np. Ankieta. W procedurze zdarzenia Click przycisku polecenia wpisz kod: frmAnkieta.Show
•
Pozamykaj wszystkie okienka, zapisz i zamknij dokument. Po ponownym otwarciu (z opcją włącz makra) kliknij na wstawiony przycisk w arkuszu i przetestuj działanie programu.
Zasada działania: Po uruchomieniu programu widzimy pytanie: Czy jesteś zadowolony z pracy i zarobków ?, na które musimy odpowiedzieć. Jeżeli naciśniemy na TAK to zmienia się wyświetlany napis na: TO PRACUJ TAK DALEJ TWÓJ SZEF. Problem pojawia się gdy chcemy nacisnąć przycisk NIE, przycisk ten po prostu "ucieka" i nie możemy go kliknąć. • •
Oczywiście wielkości właściwości Top, Heght, Left, Width obiektów projektu są przykładowe, ważne jest tylko aby podczas działania programu formanty nie nachodziły na siebie. Możemy też zmienić inne właściwości arkusza czy wstawionych obiektów aby np. poprawić wizualnie przykład.
Procedury zdarzeniowe arkusza W czasie tego kursu spotkaliśmy się już z procedurami zdarzenia miedzy innymi na stronie Procedury opisującej typy procedur oraz stronie Zdarzenia na której przedstawiłem kilka zdarzeń i procedury zdarzenia. Na tej stronie przedstawiam procedury zdarzeniowe dla obiektu Worksheet czyli arkusza Excela. Procedury te pozwalają zaprogramować akcje wykonywane w przypadku zdarzeń zachodzących w arkuszu. Tabela. Procedury zdarzeniowe arkusza Nazwa procedury zdarzeniowej
Opis
Worksheet_Activate()
Wywoływana w momencie uaktywnienia arkusza.
Worksheet_BeforeDoubleClick(ByVal
Uruchamiana jest gdy użytkownik kliknie dwa razy na
71
Target As Excel.Range, Cancel As Boolean)
obszar arkusza. Argumentami tej procedury są Target i Cancel. Zmienna obiektowa Target reprezentuje klikniętą komórkę. Argument Cancel przekazuje informacje o anulowaniu zdarzenia. Jeżeli w procedurze nadasz parametrowi Cancel wartość True dalsze akcje związane z dwukrotnym kliknięciem nie będą wykonywane.
Worksheet_BeforeRightClick(ByVal Target Procedura uruchamiana jest gdy użytkownik kliknie As Excel.Range, Cancel As Boolean) prawym przyciskiem myszy na obszar arkusza. Argumentami tej procedury są Target i Cancel. Zmienna obiektowa Target reprezentuje klikniętą komórkę. Jeżeli w procedurze nadasz parametrowi Cancel wartość True dalsze akcje związane z kliknięciem prawym przyciskiem myszy są anulowane. Worksheet_Calculate()
Procedura wywoływana po przeliczeniu arkusza.
Worksheet_Change(ByVal Target As Excel.Range)
Procedura wywołana po zmianie zawartości dowolnej komórki arkusza. Procedura nie działa po zmianie spowodowanej przeliczeniem arkusza. Zmienna obiektowa Target reprezentuje komórkę w której dokonano zmiany.
Worksheet_Deactivate()
Uruchamiana gdy bieżący arkusz przestaje być aktywny, na przykład wtedy gdy użytkownik uaktywni inny arkusz.
Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
Procedura wywoływana gdy użytkownik kliknie na link (hiperłącze) umieszczony na arkuszu. Argument Target to adres wskazany przez link. W starszych wersjach Excela procedura ta nie jest dostępna.
Worksheet_PivotTableUpdate(ByVal Target Procedura wykonywana jest po aktualizacji tabeli As PivotTable) przestawnej. Zmienna obiektowa Target reprezentuje aktualizowany raport tabeli. W starszych wersjach Excela procedura ta nie jest dostępna. Worksheet_SelectionChange(ByVal Target As Excel.Range)
Uruchamiana gdy zmieniamy obszar zaznaczenia na arkuszu (na przykład gdy przechodzimy do innej komórki). Zmienna obiektowa Target reprezentuj zaznaczoną komórkę lub zakres komórek. Jest to domyślna procedura dla arkusza.
Pisanie procedur zdarzenia: Technika pisania procedury zdarzenia jest dość prosta (na poprzednich stronach spotkałeś się już z odpowiednimi krokami). Aby napisać procedurę zdarzenia dla arkusza wykonaj następujące czynności: • • • •
Uruchom Edytor Visual Basic. Jeżeli nie jest widoczne, wyświetl okno Project (Eksplorator projektów), czyli z menu View (Widok) wybierz opcję ProjectExplorer (Eksploator projektu). W oknie Project kliknij dwukrotnie na nazwę odpowiedniego arkusza, dla którego chcesz utworzyć procedurę zdarzenia. Powinno się otworzyć okno Code (Kod programu) tego arkusza. W oknie Code (Kod programu) z listy rozwijanej Obiect (Obiekt) - lewa górna część okna, wybierz obiekt Worksheet (kliknij na grot strzałki a następnie nazwę Worksheet). Po wybraniu obiektu program Microsoft Excel automatycznie tworzy szablon domyślnej procedury zdarzenia, odpowiedni dla danego typu obiektu. Domyślnym zdarzeniem dla arkusza jest zdarzenie SelectionChange. 72
•
Możemy też wybrać inne zdarzenie niż domyślne z listy rozwijanej Procedure (Procedura) - prawa górna część okna Code (kliknij na grot strzałki a następnie nazwę odpowiedniej procedury zdarzenia). Pole (lista rozwijana) Procedure - pokazuje listę możliwych zdarzeń związanych z zaznaczonym obiektem w polu Obiect (patrz rysunek poniżej), w naszym przypadku jest to odpowiedni arkusz Excela. Po wybraniu jakiegoś zdarzenia zostanie utworzony odpowiedni szablon procedury zdarzenia.
•
W szablonie procedury zdarzenia wstaw kod który ma być wykonany.
Uwaga: jeżeli wybierzesz nazwę obiektu i nazwę zdarzenia z odpowiednich list okna Code, zostanie utworzony szablon procedury zdarzenia, a kursor będzie umieszczony między wierszem deklarującym procedurę a wierszem zamykającym ją. Jeżeli procedura zawiera już kod, zostanie ona po prostu otwarta.
Kilka prostych przykładów zastosowania: Aby przetestować przykłady wykonaj kroki opisane powyżej a następnie wpisz odpowiedni fragment kodu z wybranego przykładu.
Przykład 1: W przykładzie w momencie uaktywnienia arkusza wyświetlamy jest komunikat z informacją że w arkuszu przechowywane są ważne dane i nie należy ich modyfikować. Kod przykładu: Private Sub Worksheet_Activate() MsgBox "W arkuszu tym przechowywane są ważne dane, nie należy ich
73
modyfikować", vbExclamation, "Autor" End Sub
Przykład 2: Poniższa procedura uniemożliwia użytkownikowi wywołanie menu podręcznego pod prawym przyciskiem myszy. Kod przykładu: Private Sub Worksheet_BeforeRightClick(ByVal Target As Excel.Range, Cancel As Boolean) MsgBox "W tym akuszu menu pod prawym przyciskiem jest wyłączone" Cancel = True End Sub
Przykład 3: Jeżeli klikniemy dwa razy lewy przycisk myszy w kliknietej komórce pojawi się napis: Wykonano. Kod przykładu: Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean) Target.Value = "Wykonano" End Sub
Przykład 4: Jeżeli zmienimy wartość w komórce A1, będzie wyświetlona informacja o tym. Kod przykładu: Private Sub Worksheet_Change(ByVal Target As Excel.Range) If Target.Address = "$A$1" Then MsgBox "Nastąpiła zmiana wartości w komórce A1", , "Autor Dzono4" End If End Sub
Przykład 5: Za pomocą tego przykładu na pasku stanu wyświetlana jest informacja o numerze wiersza i numerze kolumny aktywnej komórki. Kod przykładu: Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) Application.StatusBar = "Wiersz " & Target.Row & " kolumna " & Target.Column End Sub
74