Způsob programování ve VBA je označován jako událostmi řízené programování, jedná se o vytvoření určité skupiny "inteligentních" objektů, které vědí jak reagovat na instrukce od uživatele. Dále pak zpracovat vstup od uživatele v procedurách událostí spojených s těmito "inteligentními" objekty. V procedurách událostí budete často postaveni před problém přidání určité "inteligence" do kódu programu. K tomuto účelu slouží právě rozhodující struktury. V následujícím výkladu budou vysvětleny dvě rozhodovací struktury:
Základní rozhodovací strukturou ve VBA je rozhodovací struktura If .. Then .. Else. Tato struktura zajišťuje podmínečné provedení skupiny příkazů závisející na hodnotě výrazu.
Jednořádkový tvar:
If podmínka Then přikaz1 _ [:přikazn][Else elsepříkaz1 [:elsepřikazn]]
Víceřádkový tvar
If podmínka Then [příkazy] [ElseIf podmínka-n Then [elseifpříkazy] ... [Else [elsepříkazy]] End If
podmínka | ||
Povinná. Může se skládat z číselného nebo řetězcového výrazu, vyhodnotitelného jako True nebo False. Obsahuje-li podmínka hodnotu Null, je vyhodnocena jako False. |
||
příkazy | ||
Povinné - povinné v jednořádkovém tvaru, který nemá klauzuli Else. Volitelné - při použití blokového zápisu. Jeden nebo více příkazů oddělených dvojtečkami. Vykonají se, když je podmínka vyhodnocena jako True. |
||
podmínka-n | ||
Volitelné. Stejné jako podmínka. | ||
elseifpříkazy | ||
Volitelné. Jeden nebo více příkazů, které budou provedeny, je-li příslušná podmínka-n True. | ||
elsepříkazy | ||
Volitelné. Jeden nebo více příkazů, které se provedou v případě, kdy žádný předchozí výraz podmínka nebo podmínka-n není vyhodnocena jako True. |
Podmínky při použití blokového zápisu:
Jak již bylo uvedeno uživatel má k dispozici dva tvary příkazu If..Then..Else - jednořádkovou a víceřádkovou syntaxi.
Jednořádkovou syntaxi příkazu If..Then..Else je vhodné použít, potřebujete-li zpracovat při splnění podmínky jeden příkaz. Použití více příkazů je možné, ale příkazy musí být odděleny dvojtečkou (pro více příkazů je však vhodnější použít víceřádkovou syntaxi- z důvodu lepší čitelnosti kódu).
Jednořádková syntaxe:
Sub NastavHodnotu() hodnotaNova = ThisDrawing.Utility.GetReal("Napiš číslo: ") If hodnotaStara < hodnotaNova Then hodnotaStara = hodnotaNova End Sub
Chceme-li zpracovat více řádků kódu, případně použít příkaz If..Then..Else i s klauzulí ElseIf, musíte použít víceřádkovou syntaxi. Víceřádková syntaxe také podstatně zpřehledňuj psaný kód. Při použití víceřádkové syntaxe je důležité neopomenout uvést ukončující příkaz End If.
Víceřádková syntaxe:
Sub ViceradkoveNastaveni() hodnotaNova = ThisDrawing.Utility.GetReal("Napiš číslo: ") If hodnotaStara < hodnotaNova Then hodnotaStara = hodnotaNova hodnotaNova = 55 ... další příkazy zpracovávané při splnění podmínky End If End Sub
V případě příkazu If...Then...Else je také výhodnější použít víceřádkovou syntax. Příkaz If..Then..Else se používá k definici dvou bloků příkazů:
Sub ViceradkoveNastaveni() hodnotaNova = ThisDrawing.Utility.GetReal("Napiš číslo: ") If hodnotaStara < hodnotaNova Then hodnotaStara = hodnotaNova hodnotaNova = 55 ... další příkazy zpracovávané při splnění podmínky Else hodnotaNova = hodnotaStara hodnotaStara = -55 ... další příkazy zpracovávané při nesplnění podmínky End If End Sub
Potřebujete-li vytvořit složitější logickou strukturu, nabízí Vám VBA příkaz ElseIf. Pokud například potřebujete v případě, že je první podmínka vyhodnocena jako nesplněná (False) a potřebujete otestovat další podmínku, vložíte do příkazu If...Then...Else právě příkaz ElseIf.
Následující funkční procedura ukazuje využití příkazu ElseIf pro další testování typu kresleného objektu. Pokud je typ kresleného objektu 1, je do proměnné barva přiřazena hodnota "red", v opačném případě je opět testován typ objektu atd. Příkaz, který následuje za příkazem Else, se zpracuje, pokud jsou všechny podmínky všech příkazů If a ElseIf vyhodnoceny jako nesplněné (False).
Function nastavBarvu(typKreslenehoObjektu) If typKreslenehoObjektu = 1Then barvaObjektu = "Red" ElseIf typKreslenehoObjektu = 2 Then barvaObjektu = "Blue" ElseIf typKreslenehoObjektu = 3 Then barvaObjektu = "Green" Else barvaObjektu = "White" End If End Sub
Vykoná jednu z několika skupin příkazů podle hodnoty výrazu. Příkaz Select Case se používá jako alternativa k použití příkazů ElseIf v příkazech If...Then...Else při vyhodnocení jednoho výrazu vzhledem k několika různým hodnotám. Zatímco příkazy If...Then...Else mohou v každém příkazu ElseIf vyhodnocovat jiný výraz, příkaz Select Case vyhodnocuje pouze jediný výraz na začátku své řídící struktury.
Select Case testovaný_výraz [Case seznam_výrazů-n [příkazy-n]] [Case Else [elsepříkazy]] End Select
testovaný_výraz | ||
Povinné. Může se skládat z libovolného číselného nebo řetězcového výrazu | ||
seznam_výrazů-n | ||
Povinné, vyskytne-li se klauzule Case. Seznam_polozek-n představuje hodnoty s kterými se porovnává testovaný výraz. Formát položek je následujícím:
Příklady použití seznam_výrazů-n viz příklad použití. |
||
příkazy-n | ||
Volitelné. Jeden nebo více příkazů vykonaných, jestliže testovaný_výraz odpovídá libovolné části ze seznamu_příkazů-n. | ||
elsepříkazy | ||
Volitelné. Jeden nebo více příkazů vykonaných, jestliže testovaný_výraz neodpovídá žádné klauzuli z Case. |
Odpovídá-li testovaný_výraz některému výrazu ze seznamu_výrazů Case, jsou vykonány příkazy následující za odpovídající klauzulí Case do další klauzule Case, v případě poslední klauzule do End Select. Řízení je pak předáno na příkaz následující za klíčovým slovem End Select. Odpovídá-li testovaný_výraz výrazu ze seznamu_výrazů ve více než jedné klauzuli Case, jsou vykonány pouze příkazy uvedené za první nalezenou klauzulí.
Klauzule Case Else se používá k označení příkazů, které se vykonávají, není-li v seznamu_výrazů nalezen žádný výraz odpovídající testovanému_výrazu. Ačkoli to není povinné, je vhodné mít příkaz Case Else v bloku Select Case pro obsluhu nepředvídaných hodnot testovaného_výrazu. Neodpovídá-li žádný seznam_výrazů Case testovanému_výrazu a pokud neexistuje příkaz Case Else, pokračuje běh příkazem následujícím za příkazem End Select.
V následujícím příkladu příkaz Select Case vyhodnocuje argument typKreslenehoObjektu, který je předán proceduře. Každý příkaz Case může obsahovat několik hodnot, rozmezí hodnot nebo kombinaci hodnot a relační operátory. Volitelný příkaz Case Else se zpracuje, pokud v příkazu Select Case vstupní hodnota neodpovídá žádnému z příkazů Case.
Function nastavBarvu2(typKreslenehoObjektu) Select Case typKreslenehoObjektu Case 1 barvaObjektu = "Red" Case 2, 3 barvaObjektu = "Blue" Case 4 To 7 barvaObjektu = "Green" Case Is > 10 barvaObjektu = "Yellow" Case Else barvaObjektu = "White" End Select End Function