Základy VBScriptu
Cykly ve VBScriptu
 Tisk

Cykly ve VBScriptu

Opakované provedení skupiny příkazů umožňují cykly. Ve VBScriptu jsou k dispozici následující příkazy cyklů:

Do…Loop: Probíhá, pokud je splněna podmínka. Jak bude dále uvedeno, existují verze tohoto cyklu s podmínkou na začátku i s podmínkou na konci cyklu.

While…Wend: Cyklus probíhá až do splnění podmínky. Tento cyklus je pozůstatkem z předchozích verzí Basicu a je nahraditelný předchozím cyklem.

For…Next: Cyklus s pevným počtem opakování.

For Each…Next: Opakuje skupinu příkazů pro každý prvek ve skupině objektů nebo v poli.

Cyklus Do…Loop

Opakuje blok příkazů, dokud je splněna podmínka.

Syntaxe

Do [{While | Until} podmínka]

    [příkazy]

[Exit Do]

    [příkazy]

Loop

Nebo můžete použít tuto syntaxi:

Do

    [příkazy]

[Exit Do]

    [příkazy]

Loop [{While | Until} podmínka]


Syntaxe příkazu Do…Loop má tyto části:

Část Popis
podmínka  Aritmetický nebo řetězcový výraz, který je vyhodnocen jako True nebo False. Pokud je podmínka vyhodnocena jako Null, je považována za False
příkazy  Jeden nebo více příkazů, které jsou opakovány, dokud nebo než podmínka nabude hodnoty True

Pro předčasné ukončení cyklu může být použit v rámci struktury Do…Loop příkaz Exit Do. Příkaz Exit Do je často používán spolu s podmíněným příkazem If…Then. V cyklu může být použit libovolný počet příkazů Exit Do a to na jeho libovolném místě.

Použití cyklu Do Loop

Příkaz cyklu Do…Loop můžete použít pro spuštění bloku příkazů v předem nedefinovaném počtu opakování. Příkazy jsou opakovány, dokud je splněna podmínka.

Podmínku můžete zkontrolovat ještě před provedením příkazů cyklu (jak je ukázáno v následujícím příkladu ). Příkazy uvnitř cyklu budou provedeny desetkrát. Pokud nastavíte proměnnou mojeCislo před provedením cyklu na hodnotu 9, cyklus neproběhne ani jednou.

Dim citac, mojeCislo

citac = 0

mojeCislo = 20 ' toto přestavte na 9

Do While mojeCislo > 10

    mojeCislo = mojeCislo - 1

    citac = citac + 1

Loop

MsgBox "Cyklus provedl " & citac & _

" opakování."

V následujícím příkladu proběhne cyklus pouze jednou, protože podmínka na konci cyklu je již před vyvoláním cyklu False

Dim citac, mojeCislo

citac = 0

mojeCislo = 9

Do

    mojeCislo = mojeCislo - 1

    citac = citac + 1

Loop While mojeCislo > 10

MsgBox " Cyklus provedl " & citac & _

" opakování."

Klíčové slovo Until můžete použít pro otestování podmínky v cyklu Do…Loop hned dvěma způsoby. Podmínku můžete otestovat před vstupem do cyklu (jak je ukázáno v následujícím příkladu ). Cyklus probíhá tak dlouho, dokud je podmínka False, a bude tedy proveden desetkrát.

Dim citac, mojeCislo

citac = 0

mojeCislo = 20

Do Until mojeCislo = 10

    mojeCislo = mojeCislo - 1

    citac = citac + 1

Loop

MsgBox " Cyklus provedl " & citac & _

"opakování."

Nebo můžete podmínku otestovat po prvním průchodu cyklu (jak je ukázáno v následujícím příkladu ). Cyklus probíhá tak dlouho, dokud je podmínka False, a bude tedy proveden devětkrát.

Dim citac, mojeCislo

citac = 0

mojeCislo = 1

Do

    mojeCislo = mojeCislo + 1

    citac = citac + 1

Loop Until mojeCislo = 10

MsgBox " Cyklus provedl " & citac & _

" opakování."

Provádění cyklu Do…Loop můžete přerušit užitím příkazu Exit Do. Protože obvykle chcete přerušit cyklus pouze v určitých situacích (např. nekonečná smyčka), použije se obvykle příkaz Exit…Do v podmíněném příkazu If…Then…Else. V následujícím příkladu je proměnné mojeCislo přiřazena hodnota 9, v těle cyklu se hodnota této proměnné nemění, a tudíž by vznikl nekonečný cyklus, protože mojeCislo nikdy nenabude hodnoty 10. Příkaz If…Then…Else spolu s Exit Do chrání cyklus před zacyklením.

Dim citac, mojeCislo

citac = 0

mojeCislo = 9

Do Until mojeCislo = 10

    mojeCislo = mojeCislo - 1

    citac = citac + 1

    If mojeCislo < 10 Then Exit Do

Loop

MsgBox " Cyklus provedl " & citac & _

" opakování."

Cyklus While…Wend

Vykonává příkazy tak dlouho, dokud je splněna podmínka.

Syntaxe

While podmínka

    [příkazy]

Wend

Syntaxe příkazu While…Wend má tyto části:


Část Popis
podmínka  Aritmetický nebo řetězcový výraz, který je vyhodnocen jako True nebo False. Pokud je podmínka vyhodnocena jako Null, je považována za False
příkazy  Jeden nebo více příkazů, které jsou opakovány, dokud nebo než podmínka nabude hodnoty True

Pokud je podmínka True, jsou vykonávány všechny příkazy, dokud se nenarazí na Wend. Běh skriptu se pak vrátí zpět na While a podmínka je znovu vyhodnocena. Pokud je podmínka stále True, proces se opakuje. Pokud není, průběh skriptu pokračuje vykonáváním příkazu následujícho příkaz Wend. Cykly While…Wend mohou být vnořovány do libovolné úrovně. Každý Wend odpovídá poslednímu použitému While.

VBScript poskytuje příkaz cyklu While…Wend pro ty, kteří jsou zvyklí jej používat z předchozích verzí Visual Basicu. Protože příkaz While…Wend postrádá flexibilitu, je doporučováno spíše užití cyklu Do…Loop.

Cyklus For…Next

Cyklus s pevným počtem opakování.

Syntaxe

For čítač = začátek To konec [Step krok]

    [příkazy]

[Exit For]

    [příkazy]

Next


Syntaxe příkazu For…Next má tyto části:


Část Popis
čítač  Řídící proměnná cyklu (číselná). Proměnná nemůže být prvkem pole nebo prvkem uživatelem definovaného typu.
začátek  Počáteční hodnota řídící proměnné.
konec  Konečná hodnota řídící proměnné.
krok  Hodnota, o kterou je změněna hodnota řídící proměnné po každém průchodu cyklu. Pokud není uveden, je krok roven jedné.
příkazy  Příkazy, které mají být opakovaně provedeny.

Krok může být jak kladný, tak záporný. Hodnota kroku určuje provádění cyklu dle následující tabulky:


Hodnota Cyklus proběhne pokud
Kladná nebo 0  Čítač <= Konec
Záporná  Čítač >= Konec

Hodnotu řídící proměnné cyklu lze měnit i v těle cyklu. Tyto změny však zhoršují čitelnost a možnost snadného odladění vašeho kódu.

Pro předčasné ukončení cyklu lze použít příkaz Exit For.Kdekoli v kódu cyklu může být umístěn libovolný počet příkazů Exit For. Příkaz Exit For je často používán spolu s vyhodnocením nějaké podmínky (například If…Then). Po použití tohoto příkazu pokračuje skript za příkazem následujícím bezprostředně za příkazem Next.

Příkazy cyklu For…Next můžete vnořovat umístěním jednoho cyklu For…Next do cyklu druhého. Nezapomeňte, že identifikátor řídící proměnné cyklu musí být pro každý cyklus jedinečný. Příklad:

For I = 1 To 10

For J = 1 To 10

    For K = 1 To 10

      . . .

    Next

Next

Next

Použití cyklu For…Next

Příkaz cyklu For…Next můžete použít pro opakované spuštění bloku příkazů pro známý počet opakování. Musíte použít řídící proměnnou cyklu, jejíž hodnota je zvětšována nebo zmenšována s každým opakováním cyklu. V následujícím příkladu způsobí cyklus padesátinásobné spuštění procedury nazvané MojeProc. Proměnná x je řídící proměnnou cyklu, její počáteční hodnota je 1 a konečná hodnota 50. Příkaz Next zvětšuje x o hodnotu 1.

Dim x

For x = 1 To 50

MojeProc

Next

Užitím klíčového slova Step můžete zvětšovat nebo zmenšovat řídící proměnnou cyklu o vámi zvolenou hodnotu. V následujícím příkladu je řídící proměnná cyklu zvětšována o hodnotu 2 před každým dalším průběhem cyklu. Když cyklus skončí, je proměnná celkem součtem hodnot 2, 4, 6, 8, a 10.

Dim j, celkem

For j = 2 To 10 Step 2

    celkem = celkem + j

Next

MsgBox "Součet je " & celkem


Pro zmenšování řídící proměnné cyklu musíte použít zápornou hodnotu kroku. Také musíte uvést takovou konečnou hodnotu řídící proměnné, která bude menší než počáteční hodnota. V následujícím příkladu je řídící proměnná cyklu mojeCislo zmenšována o hodnotu 2 po každém průchodu cyklem. Když cyklus skončí, hodnota proměnné celkem je rovna součtu hodnot 16, 14, 12, 10, 8, 6, 4 a 2.

Dim mojeCislo, celkem

For mojeCislo = 16 To 2 Step -2

    celkem = celkem + mojeCislo

Next

MsgBox "Součet je " & celkem


Použitím příkazu Exit For můžete předčasně ukončit libovolný cyklus For…Next před tím, než řídící proměnná cyklu dosáhne konečné hodnoty. Protože obvykle chcete cyklus opustit jen v určitých situacích (např. když nastane nějaká chyba), můžete použít příkaz Exit For v podmíněném příkazu If…Then…Else.

Cyklus For Each…Next

Opakuje skupinu příkazů pro kažý prvek ve skupině objektů nebo v poli.

Syntaxe

For Each prvek In skupina

    [příkazy]

[Exit For]

    [příkazy]

Next [prvek]


Syntaxe příkazu For Each…Next má tyto části:


Část Popis
prvek  Proměnná používaná pro opakování napříč prvky skupiny objektů nebo pole. Pro objekty může být prvek jen proměnná typu Variant nebo Object. Pro pole může být prvek jen proměnnou typu Variant.
skupina  Jméno souboru objektů nebo pole.
příkazy  Jeden nebo více příkazů, které jsou vykonány pro každou položku ve skupině.

Příkaz For Each je spuštěn, pokud je ve skupině alespoň jeden prvek. Jakmile je cyklus jednou spuštěn, jsou provedeny všechny příkazy cyklu pro první prvek skupiny. Příkazy jsou pak prováděny pro jednotlivé prvky tak dlouho, dokud jsou ještě ve skupině nějaké prvky. V okamžiku, kdy ve skupině nejsou žádné další prvky, cyklus skončí a běh skriptu pokračuje příkazem následujícím příkaz Next. Pro předčasné ukončení cyklu lze použít příkaz Exit For. Kdekoliv v cyklu může být umístěn libovolný počet příkazů Exit For. Příkaz Exit For je často používán v kombinaci s podmíněným příkazem If…Then. Po použití tohoto příkazu pokračuje skript na příkazem následujícím bezprostředně za příkazem Next. Příkazy cyklu For Each…Next můžete libovolně vnořovat umístěním jednoho cyklu For Each…Next do druhého. Nezapomeňte, že každý prvek cyklu musí být jedinečný. Pokud vynecháte prvek v příkazu Next, vykonávání cyklu pokračuje stejně, jako kdybyste jej napsali.

Použití cyklu For Each…Next

Cyklus For Each…Next je podobný cyklu For…Next. Namísto provádění příkazů s předem daným počtem opakování, opakuje cyklus For Each…Next skupinu příkazů pro každý prvek ve skupině objektů nebo v poli. To může být užitečné, pokud nevíte, kolik prvků ve skupině vlastně máte.

V následujím příkladu je uvedena procedura Window_onload, která se spustí vždy s otevřením stránky. V ní uvedený příkaz For Each…Next zajistí postupné vypsání všech hypertextových odkazů z dané stránky v dialogovém okně (o objektech a událostech v souvislosti s VBScriptem je podrobnější zmínka ve studijním článku Obsluha událostí ve VBScriptu).