Tento článek popisuje, proč a jak definovat v makrech Excelu proměnné.

Co je to proměnná?

Proměnnou si můžeme představit jako místo v paměti, kde si makro uchovává hodnoty. Do proměnné je možné makra ukládat, je možné je upravovat, vyvolávat, zobrazovat atd.

Proč definovat proměnné?

Excel defaultně nevyžaduje, aby proměnné byly definované. (Pokud byste ale chtěli, aby to po vás vyžadoval, stačí říct – funguje k tomu příkaz “Option Explicit” napsaný na začátku makra).

Je však několik důvodů, proč je dobré proměnné definovat.

  • Budete mít v kódu větší pořádek
  • Vyhnete se chybám, kdy neúmyslně dáváte proměnné hodnotu neodpovídající jejímu datovému typu
  • Makro bude rychlejší a méně náročné na výkon. Pokud totiž proměnné nenadefinujeme žádný vlastní datový typ, chápe ji VBA jako typ “variant”, který pokryje téměř všechno co ostatní typy, ale je mnohem náročnější na paměť (viz dále v tomto článku). Příklad rozdílu je uvedený na této stránce.

Jak může proměnná vypadat

Je docela rozumné nazývat proměnné tak, abychom poznali, co obsahují. Tedy např. “pocet_radku” je asi lepší než “x”.

Platí, že:

  • Názvy mohou obsahovat písmena, čísla a nějaké další znaky, ale prvním znakem musí být písmeno
  • Na malých a velkých písmenech nezáleží
  • Není možné používat mezery, ale_je_možné_nahradit_je_podtržítky.
  • Není možné používat znaky #, $, %, &, a !
  • Proměnné mohou mít sice až 254 znaků, ale asi není úplně moudré tento rozsah zcela využívat
  • Není možné používat slova, která mají ve VBA jiný význam (IF, NEXT…)

Datové typy

Proměnné mohou nabývat různé datové typy. Ve VBA jsou to tyto:

  • Byte
    V paměti zabere 1 bajt a může obsahovat celá čísla od nuly do 255.
  • Boolean
    V paměti zabere 2 bajty a může obsahovat hodnoty Pravda nebo Nepravda, True nebo False.
  • Integer
    V paměti zabere 2 bajty a může obsahovat celé číslo od -32 768 do 32 768.
  • Long
    V paměti zabere 4 bajty a může obsahovat celé číslo od – 2 147 483 647 do 2 147 483 647.
  • Single
    V paměti zabere 4 bajty a může nabývat hodnot pro kladná čísla od 1,401298E-45 do 3,402823E38 a obdobně pro záporná.
  • Double
    V paměti zabírá 8 bajtů, může nabývat hodnot kladná čísla od 4,94065645841247E-324 do 1.79769313486232E308 a obdobně pro záporná.
  • Currency
    V paměti zabírá 8 bajtů a nabývá hodnot 922 337 203 685 477,5807 na obě strany od desetinné čárky.
  • Decimal
    V paměti zabírá 8 bajtů a může nabývat  bez desetinných míst 9 228 162 514 264 337 593 543 950 335 na obě strany od desetinné čárky nebo 7,9228162514264337593543950335 s až 28 desetinnými místy na obě strany od desetinné čárky.
  • Date
    V paměti zabírá 8 bajtů a nabývá hodnot od 1.1. 100 do 31.12 9999.
  • Object
    V paměti zabírá 4 bajty a obsahuje odkazy na objekty.
  • String (s proměnlivou délkou)
    Zabírá v paměti 10 bajtů plus délku textu, nabývá hodnoty od nuly do cca 2 miliard znaků.
  • String (s pevnou délkou)
    Zabírá v paměti proměnlivé místo dle délky textu a nabývá hodnot od jedné do zhruba 65 400 znaků.
  • Variant (s čísly)
    Zabírá v paměti 16 bajtů a nabývá stejných hodnot jako Double, ale umí i hodnoty Empty, Error, Nothing a Null.
  • Variant (s písmeny)
    Zabírá v paměti 22 bajtů plus délka textu a nabývá hodnot od nuly do zhruba dvou miliard.
  • Uživatelsky definované typy
    Záleži na jejich nastavení

Pokud se do datového typu pokusíme uložit hodnotu, která není tímto typem podporovaná, pak buď dojde k chybě, nebo se hodnota “přizpůsobí”. Např. pokud zkusíte uložit do integeru číslo 123,456, uloží se 123. 

Jak proměnnou deklarovat

Pokud má proměnná fungovat v rámci jednoho makra, pak ji obvykle deklarujeme na začátku makra příkazem “Dim”, např.:

Dim pocet as integer

V takovém případě Excel proměnnou na konci makra “zapomene” a uvolní místo v paměti, které je proměnnou zabrané.

Pokud má proměnná fungovat pro více maker v rámci jednoho modulu, zapíšeme její deklaraci v modulu před první makro.

Pokud má být proměnná dostupná pro všechna makra, zapíše se na začátek kteréhokoliv modulu, ale místo “Dim” použijeme příkaz “Public”, např.:

Public pocet as integer

sub mojemakro()

...

end sub