Cykly v programu slouží k opakovanému provádění úseku kódu. VBA používá dva typy cyklů:
Cykly For...Next slouží v procedurách událostí k provádění určité skupiny příkazů pro pevný, předem daný počet opakování. Cyklus For...Next má proto smysl například při provádění několika spolu souvisejících výpočtů, při práci s elementy na obrazovce nebo při zpracování určité množiny vstupních dat.
For čítač = začátek To konec [Step krok] [příkazy] [Exit For] [příkazy] Next [čítač]
čítač | |||
Povinné. Čítač cyklů - číselná proměnná. | |||
začátek | |||
Povinné. Počáteční hodnota čítače. | |||
konec | |||
Povinné. Koncová hodnota čítače. | |||
krok | |||
Volitelné. Krok čítače - o tuto hodnotu je čítač změněn po každém průchodu cyklem. Není-li uvedeno, nastaví se krok na 1. Hodnota kroku určuje způsob zpracování cyklu: |
|||
Hodnota | Podmínka pro průchod cyklem | ||
Kladná nebo 0 | čítač <= konec | ||
Záporná | čítač >= konec | ||
příkazy | |||
Volitelné. Posloupnost příkazů mezi For a Next, které jsou opakovaně vykonávány podle zadaného počtu opakování. |
Po vykonání všech příkazů v cyklu se hodnota kroku přičte k čítači. V tomto okamžiku se buď příkazy v cyklu provedou znovu (na základě stejného testu, podle kterého se cyklus vykonal i původně) nebo se cyklus ukončí a běh pokračuje příkazem následujícím za příkazem Next.
Pro předčasné ukončení může být v cyklu umístěn libovolný počet příkazů Exit For. Příkaz Exit For se často používá po vyhodnocení nějaké podmínky, například If…Then, a předá řízení příkazu následujícímu za příkazem Next. Jednotlivé cykly For...Next můžeme vnořovat. Je nutné čítač každého cyklu jednoznačně pojmenovat. Ukázka vnoření cyklů:
For I = 1 To 10 For J = 1 To 10 For K = 1 To 10 ... Next K Next J Next I
Vynecháme-li čítač v příkazu Next, běh pokračuje jako by byl čítač uveden. Je-li příkaz Next nalezen před odpovídajícím příkazem For, dojde k chybě.
Příklad procedury, která způsobí, že počítač vydá 10 krát zvukový signál. Příkaz For specifikuje proměnnou čítače x a její počáteční a koncové hodnoty. Příkaz Next zvýší hodnotu proměnné čítače o 1.
Sub Pipnuti() For x = 1 To 10 Beep Next x End Sub
Příkazy For Each...Next opakují blok příkazů pro všechny objekty kolekce nebo pro všechny prvky pole.
For Each prvek In skupina [příkazy] [Exit For] [příkazy] Next [prvek]
prvek | |||
Povinné. Proměnná používaná pro opakování přes prvky kolekce nebo pole. Pro kolekci může být prvek pouze proměnná typu Variant, generická objektová proměnná nebo určitá objektová proměnná. Pro pole může být prvek pouze proměnná typu Variant. | |||
skupina | |||
Povinné. Název kolekce objektů nebo pole (s výjimkou pole uživatelem definovaných typů). | |||
příkazy | |||
Volitelné. Jeden nebo více příkazů, které jsou vykonávány pro každý prvek skupiny. |
Příklad uzavření všech formulářů, až na formulář, který obsahuje běžící proceduru:
Sub ZavriFormulare() For Each frm In Applikace.Formulare If frm.Caption <> Screen.ActiveForm.Caption Then frm.Close Next End Sub
Příklad cyklického zpracování všech prvků pole a nastavení hodnoty prvků pole na hodnotu proměnné indexu I.
Dim TestPole(10) As Integer, I As Variant For Each I In TestPole TestPole(I) = I Next I
Cyklus Do představuje alternativu k cyklu For...Next. Tento cyklus provádí určitou skupinu příkazů opakovaně tak dlouho, dokud jistá podmínka není True nebo dokud podmínka v cyklu nezíská hodnotu True. Cykly Do tedy mají smysl zejména v případech, kdy nemůžeme dopředu určit počet opakování.
Do [{While | Until} podmínka] [příkazy] [Exit Do] [příkazy] Loop
- v tomto tvaru nemusí cyklus proběhnout ani jednou, není-li splněna podmínka na začátku
Do [příkazy] [Exit Do] [příkazy] Loop [{While | Until} podmínka]
- v tomto tvaru cyklus proběhne vždy alespoň jednou
podmínka | |||
Volitelné. Číselný výraz nebo řetězcový výraz, který je vyhodnocen jako True nebo False. Je-li podmínka Null, pak je vyhodnocena jako False. | |||
příkazy | |||
Jeden nebo více příkazů, které jsou opakovány, dokud je nebo dokud není podmínka True. |
Příkaz Exit Do slouží pro předčasné ukončení smyčky. Například po vyhodnocení nějaké podmínky, je možné pomocí příkazu Exit Do předat řízení na první příkaz uvedený za klíčovým slovem Loop.
Klíčové slovo While lze při kontrole podmínky v příkazu Do...Loop využít dvěma způsoby:
V následující proceduře PrvKontrWhile se zkontroluje podmínka před vstupem do smyčky. Je-li proměnná mojeCislo nastavena na hodnotu 9 namísto hodnoty 20, příkaz uvnitř smyčky se nikdy neprovede. V proceduře PoslKontrWhile se příkazy uvnitř smyčky zpracují pouze jednou, než se podmínka nastaví na False.
Sub PrvKontrWhile() citac = 0 mojeCislo = 20 Do While mojeCislo > 10 mojeCislo = mojeCislo - 1 citac = citac + 1 Loop MsgBox "Smyčka proběhla " & citac & " opakování." End Sub Sub PoslKontrWhile() citac = 0 mojeCislo = 9 Do mojeCislo = mojeCislo - 1 citac = citac + 1 Loop While mojeCislo > 10 MsgBox "Smyčka proběhla " & citac & " opakování." End Sub
Klíčové slovo Until lze při kontrole podmínky příkazu Do...Loop využít dvěma způsoby:
V následující proceduře KontrPrvUntil se podmínka otestuje před vstupem do smyčky. Druhou možnost - otestování proměnné na konci smyčky uvádí procedura KontrPoslUntil. Cyklické zpracování příkazů pokračuje, dokud zůstává výsledek vyhodnocení podmínky roven hodnotě False.
Sub KontrPrvUntil() citac = 0 mojeCislo = 20 Do Until mojeCislo = 10 mojeCislo = mojeCislo - 1 citac = citac + 1 Loop MsgBox "Smyčka proběhla " & citac & " opakování." End Sub Sub KontrPoslUntil() citac = 0 mojeCislo = 1 Do mojeCislo = mojeCislo - 1 citac = citac + 1 Loop Until mojeCislo = 10 MsgBox "Smyčka proběhla " & citac & " opakování." End Sub
Použití příkazu Do...Loop lze ukončit příkazem Exit Do. Chceme-li například opustit nekonečnou smyčku, použijeme příkaz Exit Do v bloku, do něhož se vstoupí po splnění podmínky v příkazu If...Then...Else nebo Select Case. Není-li podmínka splněna (výsledek vyhodnocení je False) poběží smyčka jako obvykle.
V následujícím příkladu se proměnné mojeCislo přiřadí hodnota, jejímž výsledkem je nekonečná smyčka. Příkaz If...Then...Else tuto podmínku testuje a opustí smyčku, když hodnota v proměnné mojeCislo bude mít hodnotu < 10. Tím se zabrání nekonečnému zacyklení.
Sub PrikladNavratu() citac = 0 mojeCislo = 9 Do Until mojeCislo = 10 mojeCislo = mojeCislo - 1 citac = citac + 1 If mojeCislo <10 Then Exit Do Loop MsgBox "Smyčka proběhla " & citac & " opakování." End Sub
Nekonečnou smyčku ukončíme klávesou ESC nebo CTRL+BREAK.