Deklarace - nutné dobro

Deklarace procedur a proměnných

autor: Ing. Petr Pecháček

http://officir.ic.cz

Sešit Excelu s příklady (komprese ZIP)

Na úvod

Následující odstavce si rozhodně nekladou za cíl provést Vás deklaracemi bod po bodu a do posledního detailu. Jen samostudium nápovědy a literatury spojené s testováním příkladů posune schopnosti o kus dál. Také jsem si vědom, že řada z Vás by se už nejraději vrhla na samotné procedury, algoritmy a konkrétní kódy pro Excel. Nespěchejte...

Deklarace procedur

Procedury jsou, jak již bylo řečeno, pojmenovaným sledem příkazů, které se vykonají najednou (neuvažujme teď krokování programu, ale přímé spuštění). Zabývat se budeme jednoduchými procedurami ve standardním modulu. Takové procedury se uvozují příkazem Private (procedura dostupná pouze v daném modulu), Public (procedura dostupná v celém projektu) či Static (udává charakter lokálních proměnných procedury). Následuje slovo Sub, název procedury a závorky (v nich se případně vyskytuje seznam argumentů, které procedura očekává). Úplnou syntaxi najdete v nápovědě a literatuře. Nápověda: karta Answer Wizard, "sub statement" nebo karta Obsah, Visual Basic Language Reference / Statements. Pojďme na příklady.

Sub Procedura1()
'procedura dostupná pro celý projekt
'libovolný programový kód
End Sub

Public Sub Procedura2()
'totéž, co Procedura1
'libovolný programový kód
End Sub

Private Sub Procedura3()
'procedura dostupná pouze pro modul, v němž se vyskytuje
'libovolný programový kód
End Sub

Poznámka: V deklaraci procedury standardního modulu je příkaz Public výchozí, proto nemusí být uveden. Na procedury se odkazujeme jejich názvem.

Dostupnost procedur

Deklarace proměnných obecně

Deklarace proměnné je instrukcí, která říká programu, jaké má proměnná jméno a na základě datového typu jí vymezí prostor v paměti. Deklaraci program provede sám (implicitní deklarace) nebo ji provedeme sami zápisem v kódu (explicitní deklarace). Konstanty je také třeba deklarovat.

Datové typy

Datový typ říká počítači, kolik prostoru má poskytnout datům v paměti. Jestliže vám chce někdo darovat drobnost, také vás nepošle pro krabici, pouze vás požádá, abyste nastavili dlaň. Nemusíte tedy trávit čas hledáním krabice a ptát se, jestli ta či ona velikost stačí. Stejně tak definování prostoru pro data v aplikaci je efektivní a vyhnete se problémům.

Všechny typy, které VBA podporuje, najdete v literatuře a nápovědě (karta Answer Wizard, "variable type" nebo karta Obsah, volba Visual Basic Language Reference / Data Types). Definovat můžete i vlastní datové typy, ale o tom někdy jindy (v přiloženém sešitu příklad najdete). Pro tuto chvíli postačí následující doporučení:

  • Pro řetězcové (textové) proměnné používejte datový typ String.
  • Pro dvoustavové pravdivostní hodnoty TRUE-FALSE je určen datový typ Boolean.
  • Pro celá čísla slouží datový typ Integer.
  • Pro reálná čísla volte datový typ Single nebo Double.
  • Pro datumy (a časy) používejte datový typ Date.

Není-li datový typ námi předepsán, program použije datový typ Variant, tedy jakýsi obecný datový typ s chováním chameleona.

Editor VBE nám v deklaraci pomáhá. V momentě, kdy v příkladu níže vložíme mezeru za slovem "As", objeví se roletka se seznamem. Zapíšeme-li znaky "integ" a stiskneme Ctrl+mezerník, editor sám doplní slovo "Integer".

Dopomoc při definici typu proměnné

Implicitní deklarace

Jak již bylo řečeno, proměnným, jež nedeklarujeme explicitně, přiřadí program automaticky typ Variant. V momentě, kdy je pak zpracovává v kódu, typ vždy kontroluje a vybírá vhodnější.

Explicitní deklarace

Proč deklarovat explicitně, tedy ručně? Odpověď vyplývá z předchozího. Explicitně zadaný typ proměnné spotřebuje méně místa v paměti a typ si program při zpracovávání kódu nemusí kontrolovat, čímž se výrazně průběh urychlí.

Deklarace proměnných

Pro deklaraci proměnných se používají příkazy Dim, Private, Public nebo Static (o použití více v odstavci o oboru platnosti proměnných). Následuje nepovinná část As typ. Na jednom řádku je povoleno deklarovat více proměnných (jako oddělovač se používá čárka). Nápověda: karta Answer Wizard, "variable statement". Podívejte se na jednoduché příklady.

Dim i As Integer
'proměnná i typu Integer (celé číslo, rozsah viz nápověda)

Dim Text As String
'proměnná Text typu String (řetězec znaků)

Dim Pole(1 To 10)
'proměnná typu pole (bude probrána samostatně)

Dim Tlacitko As CommandBarControl
'tzv. objektová proměnná
'zde jde o ovládací prvek panelu nástrojů

Poznámka 1
Narozdíl od některých programovacích jazyků zápis

Dim A,B,C as Integer

určuje pouze typ proměnné C jako Integer, proměnné A a B budou obecného typu (Variant)! Správně by tedy zápis měl vypadat

Dim A As Integer, B As Integer, C As Integer

V praxi se tomu ale vyhýbáme použitím typového znaku, který nahradí část As typ. V daném případě by zápis měl podobu

Dim A%,B%,C%

Typové znaky pro vybrané datové typy jsou:

  • Integer: %
  • Long: &
  • Single: !
  • Double: #
  • Currency: @
  • String: $

Poznámka 2
Výchozím datovým typem je Variant. VBA ovšem nabízí jednu instrukci, se kterou můžeme hned v úvodu modulu změnit výchozí datový typ pro skupinu proměnných. Tou instrukcí je Deftyp. Například zápis DefInt I-K definuje výchozí typ Integer v rámci modulu pro všechny proměnné začínající znaky I, J a K. Nápověda: karta Answer Wizard, "deftype statements".

Poznámka 3
Mlčky jsem přešel jednu skutečnost, která není zmíněna ani u datových typů, ani u deklarací proměnných. Proměnná totiž může být i objektového typu. Tak například, pokud naše proměnná má představovat oblast buněk listu, pak takovou proměnnou deklarujeme zápisem

Dim Oblast As Range

Výhoda takto explicitně deklarované proměnné je i v tom, že pokud v kódu zapíšeme slovo Oblast následované tečkou, VBE nabídne přímo seznam podporovaných vlastností a metod!

Výhody explicitně deklarované objektové proměnné

Poznámka 4
Že není možné datové typy stanovovat bez uvážení, ukazuje následující příklad, ve kterém si "natlučete". Datový typ Integer totiž představuje celá čísla a později zadané desetinné číslo si jednoduše zaokrouhlí...

Sub PozorNaSpatnyTyp()
   Dim Cislo As Integer
   Cislo = 3.14
End Sub

Vynucená deklarace
Vyskytuje-li se hned zkraje Okna kódu zápis Option Explicit, budete nuceni každou proměnnou deklarovat explicitně. Jinak se dočkáte hlášení uvedeného níže. Kladete si otázku, proč to vše dělat, když si tím na sebe ušijete bič? Kromě zmíněných výhod explicitně deklarovaných proměnných totiž navíc minimalizujte chyby z důvodů překlepu v názvu proměnné.

Jaký datový typ?

Nastane situace, kdy nebudete vědět, jaký typ pro proměnnou zavést. V tom případě jednoduše deklarujte proměnnou jako Dim Neznama bez uvedení typu a po prvním přiřazení obsahu použijte v kódu funkci TypeName. Uvedený příklad zobrazí okno s typem, který přiřadil proměnné program.

Sub NeznamyTyp()
   Dim Neznama
   Neznama = "Řetězec"
   MsgBox TypeName(Neznama)
End Sub
Okno s typem

Poznámka: V nápovědě najdete také funkci VarType vracející podtyp proměnné.

Jinou možností je sledovat okno Locals při krokování programového kódu (F8) a nechat se navést.

Vysledování typu proměnné

Doporučení

  • Názvy tvořte ze slov s prvním velkým písmenem a bez mezer tak, jak to znají notoričtí esemeskaři (ToJeTedaVec) nebo místo mezer používejte podtržítko (To_je_teda_vec).
  • V dřívějších dobách se hojně užíval tzv. maďarský způsob pro názvy proměnných, kdy název začínal zkratkou typu proměnné (například proměnná dPresnost, resp. dblPresnost byla typu Double).
  • Doposud jsem neřekl, že proměnná umí převléknout kabát (typ) v průběhu kódu, pokud byla v počátku definována jako typ Variant. Příklad ukazuje převlékání z původního typu Variant na Integer (druhý řádek) a String (třetí řádek). Takový postup je sice možný, ale neměl by se stát zvyklostí programátora.
  • Sub PrevlekaniTypu()
       Promenna = 7
       Promenna = Promenna & " trpaslíků"
    End Sub
    

Deklarace konstant

Konstanty uvozujeme příkazy Private, resp. Public (význam opět v odstavci o oboru platnosti) a slovem Const. Následuje nepovinná část As typ. Úplnou syntaxi pro deklaraci konstant naleznete v nápovědě (karta Answer Wizard, "const statement". My se zde podíváme rovnou na příklady.

'číselná konstanta
Const Gecko As Single = 9.80665

'obtížně zapamatovatelná konstanta typu datum (14.3.1982)
'zápis nemusí být v souladu s volbami systému (Místní nastavení)
Const DatumNarozeni As Date = #3/14/1982#

'textová konstanta, lajdácká deklarace
Const Autor = "Officír"

'textová konstanta, lepší deklarace
Const Autor1 As String = "Officír"

'textová konstanta, nejlepší deklarace
'* 7 značí délku sedm znaků
Const Autor2 As String * 7 = "Officír"

'pravdivostní konstanta (PRAVDA)
Const Vstup As Boolean = True

'neplatná deklarace (jméno začíná číslicí)
Const 011Smichov = "Provozovna 11"

'neplatná deklarace (obsahuje nepovolené znaky)
Const Trida 1.A = "blok 1"

'nedoporučená, konfliktní deklarace
'jméno se kryje s rezervovaným názvem (klíčovým slovem, funkcí, vlastností, ...)
Const List1 = 135

'nedoporučená deklarace (diakritika ve jménu)
Const Zvíře = "Tučňák patagonský"

Definice konstant smí obsahovat primitivní vzorce a odkazy na již existující konstanty. Konstantu nemůžeme definovat na základě proměnné.

'konstanta definovaná primitivním vzorcem
Const C10 = 2 * 3.14

'konstanta definovaná odkazem a vzorcem
Const C11 = True
Const C12 = C11 And False

Poznámka
Program má své předdefinované konstanty (začínají zpravidla písmeny "vb" a "xl"). Tak například pro přiřazení barvy lze použít zápis Const CervenaBarva = vbRed. V takovém případě nedoporučuji definovat striktně typ. Těžko byste bez větších zkušeností odhadli, že se jedná o typ Long.

Obor platnosti proměnných (konstant)

Obor platnosti (viditelnosti, dostupnosti) představuje oblast, ve které je daná proměnná dostupná (procedura, modul, projekt). Hranice oblasti vymezuje klíčové slovo (Dim, Private, Public nebo Static) a umístění deklarace. Deklarace se umísťují na začátek procedury nebo začátek modulu.

Proměnné na začátku procedury

Takové proměnné jsou lokálními proměnnými.

Sub PromenneVProcedure()
   Dim Alfa
   'proměnná dostupná pouze po dobu běhu této procedury
   Static Beta
     'proměnná dostupná po dobu běhu aplikace
     'dostupnost pouze pro tuto proceduru
     'obsah proměnné zachován i po ukončení procedury
   
     'zde následuje další kód
   
End Sub

Poznámka

Ze zkušenosti vím, že obsah proměnné definované slovem Static se sice uchovává i pro další volání procedury, pokud se ovšem na něj neodkážete nechtěně z procedury jiné! Pak je obsah takové proměnné resetován. Pokud tedy budete vícekrát volat první uvedenou proceduru níže, obsah proměnné DruhMasa se zachová, volání druhé procedury ale obsah vymaže. To mi nepřipadá korektní.

Sub Procedura()
   Static DruhMasa As String
   DruhMasa = "telecí"
End Sub

Sub JinaProcedura()
   Text = DruhMasa
End Sub

Proměnné na počátku modulu

Místo sloužící pro deklarace v úvodu modulu se nazývá Odstavec deklarací. Není nijak zvlášť ohraničeno. Program jej pouze vizuálně oddělí vodorovnou čarou stejně jako každou proceduru za předpokladu, že máte zaškrtnutou volbu Procedure Separator na kartě Editor v nabídce Tools / Options. Odstavec deklarací je prostě tvořen blokem deklarací směrem od počátku Okna kódu do výskytu první procedury.

Public Const Autor = "Officír"
'tzv. veřejná konstanta dostupná
'pro všechny procedury projektu
'obsah proměnné zachován i po ukončení procedur

Public Oblast As Range
'tzv. veřejná proměnná typu Range (oblast buněk listu) dostupná
'pro všechny procedury projektu
'obsah proměnné zachován i po ukončení procedur

Private P1 As String
Dim P2 As String
'dva ekvivalentní zápisy, tzv. privátní proměnné P1 a P2 budou dostupné
'pro všechny procedury tohoto modulu
'obsah proměnných zachován i po ukončení procedur

'pomyslný konec deklaračního odstavce

Sub Procedura1()
   'zde následuje libovolný kód využívající proměnné
End Sub

Sub Procedura2()
   'zde následuje libovolný kód využívající proměnné
End Sub

Obrázek by měl problematiku osvětlit více.

Strom dostupnosti proměnných

Chování při výskytu proměnných stejného jména v modulu ukazuje obrázek. Pro názornost je proměnná na úrovni modulu typu Variant.

Dvojí výskyt proměnné téhož jména

Ani já neznám všechny odpovědi na téma "stejné názvy proměnných a odkazy na ně". Nejsnazší je proměnné pojmenovávat jednoznačně...

Sešit Excelu s příklady (komprese ZIP)

Officír pro časopis CHIP.