Příkazy cyklů ve Visual Basicu pro Aplikace

Přehled informací

Typy cyklů používané ve VBA

Cykly v programu slouží k opakovanému provádění úseku kódu. VBA používá dva typy cyklů:

Cykly For...Next

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.

Syntaxe příkazu

  For čítač = začátek To konec [Step krok]
    [příkazy]
    [Exit For]
    [příkazy]
  Next [čítač]

Argumenty příkazu

čí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

Poznámka vynechání jména čítače v příkazu Next

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 použití příkazů For ...Next

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

Cykly For Each ... Next

Příkazy For Each...Next opakují blok příkazů pro všechny objekty kolekce nebo pro všechny prvky pole.

Syntaxe příkazu

  For Each prvek In skupina
    [příkazy]
    [Exit For]
    [příkazy]
  Next [prvek]

Argumenty příkazu

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.

Poznámky k příkazu

Příklad použití příkazů For Each...Next

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

Cykly Do

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í.

První typ syntaxe příkazu

  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

Druhý typ syntaxe příkazu

  Do
    [příkazy]
    [Exit Do]
    [příkazy]
  Loop  [{While | Until} podmínka]

- v tomto tvaru cyklus proběhne vždy alespoň jednou

Argumenty příkazu

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.

Poznámka k příkazu

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.

Příklad opakování příkazů, dokud je výsledek vyhodnocení podmínky True

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

Příklad opakování příkazů dokud se nesplní podmínka

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

Příklad opuštění příkazu Do...Loop zevnitř smyčky

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

Poznámka nekonečná smyčka - ukončení

Nekonečnou smyčku ukončíme klávesou ESC nebo CTRL+BREAK.