Rozhodovací struktury

Přehled informací

Rozhodovací struktury používané ve Visual Basicu pro Aplikace

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:

Rozhodovací struktura If ..Then..Else

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.

Syntaxe příkazu

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

Argumenty příkazu

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.

Poznámky k příkazu

Podmínky při použití blokového zápisu:

Příklad použití struktury If..Then

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

Příklad použití struktury If..Then..Else

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

Příklad použití struktury If..Then..ElseIf

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

Rozhodovací struktura Select Case

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.

Syntaxe příkazu

  Select Case testovaný_výraz
    [Case seznam_výrazů-n
      [příkazy-n]]
    [Case Else 
      [elsepříkazy]] 
  End Select

Argumenty příkazu

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:

  • výraz,
  • výraz To výraz (určuje rozsah hodnot, menší z hodnot musí být uvedena před To),
  • Is výraz s operátory_porovnání (určuje rozsah hodnot, za Is nesmí být použity operátory Is a Like).

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.

Poznámky k příkazu

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.

Příklad použití struktury Select Case

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