|
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.
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.
Zachodzi kiedy użytkownik dwukrotnie klika formant.
Występuje za każdym razem gdy wskaźnik myszy przesuwa się po formancie.
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.
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.
Występuje kiedy zmienia się właściwość Value formantu
Zachodzi gdy użytkownik naciska klawisz w czasie gdy formant ma fokus.
Zachodzi gdy użytkownik zwalnia klawisz w czasie gdy formant ma fokus.
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ż ż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.
Jak już wspomniałem obiekty (formularz i formanty) mogą reagować na rożne zdarzenia odpowiednie dla danego typu obiektu. Jeżeli do określonego zdarzenia związanego z danym obiektem dodamy kod VBA tworzona jest procedura zdarzenia. Kod związany ze zdarzeniem czyli nasza procedura zdarzenia, może wykonać wszystko to co wykonuje zwykła procedura. Przypomnij sobie przykłady z poprzednich stron, większość z nich to właśnie procedury zdarzenia.
procedura zdarzenia - procedura wykonywana automatycznie w odpowiedzi na zdarzenie zainicjowane przez użytkownika, kod programu lub system.
Składnia procedury zdarzenia:
Składnia procedury zdarzenia jest podobna do składni podprogramu czyli procedury typu Sub. Więcej informacji na temat procedur znajdziesz na stronie Procedury. Chciałbym jednak zwrócić uwagę na nazwę procedury zdarzenia. Nazwa procedury zdarzenia musi zawierać nazwę obiektu który ma reagować na zdarzenie oraz nazwę zdarzenia, elementy te łączymy znakiem podkreślenia _. Instrukcja deklarująca procedurę kończy się parą nawiasów. W nawiasach tych umieszczone są ewentualne parametry przekazywane do procedury. Jeżeli procedura nie posiada parametrów nawiasy pozostają puste. Składnie procedury zdarzenia przedstawię na podstawię zdarzenia Click przycisku polecenia CommandButton1.
Private Sub CommandButton1_Click() 'odpowiednie instrukcje End Sub
W powyższym przykładzie słowo Private oznacza, że procedura może być dostępna tylko dla procedur umieszczonych w tym samym module. Słowo Sub oznacza że jest to podprogram. Dalej jest nazwa procedury tj. CommandButton1_Click składająca się z nazwy obiektu i nazwy zdarzenia. Ponieważ ta procedura nie posiada parametrów, na końcu linii deklarującej procedurę umieszczona jest pusta para nawiasów. Instrukcja End Sub zamyka procedurę. Jak już wspomniałem procedury zdarzenia mają z góry określone nazwy składające się z nazwy obiektu i nazwy zdarzenia. Dlatego też jeżeli po utworzeniu procedury zdarzenia dla jakiegoś obiektu, zmienisz nazwę obiektu to odpowiedniej zmiany musisz dokonać w nazwie procedury.
Pisanie procedur zdarzenia:
Technika pisania procedury zdarzenia jest dość prosta (na poprzednich stronach spotkałeś się już z odpowiednimi krokami). Aby napisać procedurę zdarzenia wykonaj następujące czynności:
Uruchom Edytor Visual Basic.
Jeżeli nie jest widoczne, wyświetl okno Project (Eksplorator projektów).
W oknie Project kliknij dwukrotnie na obiekt, w którym znajduje się formant dla którego chcesz utworzyć procedurę zdarzenia. Może to być arkusz Excela czy obiekt UserForm. Powinno się otworzyć okno Code (Kod programu).
W oknie Code (Kod programu) z listy rozwijanej Obiect (Obiekt) - lewa górna część modułu kodu, wybierz nazwę obiektu do którego chcesz dodać kod (kliknij na grot strzałki i wybierz obiekt). Po wybraniu obiektu program Microsoft Excel automatycznie tworzy szablon domyślnej procedury zdarzenia, odpowiedni dla danego typu obiektu. Domyślnym zdarzeniem dla przycisku polecenia jest 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ć.
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
Private Sub cmdTak_Click() lblPytanie.Caption = "TO PRACUJ TAK DALEJ - TWÓJ SZEF" End Sub
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.
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.
Z menu Widok wybierz Paski narzędzi a następnie Przybornik formantów (jeżeli nie jest widoczny).
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ć.
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.
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)
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:
Caption na Czy jesteś zadowolony z pracy i zarobków ?
Wielkość czcionki z właściwości Font na 24 (zaznaczamy właściwość Font klikamy wielokropek i ustawiamy wielkość).
Analogicznie dodaj do arkusza drugi Przycisk polecenia i ustaw jego właściwości:
Kliknij dwa razy na przycisk cmdTak. W procedurze zdarzenia Click przycisku poleceń cmdTak wpisz kod: lblPytanie.Caption = "TO PRACUJ TAK DALEJ - TWÓJ SZEF"
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.
Z menu Widok wybierz Visual Basic (jeżeli nie jest widoczny).
Z paska narzędzi Visual Basic wybierz ikonę Edytor Visual Basic.
W nowo otwartym oknie (Microsoft Visual Basic... ) wybierz:
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.
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.
Z menu Insert (Wstaw) wybierz opcję UserForm (UserForm). Następnie w oknie Properties (Właściwości) ustaw właściwości formularza:
Kliknij w dowolnym miejscu na nasz formularz, celem uaktywnienia przybornika Toolbox (Przybornik).
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.
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:
Wstaw do formularza dodatkowy przycisk polecenia, ustaw jego własciwości: Caption na Zamknij, Left na 0, Top na 0.
W procedurze zdarzenia Click przycisku poleceń wpisz kod: frmAnkieta.Hide
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.
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.
|