Kurs Vba Excel 2003
Kurs Vba Excel 2003
Kurs Vba Excel 2003
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
o 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 Przycisk Zatrzymaj rejestrowanie umożliwia zakończenie rejestrowania makra w
odpowiednim dla Ciebie momencie.
o 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.
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.
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.
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.
5
6. W nowo otwartym oknie dialogowym Przypisz makro zaznacz odpowiednią nazwę makra (w naszym
przypadku: Czyszczenie) i kliknij na przycisk OK.
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.
Kroki:
• 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):
• 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:
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:
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:
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.
• 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ę.
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:
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.
• 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:
• 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:
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.
• 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:
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.
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:
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.
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:
If Range("A1").Value = 0 Then
Range("A2").Value = "wartość wynosi zero"
Else
Range("A2").Value = "wartość jest różna od zera"
End If
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.
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 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:
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.
• 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.
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:
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:
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ę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:
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.
Sub PrzykładPętli()
Dim kolumna As Integer
For kolumna = 1 To 10
Cells(1, kolumna) = kolumna
Next kolumna
End Sub
• 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.
Zmienna kolumna w naszym przykładzie przybiera wartości liczbowe od 1 do 10 i jednocześnie spełnia trzy
zadania.
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.
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
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.
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.
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.
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.
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:
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:
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.
Możemy też podczas deklaracji określić typ danych jakie dana stała będzie przechowywała.
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.
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 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:
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
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).
Lub też
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.
Do zapisania danych do tablicy możemy też użyć funkcji InputBox, funkcję to poznamy w dalszej części
kursu.
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.
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.
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.
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.
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 kroki:
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.
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:
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:
-liczba
40
MsgBox Wynik
Dim Wynik
Operator ten stosuje się do
Wynik = 10 - 3 ' Wynikiem jest 7
znajdowania różnicy - Odejmowanie
- lub do zaznaczania ujemnej wartości
MsgBox Wynik
Wynik = -Wynik ' Wynikiem jest -7
wyrażenia numerycznego - Negacja. 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.
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 - 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:
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:
• 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.
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.
Informacyjnie tylko podam, że oprócz wymienionych wyżej operatorów VBA posiada jeszcze dwa specjalne
operatory porównania.
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:
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 - 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.
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
• 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.
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:
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 - opis:
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.
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:
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.
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:
Aby wykorzystać wartość zwracaną przez funkcję, należy umieścić argumenty w nawiasach i przypisać
zwracaną wartość do zmiennej.
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.
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:
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:
Przykład 5:
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:
Przykład 8:
Przykład 9:
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.
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.
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.
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:
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:
Przykład 8:
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:
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.
• 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.
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.
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.
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:
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).
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.
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.
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ć:
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.
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:
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ć:
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:
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:
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:
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.
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.
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.
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.
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.
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:
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ć.
68
Private Sub cmdTak_Click()
lblPytanie.Caption = "TO PRACUJ TAK DALEJ - TWÓJ SZEF"
End Sub
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.
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.
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:
Możemy też przetestować program uruchamiając go z poziomu arkusza Excela aby to zrobić wykonaj
następujące czynności:
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.
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.
71
Target As Excel.Range, Cancel As obszar arkusza. Argumentami tej procedury są Target i
Boolean) 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 Procedura wywołana po zmianie zawartości dowolnej
Excel.Range) 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 Procedura wywoływana gdy użytkownik kliknie na link
As Hyperlink) (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 Uruchamiana gdy zmieniamy obszar zaznaczenia na
As Excel.Range) 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.
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:
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.
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.
Aby przetestować przykłady wykonaj kroki opisane powyżej a następnie wpisz odpowiedni fragment kodu z
wybranego przykładu.
Przykład 1:
Kod przykładu:
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:
Przykład 3:
Jeżeli klikniemy dwa razy lewy przycisk myszy w kliknietej komórce pojawi się napis: Wykonano.
Kod przykładu:
Przykład 4:
Kod przykładu:
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:
74