Klasy w języku VBA
Kategoria: Kurs VBA, Kurs Excel, Samouczek Excel

Klasy w języku VBA wywodzą się z programowania Object Orienred Programming, czyli tzw. Programowania zorientowanego obiektywnie. Pisanie programów sprowadza się więc do tworzenia za pomocą klas obiektów na których, lub za pomocą których wykonujemy Operacje. Wydaje się skomplikowane? Polecamy artykuł Grzegorza Plaka – eksperta Cognity, który przybliży Wam język VBA.
Na początek za nim zaczniemy mówić o klasach w VBA proszę sobie wyobrazić psa – Reksa czy Ciapka Każdy z tych psów ma charakterystyczne właściwości np. kolor skóry, kolor oczu, łapy, ogon itd. Prawie każdy pies potrafi również szczekać, biegać, skakać.
Nasze psy będą przykładowym zjawiskiem, które pomoże zrozumieć klasy w języku VBA i wyjaśnić ich działanie.
Tak więc jeśli zdefiniujemy w aplikacji klasę Pies, to możemy określić pewne właściwości oraz operacje, które poszczególne psy będą mogły wykonywać (metody).
Uwaga! Klasa jest definicją.
Jeśli będziemy chcieli wykorzystać naszą klasę, to musimy utworzyć obiekt, który ma dokładnie te same właściwości oraz metody co klasa pies. Dlaczego to jest takie ważne? Bo jeśli użytkownik będzie chciał utworzyć dziesięć psów, to musi dziesięć razy powtórzyć jego właściwości oraz metody w programowaniu proceduralnym, natomiast w programowaniu obiektowym wystarczy, że zrobi to jeden raz i będzie korzystał z klasy aby tworzyć obiekty.
Poniżej zostanie przedstawiony przykład, w którym zostaną utworzone trzy psy z wykorzystaniem programowania strukturalnego oraz obiektowego.
Tworzenie klasy w VBA
Aby utworzyć klasę Pies, należy przejść do edytora VBA, kliknąć PPM na projekt (jeśli go nie widać, to proszę użyć Ctrl + R) a następnie wybrać Insert -> Class Module (rys. 1)
Rys. 1. Wstawianie klasy
Proszę aktywować klasę, a następnie z okna właściwości (jeśli go nie ma, to proszę kliknąć F4) zmienić właściwość Name na Pies (rys. 2).
Rys. 2. Zmiana nazwy klasy
W oknie kodu będziemy tworzyć właściwości oraz metody klasy Pies. Załóżmy, że chcemy mieć następujące właściwości:
- Wiek
- Nazwa
- Kolor oczu
oraz metody:
- Szczekaj
Prawie każda zmienna (zgodnie z ideą programowania obiektowego) powinna być prywatna, tzn. niewidoczna na zewnątrz klasy. Dlatego zadeklarujemy zmienne klasy Pies:
Private pWiek As Integer
Private pNazwa As String
Private pKolorOczu As String
W związku z tym, że nie jest możliwe edytowanie tych zmiennych z zewnątrz klasy, to należy utworzyć właściwości, które umożliwią ich odczyt i edycję:
Właściwość, która pozwoli nam na odczyt zmiennej pWiek wygląda następująco:
Public Property Get Wiek() As Integer
Wiek = pWiek
End Property
Właściwość która pozwoli nam na zapis do zmiennej pWiek wygląda następująco:
Public Property Let Wiek(w As Integer)
pWiek = w
End Property
Podobnie należy zdefiniować właściwości dla pozostałych zmiennych
Public Property Get Nazwa() As String
Nazwa = pNazwa
End Property
Public Property Let Nazwa(w As String)
pNazwa = w
End Property
Public Property Get KolorOczu() As String
KolorOczu = pKolorOczu
End Property
Public Property Let KolorOczu(w As String)
pKolorOczu = w
End Property
Wstawienie metody umożliwiającej wykonanie operacji to wstawienie procedury lub funkcji.
W tym przypadku będzie to procedura o nazwie Szczekaj, która będzie wyświetlać okno dialogowe z odpowiednim komunikatem:
Public Sub Szczekaj()
MsgBox "Hau. Hau."
End Sub
Wykorzystanie klasy w makrze
Po zdefiniowaniu klasy Pies można przystąpić do wykorzystania klasy Pies.
W tym celu przechodzimy do utworzenia nowego modułu (PPM na projekcie a następnie Insert -> Module p. rys. 3).
Rys. 3. Tworzenie nowego modułu
W module tworzymy procedurę test1, w której będziemy przechowywać kod odpowiedzialny za wykorzystanie klasy Pies:
Sub test1()
Dim reks As New Pies
Dim ciapek As New Pies
Dim azor As New Pies
reks.Wiek = 11
reks.Nazwa = "Reks"
reks.KolorOczu = "zielone"
ciapek.Wiek = 4
ciapek.Nazwa = "Ciapek"
ciapek.KolorOczu = "niebieskie"
azor.Wiek = 2
azor.Nazwa = "Azor"
azor.KolorOczu = "brązowe"
MsgBox reks.Nazwa + " ma " + reks.Wiek + " lat oraz ma " + reks.KolorOczu + " oczy"
reks.Szczekaj
MsgBox ciapek.Nazwa + " ma " + ciapek.Wiek + " lat oraz ma " + ciapek.KolorOczu + " oczy"
ciapek.Szczekaj
MsgBox azor.Nazwa + " ma " + azor.Wiek + " lat oraz ma " + azor.KolorOczu + " oczy"
azor.Szczekaj
End Sub
Ten sam kod z tą różnicą, że napisany z wykorzystaniem programowania proceduralnego:
Sub test2()
Dim reks_wiek As Integer
Dim reks_nazwa As String
Dim reks_kolor_oczu As String
Dim ciapek_wiek As Integer
Dim ciapek_nazwa As String
Dim ciapek_kolor_oczu As String
Dim azor_wiek As Integer
Dim azor_nazwa As String
Dim azor_kolor_oczu As String
reks_wiek = 11
reks_nazwa = "Reks"
reks_kolor_oczu = "zielone"
ciapek_wiek = 4
ciapek_nazwa = "Ciapek"
ciapek_kolor_oczu = "niebieskie"
azor_wiek = 2
azor_nazwa = "Azor"
azor_kolor_oczu = "brązowe"
MsgBox reks_nazwa + " ma " + reks_wiek + " lat oraz ma " + reks_kolor_oczu + " oczy"
MsgBox "Hau. Hau."
MsgBox ciapek_nazwa + " ma " + ciapek_wiek + " lat oraz ma " + ciapek_kolor_oczu + " oczy"
MsgBox "Hau. Hau."
MsgBox azor_nazwa + " ma " + azor_wiek + " lat oraz ma " + azor_kolor_oczu + " oczy"
MsgBox "Hau. Hau."
End Sub
Widać wyraźnie, że w przypadku programowania obiektowego kod w procedurze ma mniej linijek. W przypadku, gdy obsługuje się znacznie więcej danych tego samego typu najlepiej jest używać technik obiektowych. Co więcej, edycja kodu napisanego „obiektowo” jest mniej czasochłonna niż w przypadku kodu strukturalnego.
Autorem tekstu i obrazków jest Grzegorz Plak - trener Cognity.
Klasy w języku VBA by Cognity is licensed under a Creative Commons Uznanie autorstwa-Użycie niekomercyjne 4.0 Międzynarodowe License.
Cognity zaprasza Cię na praktyczne kursy i szkolenia:
Kurs VBA (Visual Basic for Applications) w Excelu Zaawansowany - szkolenie z certyfikatem
Więcej informacji znajdziesz w artykułach:
Edycja kodu vba - film

Zainteresować Cię może również:
Funkcja WYSZUKAJ.PIONOWO
