2. diel - Prvá objektová aplikácia vo VBA - Hello object world
V minulej lekcii, Úvod do objektovo orientovaného programovania vo VBA , sme si uviedli úvod do objektovo orientovaného programovania vo VBA, vysvetlili sme si historické okolnosti vzniku OOP a tiež pojmy trieda, atribút, metóda a zapuzdrenie.
Už vieme, že objekty majú atribúty a metódy. Tiež vieme, že na vytvorenie objektu vytvoríme najprv triedu. Tá je vzorom, podľa ktorého následne tvoríme jej inštancie.
V dnešnej lekcii si naprogramujeme jednoduchý program Hello object world, ktorý nás bude zdraviť. Objektovo!
Vytvorenie triedy
Najskôr si teda vytvoríme triedny modul. Trieda bude veľmi jednoduchá, aby sme najprv pochopili základy.
Pomocou klávesovej skratky Alt + F11 si otvoríme naše programovacie IDE a necháme si zobraziť Project Explorer (Prieskumník projektu), pokiaľ sa nám teda už nezobrazuje. Zobraziť ho môžeme buď pomocou klávesovej skratky Ctrl + R, alebo z ponuky View -> Project Explorer. Tu sa nám zobrazujú jednotlivé listy Excelu a modul ThisWorkbook.
Teraz pravým tlačidlom myši klikneme kdekoľvek do okna Project Explorer az roletovej ponuky, ktorá sa objaví, zvolíme Insert (vložiť) a Class Module.
Po vložení sa ešte uistíme, že máme otvorené okno Properties Window (Okno vlastností). Toho docielime klávesom F4, alebo z ponuky View -> Properties Window.
Naša novo vytvorená trieda bola implicitne pomenovaná ako
Class1
, čo sa nám ale veľmi nepáči. Ako je už tradícia v
tutoriáloch na stránkach ITnetwork, vytvárame si objekt,
ktorý nás aj objektovo pozdraví. Povedzme, že by sa trieda mohla volať
Clovek
. Triedy pomenovávame bez použitia diakritiky pomocou
takzvanej ťavie notácie (Camel Case), kedy trieda začína na
veľké písmeno. Ak sa jej názov pozostáva z viacerých slov, píšeme ich
dohromady a každé nové slovo opäť s veľkým písmenom.
Teraz si triedu premenujeme z Class1
na Zdravic
. To
je možné vykonať iba v Properties Window, kde klikneme do okienka s
popiskou (Name) (Názov), respektíve do okienka s názvom našej
triedy, ktorá sa ešte stále volá Class1
. Premenujeme ju na
Zdravic
a odentrujeme:
Názov triedy píšeme vždy ťavou notáciou bez medzier a na rozdiel od premenných má každé slovo veľké prvé písmeno, teda aj prvé. Názov je samozrejme aj bez diakritiky. Tú v programe používame maximálne vo vnútri textových reťazcov, ale nie v identifikátoroch.
Podľa tejto triedy neskôr vytvoríme objekt zdravic
, ktorý
nás bude vedieť pozdraviť. Vidíme, že sa na program už pozeráme úplne
inak. Za každú akciu je zodpovedný nejaký objekt a nestačí iba niečo
"nabúšiť" do jednej metódy v module alebo v liste. V našom prípade nám to
môže prísť zbytočné, ale pri zložitejších aplikáciách si to budeme
pochvaľovať:)
Naše IDE nám v triede nič nevygenerovalo. V lepšom prípade nám do
triedy iba vložilo Option Explicit
, ktorého funkciu už dobre
poznáme.
Teraz si do triedy Zdravic
pridáme metódu
Pozdrav()
, ktorá bude verejne viditeľná a nebude mať žiadnu
návratovú hodnotu ani atribúty.
Deklarácia metódy vo VBA je teda nasledujúca:
[modifikátor prístupu] Sub [MenoMetódy]
Pred metódou bude tzv. modifikátor prístupu, v našom
prípade Public
(verejný). Keby sme modifikátor
vynechali, VBA by metódu napriek tomu chápalo ako Public
(verejnú). Odporúčam ale minimálne pre prehľadnosť modifikátory vždy
uvádzať. Ak by sme chceli s metódou pracovať iba vo vnútri triedy a
nechceli by sme, aby bola viditeľná zvonku, použili by sme modifikátor
Private
(neverejný). To ale nie je teraz náš
prípad.
Ďalej bude nasledovať samotný názov metódy. Metódy píšeme rovnako ako triedy ťavej notácií s veľkým počiatočným písmenom. Prvé písmeno názvu je však na rozdiel od premenných veľké! Ako deklarovať metódy s parametrami si ukážeme za chvíľu.
Do tela metódy zapíšeme kód pre výpis na konzole.
Naša trieda bude teraz vyzerať takto:
Option Explicit Public Sub Pozdrav() Debug.Print "Hello object world!" End Sub
Tu sme zatiaľ skončili. Ešte nám ale zostáva inštanciu našej novo
vytvorenej triedy Zdravic
nadeklarovať a nadefinovať.
Do nášho VBAProjectu si teda ešte vložíme nový
štandardný modul a pomenujeme si ho napríklad ako Main. Do
tohto modulu si potom vložíme súkromnú metódu, ktorú si opäť nejako
pomenujeme, napríklad aj ako Main()
.
Teraz si v tele tejto metódy Main()
vytvoríme
inštanciu triedy Zdravic
. Bude to teda ten objekt
zdravic
, s ktorým budeme pracovať. Objekty sa ukladajú do
premenných. Názov triedy slúži ako dátový typ. Inštancia má spravidla
názov triedy, len má prvé písmeno malé. Deklarujme si premennú a následne
v nej založme novú inštanciu triedy Zdravic
:
Dim Zdravic As Zdravic Set Zdravic = New Zdravic()
Prvý riadok hovorí: "Chcem (deklarujem) premennú zdravic
, v
ktorej bude inštancia triedy Zdravic
". S premennými sme vlastne
už takto pracovali.
Na druhom riadku je kľúčové slovo New
,
ktoré nám založí novú inštanciu triedy Zdravic
. Túto
inštanciu priradíme do našej premennej. Kľúčovým slovom
Set
hovoríme, že inštanciu definujeme
(nastavujeme).
Asi sme si správne všimli, že názov inštancie aj triedy začína veľkým písmenom. Je to kvôli nedokonalosti nášho IDE. Skúsme si pri názve inštancie zmeniť prvé písmeno na malé. Naše IDE nám automaticky zmení na malé písmeno aj počiatočné písmeno názvu našej triedy v deklarácii. Je to taká malá chyba na kráse, ktorej sa ale vyhneme, pokiaľ inštanciu pomenujeme inak ako triedu.
Celý zápis môžeme samozrejme skrátiť na:
Dim Zdravic As New Zdravic()
Keďže v premennej teraz máme naozaj inštanciu triedy
Zdravic
, môžeme inštanciu nechať pozdraviť. Zavoláme na ňu
metódu Pozdrav()
a to ako Zdravic.Pozdrav()
. Kód
metódy Main()
bude teda teraz vyzerať nasledovne:
Private Sub Main() Dim Zdravic As Zdravic Set Zdravic = New Zdravic() Zdravic.Pozdrav() End Sub
Program teraz spustíme. Len pre istotu doplním, že máme kurzor myši vo
vnútri metódy Main()
a pre spustenie stlačíme kláves
F5.
Na konzole sa nám práve vypísal text Hello object world! Pokiaľ konzolu nevidíme, stlačíme súčasne klávesy Ctrl + G. Zobrazí sa okno Immediate, kde si môžeme čítať naše výpisy na konzole.
Máme teda svoju prvú objektovú aplikáciu!
Pridanie parametra
Dajme teraz našej metóde Pozdrav()
parameter
jmeno
a upravme text, ktorý vypisujeme na konzole tak, aby
dokázala pozdraviť konkrétneho užívateľa:
Public Sub Pozdrav(jmeno As String) Debug.Print "Ahoj užívateľovi " + jmeno End Sub
Vidíme, že syntax parametra metódy je rovnaká, ako je syntax premennej.
Iba vynecháme kľúčové slovo Dim
. Keby sme chceli parametrov
viac, oddeľujeme ich čiarkou. Upravíme teraz našu metódu
Main()
:
Private Sub Main() Dim Zdravic As Zdravic Set Zdravic = New Zdravic() Zdravic.Pozdrav ("Karle") Zdravic.Pozdrav ("Petře/T}") End Sub
Náš kód je teraz v metóde a my ho môžeme jednoducho pomocou parametrov volať znova s rôznymi parametrami. Nemusíme 2x opisovať "Ahoj užívateľovi...". Kód budeme odteraz deliť logicky do metód:
Konzolová aplikácia
Ahoj používateľovi Karle
Ahoj užívateľovi Petře
Pridanie atribútu
Triede pridáme nejaký atribút. Ponúka sa text
, kde bude
uložený text pozdravu. Atribúty sa definujú rovnako ako premenné. Vždy pri
nich musíme uviesť modifikátor prístupu. My použijeme
Public
, pretože s ním chceme pracovať zvonku triedy.
Upravme si teda našu triedu:
Option Explicit Public text As String Public Sub Pozdrav(jmeno As String) Debug.Print text + jmeno End Sub
Text teraz musíme pochopiteľne nastaviť vytvorené inštanciu v metóde
Main()
v module Main
:
Option Explicit Private Sub Main() Dim Zdravic As Zdravic Set Zdravic = New Zdravic() Zdravic.text = "Ahoj užívateľovi " Zdravic.Pozdrav ("Karle") Zdravic.Pozdrav ("Petre") Zdravic.text = "Vítam Ťa tu, programátora " Zdravic.Pozdrav ("Richarde") End Sub
Konzolová aplikácia
Ahoj používateľovi Karle
Ahoj užívateľovi Petře
Vítam Ťa tu, programátor Richard
Vrátenie hodnoty
Vzhľadom k objektovému návrhu nie je najvhodnejšie, aby si každý objekt
ovplyvňoval vstup a výstup, ako sa mu zachce. Pochopiteľne narážam na naše
vypisovanie do konzoly. Každý objekt by mal mať určitú kompetenciu a tú by
nemal prekračovať. Poverme náš objekt iba zostavením pozdravu a jeho výpis
si spracujme už mimo, v našom prípade v metóde Main()
. Výhodou
takto navrhnutého objektu je vysoká univerzálnosť a
znovupoužiteľnosť.
Objekt doteraz vie len písať do konzoly. My ho však prispôsobíme tak, aby daná metóda text iba vracala a bolo na jeho príjemcovi, ako s ním naložia. Takto môžeme pozdravy ukladať do súborov, písať na webové stránky, alebo ďalej spracovávať.
Keďže chceme, aby metóda vracala hodnotu, a to String
,
zameníme kľúčové slovo Sub
za Function
a pridáme
za okrúhle zátvorky As String
. Na návrat hodnoty použijeme
názov tejto metódy spolu s rovnítkom. Upravme modul aj triedu.
Metóda Pozdrav()
v triede Zdravic
:
Public Function Pozdrav(jmeno As String) As String Pozdrav = text + jmeno End Function
Telo metódy Main()
v module Main
:
Private Sub Main() Dim Zdravic As Zdravic Set Zdravic = New Zdravic() Zdravic.text = "Ahoj užívateľovi " Debug.Print Zdravic.Pozdrav("Karle") Debug.Print Zdravic.Pozdrav("Petre") Zdravic.text = "Vítam Ťa tu, programátora " Debug.Print Zdravic.Pozdrav("Richarde") End Sub
Konzolová aplikácia
Ahoj používateľovi Karle
Ahoj užívateľovi Petře
Vítam Ťa tu, programátor Richard
A sme na konci. Nami napísaný program má už nejakú úroveň, aj keď toho zatiaľ vlastne veľmi nerobí.
Pokiaľ sa vám niečo nepodarilo, nevadí. Môžete si stiahnuť vzorové excelovské súbory, ktoré som pre vás pripravil
V budúcej lekcii, Hracia kocka vo VBA - Zapuzdrenie, konštruktor a Random , si urobíme takú jednoduchú hračku, necháme dva objekty (bojovníkov) súperiť v aréne (tiež objekte). Máte sa na čo tešiť;-) .
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 24x (27.19 kB)
Aplikácia je vrátane zdrojových kódov