Lekce 2 - Datové typy ve VBA
V předchozí lekci, Úvod do VBA, jsme se seznámili s jazykem VBA, získali základní informace, definice a začali jsme s příklady.
Pokračujeme další porcí definic, abychom se seznámili se základními stavebními kameny jazyka. Vytvoříme nejjednodušší příkazy, procvičíme si počítání s čísly a budeme spojovat texty. Všude nás bude provázet definice datových typů, která zpřesní naše programy.
Definice
Výraz
Výraz je jeden nebo více prvků programu spojených operátory, které lze vyhodnotit, tedy vrátit hodnotu. Vyhodnocování probíhá podle stanovené priority.
Příkaz
Příkaz je nejmenší samostatná část programu popisující nějakou činnost, která má být provedena. Jde o proveditelný kód, prvkem nebo částí příkazu bývá většinou výraz. Více příkazů tvoří funkce, procedury a moduly.
Konstanta
Konstanta má vyhrazený název Const
. Je to pojmenované místo
v paměti, jeho hodnota je určena v deklaraci a nelze ji měnit. Deklarace
konstanty musí být v programu provedena před jejím použitím.
Operátor
Operátor je znak nebo několik znaků, které spojují výrazy a představují funkci matematických nebo logických operací. Např. sčítání, dělení, nerovnost.
=
- rovná se
Znak, který má výsadní postavení. Ve VBA znamená přiřazení hodnoty
proměnné stojící na levé straně od =
vyhodnoceným výrazem nebo funkcí, která stojí od =
vpravo. Např. zápis x = a + 5
znamená, že do
proměnné x
přiřadíme hodnotu proměnné a
a k ní
přičteme 5
. Zápis x = x + 12
je ve VBA zcela
legální, výsledkem je původní hodnota proměnné x
zvětšená
o 12
.
Objekt
Je programový modul popisující a obsluhující určitou část aplikace MS Office. Příklady v aplikacích: v Excelu je to oblast buněk nebo sešit, ve Wordu je to odstavec nebo slovo, v Access třeba tabulka nebo formulář. Ve VBA má objekt poněkud jiný význam, než v objektově orientovaných jazycích. Podrobněji se objekty budeme zabývat v dalších částech a zejména u jednotlivých aplikací.
Datové typy
Data si program ukládá do paměti podle názvů proměnných, které jste jim přiřadili v deklaraci a jak je používáte v programu. Data ale nejsou hromada smetí, jsou ukládána podle přesných pravidel nazvaných typ a podle určeného typu s nimi program pracuje. Nelze násobit číslo a název firmy, nebo logickou hodnotu porovnávat s datumem. Výčet datových typů:
Datový typ | Použití | Popis |
---|---|---|
Boolean | logická proměnná | nabývá hodnot Pravda = True a Nepravda =
False |
Byte | malé celé číslo | rozsah 0 - 255 |
Currency | měna | Výpočty v pevné desetinné čárce s vysokou přesností |
Date | datum a čas | Datum je v paměti uloženo jako číslo, v programu nebo výpisu má různé formy interpretace |
Double | reálné číslo dvojité přesnosti | Rozsah (10 na 308 ), tedy jednička s
308 nulami, přesnost na třináct desetinných míst |
Integer | celočíselné hodnoty | Rozsah -32 tisíc až +32 tisíc |
Long | celočíselné hodnoty dlouhé | Rozsah -2,14 miliardy až +2,14 miliardy |
Object | odkaz na objekt | bude upřesněno dále v kurzu |
Single | reálné číslo jednoduché přesnosti | Rozsah (10 na 38 ), přesnost sedm cifer |
String | řetězec znaků | Délka až 64000 B |
Variant | různý typ dat | není-li deklarován typ dat, program jej sám určí a vnitřně provádí konverze typů, je to pomalejší a méně přesné, než určit datový typ v deklaraci |
Operátory
Proměnné jsou pomocí operátorů spojeny do výrazů. Aritmetické operátory ve VBA jsou:
Operátor | Název | Příklad | Výsledek |
+ |
součet | 4 +11 |
15 |
- |
rozdíl | 8 -3 |
5 |
* |
násobení | 4 *2 |
8 |
/ |
dělení | 16 /2 |
8 |
\ |
celočíselné dělení | 16 \3 |
5 |
^ |
mocnina | 3 ^2 |
9 |
Mod |
zbytek po celočíselném dělení | 16 Mod 3 |
1 |
& |
sloučení řetězců | "Ano nebo " & "Ne" |
"Ano nebo Ne" |
Priorita operací
Nejjednodušším příkazem je přiřazení, například
výsledek výpočtu součtu a součinu se uloží do proměnné y
.
Nejdříve se násobí, až následně sčítá.
y = 15 + 3 * 10 'Výsledek y = 45
VBA zachovává prioritu operací podle aritmetiky. Pokud chceme pořadí operací ve výpočtu změnit, použijeme kulaté závorky - ().
y = (15 + 3) * 10 'Výsledek y = 180
Přesnost deklarace datových typů
Jazyk VBA nemá přísnou typovou kontrolu proměnných. Lze toho s výhodou využít tak, že není třeba transformace typů, ale při nevhodném použití může dojít ke ztrátě přesnosti při operacích mezi čísly nebo k chybě při práci s jinými typy.
V následující proceduře sečteme reálné a celé číslo, výsledek se uloží do celého čísla a tím dojde automaticky k zaokrouhlení, program chybu nehlásí.
Public Sub subCisla() 'ukázka chybné deklarace typu výsledku 'program chybu nehlásí, reálné číslo zaokrouhlí na celé '----------------------------- 'deklarace proměnných Dim y As Integer 'chyba, výsledek musí být také Single Dim a As Single Dim b As Integer 'naplnění proměnných /i v českém Excelu je ve VBA nutno používat desetinnou tečku/ a = 4.5337 b = 6 'výpočetní příkaz y = a + b 'zobrazení výsledku v okně Immediate y=11 Debug.Print y End Sub
Spojování řetězců
Častým příkazem v rámci VBA je zpráva, která má standardní části textu a obsahuje například čísla, která se doplňují importem, čtením z tabulky Excelu, nebo z jiných zdrojů.
Jednoduchý příklad subTexty()
je ukázkou spojování
textového řetězce, čísla jsou ukládána jako řetězec.
Public Sub subTexty() 'spojování textu '------------------------------ 'Deklarujeme si části textu jako konstanty Const c1 = "Na hřišti bylo " Const c2 = " dospělých a " Const c3 = " dětí" 'deklarujeme si proměnné, které lze libovolně naplnit Dim vTxt1 As String Dim vTxt2 As String Dim napis As String 'naplníme proměnné, jsou typu řetězec znaů vTxt1 = "5" vTxt2 = "37" 'sestavíme výsledek napis = c1 & vTxt1 & c2 & vTxt2 & c3 'zobrazení výsledku v okně Immediate; "Na hřišti bylo 5 dospělých a 37 dětí" Debug.Print napis End Sub
Zde opět upozorňuji z jiného úhlu: Typová kontrola není striktní. Tam, kde je možný převod čísel a textu, program provede transformaci typů a nehlásí chybu. Je to z důvodu zpětné kompatibility k původním verzím jednoduchého jazyka Basic.
Následující procedura je obdobou předchozí subTexty()
, ale
jedna z částí textového řetězce je deklarována jako číslo.
Public Sub subTextyJinak() '---> změna typů a správný výsledek proti subTexty <--- '------------------------------------------------------ Const c1 = "Na hřišti bylo " Const c2 = " dospělých a " Const c3 = " dětí" Dim vInt1 As Integer 'pozor, zde je změna Dim vTxt2 As String Dim napis As String vInt1 = 5 'naplňujeme jako číslo, ne řetězec vTxt2 = "37" napis = c1 & vInt1 & c2 & vTxt2 & c3 'vInt1 jsme použili jako řetězec bez typové změny 'napis = "Na hřišti bylo 5 dospělých a 37 dětí" Debug.Print napis End Sub
Tím je dnešní lekce u konce.
V následujícím kvízu, Kvíz - Úvod do VBA, datové typy, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.