Class Module

Tento modul umožní vytvářet vlastní objekty. Jde o velice silného pomocníka při tvorbě větších projektů. Práce s objekty je identická jako v Java či C#, jen ve VBA je horší práce v Dědičností (popíšeme si v extra díle). S objekty ve VBA jste již jistě pracovali, například Workbook či Worksheet. Detailněji o OOP (Objektově Orientovaném Programování) najdete na internetu, je toho tam spousta.

Proč používat objekty?

Pokud již máte zkušenost s jiným OOP jazykem, tak asi odpověď znáte, ale pro ostatní se pokusím osvětlit v čem je největší výhoda:

  1. Každý větší program se dostane do stavu, kdy mít všechno v jednom či více modulech přestává být přehledné. Výhoda OOP je v rozdělení programu na menší části. Asi jako když v Legu stavíte modely, vše je sestaveno z univerzálních malých kostiček.
  2. Každý objekt je uzavřený a je nezávislý na vaší aplikaci. Jde pak snadněji aktualizovat, testovat (o testech si povíme v jiném díle) a opravovat.
  3. Jeden objekt lze využít ve více projektech.

Samozřejmě vše není jen růžové a je tu i nejedna nevýhoda:

  1. Napsání objektu je časově náročnější než využít metodu. Ale díky znovupoužitelnosti je to nevýhoda jen zdánlivá.
  2. Vetší důraz na správnost návrhu.
  3. Pro někoho je složitější rozdělit si kód na objekty

Class Modul vs. Modul

Oba moduly využívají stejný zápis kódu

'Modules
Public Sub TiskZakaznik()
  Debug.Print "Nějaký výstup"
End Sub
'Class Modules - clsZakaznik
Public Sub TiskZakaznik()
  Debug.Print "Nějaký výstup"
End Sub

Volání funkce je ale jiné. U Modulu stačí zavolat jménem funkce, ale u volání z Class Module, je potřeba nejdříve vytvořit instanci(Zakaznik).

'volání Modulu
Sub Zakaznik()
TiskZakaznik
End Sub
'Volání Class Modules
Sub zakaznik()
Dim Zakaznik As New clsZakaznik
Zakaznik.TiskZakaznik
End Sub

Další odlišností je množství kopií. Pokud si uložíme nějakou proměnnou jako veřejnou do modulu, může být pod jedním názvem jen jedna. Ale u Class Module můžeme mít několik variant, proměnná je vázána k instanci(Zakaznik1 a Zakaznik2).

'Modules
zakaznikJmeno = "Novák"
'Modules
Dim Zakaznik1 As New clsZakaznik
Dim Zakaznik2 As New clsZakaznik

Zakaznik1.zakaznikJmeno = "Novák"
Zakaznik2.zakaznikJmeno = "Bálek"

Stavba Class Module

Uvedeme si jeden příklad kde je snad výhoda Class Modules zřejmá. Jde o práci se zákazníky.

'Modules
Sub databazeZakazniku()
Dim Zakaznik1 As New clsZakaznik
Zakaznik1.setJmeno = "Michal"
Zakaznik1.setPrijmeni = "Čech"
Zakaznik1.setStat = "CZ"

Dim zakaznik2 As New clsZakaznik
Zakaznik2.setJmeno = "Petr"
Zakaznik2.setPrijmeni = "Slovák"
Zakaznik2.setStat = "SK"

MsgBox Zakaznik1.metTiskZakaznik
MsgBox Zakaznik2.metTiskZakaznik
End Sub

Množství zákazníků je téměř neomezeno, ale pro větší množství je vhodnější použít pole než vypisovat stovky instancí. Ale pro ukázku to nebudeme komplikovat

'Class Modules - clsZakaznik
'== ATTRIBUTES =========================================================================
Private jmeno_s As String
Private prijmeni_s As String
Private stat_s As String

'== NON-PRIVATE GETTERS AND SETTERS=====================================================
Public Property Get getStat() As String
getStat = stat_s
End Property

Public Property Let setStat(ByVal value As String)
stat_s = value
End Property

Public Property Get getPrijmeni() As String
getPrijmeni = prijmeni_s
End Property

Public Property Let setPrijmeni(ByVal value As String)
prijmeni_s = value
End Property

Public Property Get getJmeno() As String
getJmeno = jmeno_s
End Property

Public Property Let setJmeno(ByVal value As String)
jmeno_s = value
End Property

'== NON-PRIVATE METHODS=================================================================
Public Function metTiskZakaznik() As String
metTiskZakaznik = "Jméno: " & getJmeno & vbCrLf & "Příjmení: " & getPrijmeni & vbCrLf & "Stát: " & getStat
End Function

Jak je vidno proměnné jmeno_s, prijmeni_s a stat_s (pojmenování proměných, objektů) vytvářím jak private. Důvodem je uzamčení těchto proměnných pro přístup z volání instance. Volat se dají jen přes Property Get pro čtení hodnoty a Property Let pro zápis. Jde tak proměnná uzavřít pro zápis zvenčí pokud Let dáte private či ho nevytvoříte vůbec. Osobně dávám ještě u Get před proměnou tag get a u Let dávám set. U metody používám met. Důvod je že na první pohled poznám co slouží k zápisu a co ke čtení. Druhá věc proč to tak dělám je seřazení volání z instance viz obrázek.


Ke stažení

Class Module