Lekce 3 - Podmíněné příkazy ve VBA
V předchozím kvízu, Kvíz - Úvod do VBA, datové typy, jsme si ověřili nabyté zkušenosti z předchozích lekcí.
Logické operátory a operátory porovnání vytvářejí logické výrazy,
jejichž vyhodnocením získáme výsledek PRAVDA
, angl.
TRUE
, nebo NEPRAVDA
, angl. FALSE
.
Logických výrazů se využívá v podmíněných příkazech, které
umožňují větvit program do více částí, podle výsledku podmíněného
výrazu.
Ve VBA se u výsledků logických výrazů používá
výhradně anglických výrazů
True
/False
.
Operátory porovnání
Operátor | Název | Příklad | Výsledek |
---|---|---|---|
> |
větší než | 3 >9 |
False |
< |
menší než | 3 <9 |
True |
= |
rovno | 6 =6 |
True |
>= |
větší nebo rovno | 5 >=4 |
True |
<= |
menší nebo rovno | 5 <=4 |
False |
<> |
není rovno | 5 <>5 |
False |
Like |
shoduje se s (lze používat zástupné znaky) | máslo Like ?ás* | True |
Is |
porovnání objektů, bude objasněno později |
Pokud vás zarazí znak =
, který jsem dříve
definoval jako znak přiřazení, jde o použití v
kontextu, tedy tam, kde program očekává přiřazení, provede
přiřazení a tam, kde očekává operátor porovnání, provádí
logický test.
Spojování logických výrazů
Často potřebujeme vyhodnotit několik logických výrazů a pracovat s
jejich výsledkem. Základní operátory propojení dvou logických výrazů
jsou And
a Or
. Platí poměrně snadná pomůcka pro
použití těchto operátorů:
And
dává výsledek True
pouze,
pokud mají oba spojené výrazy hodnotu True
.
(10 > 5) And (5 < 10) 'výsledek je True
Or
dává výsledek True
v případě,
že alespoň jeden ze spojených výrazů má hodnotu
True
.
(10 > 5) Or (5 > 10) 'výsledek je True
Příkazy rozhodovací nebo též podmíněné
Rozhodovací příkaz If
...Then
je zcela obecný.
Je to základní rozhodovací struktura ve VBA. Další rozhodovací příkazy
usnadňují některé vybrané konstrukce.
Příkaz If
..Then
Vyhodnotí zapsanou podmínku za klíčovým slovem If
. Podle
výsledku vykoná buď část za klausulí Then
pro
PRAVDA
, nebo jinou část za klausulí Else
pro
NEPRAVDA
. Ve zjednodušené verzi může druhá část chybět,
tedy ta, která provádí příkazy pro NEPRAVDA
.
If x>5 Then (zde budou příkazy pro případ, že podmínka je pravdivá) Else (zde budou příkazy pro případ, že podmínka není pravdivá) End If
Zkrácená verze příkazu If
je tato:
If x>5 Then (zde budou příkazy pro případ, že podmínka je pravdivá) End If
Funkce Select Case
Ve funkci se vyhodnotí testovaný výraz. Jeho výsledkem
musí být hodnota (logická, číselná nebo string)
a podle výsledné hodnoty se vyhledá první shodná konstanta
nebo výraz za klausulí Case
(ta musí být
stejného datového typu jako výsledek testovaného výrazu) a vykonají se
příkazy až po další klausuli Case
.
Příklad: převedeme číselné školní známky na jejich slovní vyjádření
Select Case //Testovaný výraz// Case 1 Slovo = „Výborný“ Case 2 Slovo = „Chvalitebný“ Case 3, 4, 5 'je možno použít také seznam konstant Slovo = „No dobrá“ End Select
Funkce IIf()
Tato funkce je zjednodušenou verzí příkazu
If
...Then
. Prvním výrazem ve funkci je
podmínka, která se vyhodnocuje jako logický výraz. Při
výsledku PRAVDA
je hodnotou funkce druhý výraz,
v opačném případě je hodnotou funkce třetí výraz.
Funkce IIf()
má hned dvě výhody:
- Za prvé vrací hodnotu, kterou lze přímo použít ve výrazu nebo v jiné funkci.
- Za druhé, funkci lze řetězit, takže místo druhého nebo třetího výrazu můžeme opět použít tuto funkci a vyhodnotit tak více než jednu podmínku.
Jednoduchá funkce:
IIf(x<4, „známka je dobrá“, „známka se kloní k pětce“)
Funkce Choose()
Tato funkce jako podmínku vyhodnocuje výraz numerický
(=
index), zapsaný jako první výraz. Z
následujícího seznamu výrazů vybere ten s odpovídajícím pořadím,
který je hodnotou funkce. Pořadí se počítá od jedničky
jako souvislá posloupnost.
Choose(vZnamka, "Výborný", "Chvalitebný", "Dobrý", "Dostatečný", "Nedostatečný")
Funkce Switch()
Funkce zjednodušující hledání výsledku při
více podmínkách. Jde o seznam dvojic logický
výraz a výraz pro pravda. Pokud je logický výraz
vyhodnocen jako TRUE
, hodnotou funkce je výraz pro pravda. Změna
proti předchozí funkci Choose()
je ta, že seznam nemusí
být souvislý a podmínka, zapsaná v každé dvojici, musí
být logická. Může být i složitější.
Switch(vZ = 1, "Výborný", vZ >= 2, "Nevhodný")
Příklady použití logických funkcí
Funkce fnIf
ukazuje obecný podmíněný příkaz ve VBA.
Řazením If
…Then
… do kaskády lze vyřešit i
hodně složité logické podmínky a jejich kombinace. Zde uvedený příklad
je lépe řešitelný dále následujícími funkcemi:
Option Explicit Public Function fnIf() Dim vB As String Dim vZnamka As Integer ´naplnění testované proměnné vZnamka = 5 ´podmíněné příkazy If vZnamka = 1 Then vB = "Výborný" Else If vZnamka = 2 Then vB = "Chvalitebný" Else If vZnamka = 3 Then vB = "Dobrý" Else If vZnamka = 4 Then vB = "Dostatečný" Else vB = "Nedostatečný" End If ' if 4 End If ' if 3 End If ' if 2 End If ' if 1 Debug.Print vB End Function
Přehledným způsobem funkce fnSelect
poskytuje
stejnou službu, jako funkce předchozí pomocí
Select Case
. Klausule Case Else
umožňuje efektivně
ošetřit také špatný vstup.
Public Function fnSelect() Dim vZnamka As Integer Dim vText As String ´naplnění proměnné vZnamka = 7 ´vyhodnocování proměnné Select Case vZnamka Case 1 vText = "Výborný" Case 2 vText = "Chvalitebný" Case 3 vText = "Dobrý" Case 4 vText = "Dostatečný" Case 5 vText = "Nedostatečný" Case Else vText = "NEZADÁNO" End Select Debug.Print vText End Function
Funkce fnIIf
ukazuje řetězení funkcí
IIf
tak, že místo třetího výrazu je uvedena další funkce
IIf
. Tímto vnořením se zápis stává poněkud
nepřehledný, zejména pokud jsou výrazy
složitější a vnoření vícenásobné.
Public Function fnIIf() Dim vB As String Dim vZ As Integer vZ = 4 vB = IIf(vZ = 1, "Výborný", IIf(vZ = 2, "Chvalitebný", IIf(vZ = 3, "Dobrý", IIf(vZ = 4, "Dostatečný", "Nedostatečný")))) Debug.Print vB End Function
Pokud chceme hledat podle indexu v poli nebo souvislém seznamu,
je funkce Choose
ideální. Přehledný zápis a jednoduchost
ukazuje funkce fnChoose
. Nevýhodou je, že nelze ošetřit
případné hodnoty mimo zadanou množinu.
Public Function fnChoose() Dim vB As String Dim vZnamka As Integer vZnamka = 2 vB = Choose(vZnamka, "Výborný", "Chvalitebný", "Dobrý", "Dostatečný", "Nedostatečný") Debug.Print vB End Function
Funkce fnSwitch
dává přehled o řazení
podmínek a při splnění jejich realizaci, jak jdou v zápisu funkce
Switch
. Tím, že je vždy u každého případu uveden
podmíněný výraz, je tato funkce obecnější, než funkce
Choose
a poměrně jednoduše lze ošetřit chybné zadání, zde
následující dvojice po výrazu „Nedostatečný“.
Public Function fnSwitch() Dim vB As String Dim vZ As Integer vZ = 1 vB = Switch(vZ = 1, "Výborný", vZ = 2, "Chvalitebný", vZ = 3, "Dobrý", vZ = 4, "Dostatečný", vZ = 5, "Nedostatečný", vZ < 1, "Nízké číslo", vZ > 5, "Vysoké číslo") Debug.Print vB End Function
To je v dnešní lekci vše.
V příští lekci, Příkazy cyklu a složené datové typy ve VBA, se naučíme deklarovat složené datové typy a zpracování v cyklech