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