Cyklus využijete pro procházení buněk, listů pro opakovaný tisk, doplňování, navyšování, snižování hodnot, ale tím výčet jeho použití rozhodně nekončí.
Cykly v Basicu
Cyklus DO…LOOP můžete rozdělit na čtyři „podcykly“:
- DO WHILE...LOOP
- DO...LOOP WHILE
- DO UNTIL...LOOP
- DO...LOOP UNTIL
Cyklus je odstartován na základě splnění, či nesplnění podmínky. V závislosti na tom, jakým způsobem chcete testovat podmínku, se ve dvou případech cyklus neprovede vůbec, pokud je splněná podmínka, a v ostatních dvou se provede alespoň jednou. Ale popořadě.
TIP: všechny tyto funkce (a mnoho dalších) jsou také popsány v nápovědě OpenOffice.org. Celkově je nápověda na velmi dobré úrovni a byla by škoda ji nevyužívat. Navíc u funkcí Basicu je uveden vždy i krátký příklad použití.
DO WHILE…LOOP
Tímto příkazem provádíte cyklus do té doby, dokud je splněná podmínka. Praktický příklad lépe ukáže, co to znamená.
Do While cislo < 10 cislo = cislo + 1 Loop
Tento cyklus bude provádět nárůst proměnné cislo do té doby, dokud bude tato proměnná menší než 10. V případě, že cislo je větší než 10 již na začátku, neprovede se cyklus vůbec.
Pro test si zkuste následující:
sub test_do_while_loop dim cislo as integer cislo = inputbox ("Vložte číslo", "Test") Do While cislo < 10 cislo = cislo + 1 print cislo Loop print cislo end sub
Otestujte zadání různých hodnot při spouštění makra. Například pokud zadáte 11, výsledkem bude stále 11 – přičtení hodnoty neproběhlo.
DO…LOOP WHILE
Tento cyklus na rozdíl od předchozího testuje podmínku teprve poté, co provedl jeden blok příkazů. Po malé úpravě se opět přičítá 1.
sub test_do_loop_while dim cislo as integer cislo = inputbox ("Vložte číslo", "Test") Do cislo = cislo + 1 print cislo Loop While cislo < 10 print cislo end sub
Otestujte zadání různých hodnot při spouštění makra. V tomto makru se bude jednička přičítat pouze k číslu vyššímu než deset. Například pokud zadáte 11, výsledkem bude 12 – přičtení hodnoty proběhlo. Cyklus proběhl jednou a skončil, protože je splněná podmínka.
Následující dva cykly na to jdou z opačné strany – testují podmínku a provádí cyklus, dokud nebude podmínka splněná. V našem příkladu jste testovali, zda je cislo menší než 10. Nyní budete provádět cykly do té doby, dokud cislo nebude větší než 10.
DO UNTIL…LOOP
Opět náš příklad:
sub test_do_until_loop dim cislo as integer cislo = inputbox ("Vložte číslo", "Test") Do Until cislo > 10 cislo = cislo + 1 print cislo Loop print cislo end sub
Pokud zadáte číslo menší než 10, bude cyklus přičítat do té doby, dokud cislo nebude větší než 10. Výsledkem při zadání čísla většího než 10 je opět pouze zadané číslo.
DO...LOOP UNTIL
sub test_do_loop_until dim cislo as integer cislo = inputbox ("Vložte číslo", "Test") Do cislo = cislo + 1 print cislo Loop Until cislo > 10 print cislo end sub
Pokud zadáte číslo menší než 10, bude cyklus přičítat do té doby, dokud cislo nebude větší než 10. Cyklus se provede alespoň jednou, tzn., že výsledkem při zadané hodnotě větší než 10 bude hodnota zvýšená o 1.
FOR NEXT
Dalším cyklem, který budete používat, je FOR NEXT. Použijete ho tehdy, když dopředu víte, kde má cyklus začít (jakou má podmínka počáteční hodnotu) a kdy skončí. V minulých příkladech jste zadávali proměnnou cislo. FOR NEXT použijete tehdy, kdy cislo nebudete zadávat, protože víte, že to bude vždy 1 (například).
For cislo = 1 to 10 print cislo Next cislo
Cyklus FOR NEXT je zjednodušené DO LOOP právě pro případy, kdy znáte počátek i konec. Zjednodušeně: zápis je cislo = 1 to 10. Tímto jste zadali první hodnotu (nahradili jste inputbox z našich minulých příkladů) a zároveň určili, kdy cyklus skončí. Také v zápisu cyklu chybí cislo = cislo + 1, které navyšovalo proměnnou.
Cyklus FOR NEXT provádí sám navyšování v rozmezí, které mu určíte (zde mezi 1 a 10). Pokud není způsob – krok – navyšování dán, bude se proměnná navyšovat vždy o 1. Krokování provedete takto: For cislo = 1 to 10 step 2. Takto jste navýšili krok a proměnná se navýší o 2 (nahradili jste cislo + 2). Samozřejmě krokovat můžete i pozpátku – step –1.
Upravte si tedy náš sčítací příklad na FOR NEXT, ať vidíte rozdíl.
sub test_do_until_loop dim cislo as integer for cislo = 0 to 10 prubeh = prubeh & cislo +1 & ". Dílčí výsledek cyklu - " & cislo & chr(13) next cislo msgbox prubeh,0,"Průběh výpočtu " print "Výsledek cyklu: " + cislo end sub
Výsledek makra vidíte na obrázcích
Zobrazení všech provedených výpočtů
makra
Ještě je nutné říci, že prvotní a poslední hodnota FOR NEXT nemusí být zadána jako číslo, ale i jako začátek a konec datového pole (array()). Pokud si do makra nadefinujete pole, které obsahuje text – například seznam jmen:
jmena=array("Petr","Honza","Pavel","Mirka","Jana","Kristýna")
V poli máte celkem 6 jmen a FOR NEXT můžete zapsat i takto
For i = lbound(jmena()) to ubound(jmena())
Což znamená for 1 to 6, aniž byste museli pokaždé pole sami přepočítávat. Zkuste to:
sub jmena_test jmena = array("Petr","Honza","Pavel","Mirka","Jana","Kristýna") for i = lbound(jmena()) to ubound(jmena()) print jmena(i) Next i end sub
Shrnutí cyklů
Cykly jsou si velmi podobné a na většinu vašich operací nebudete využívat všechny jejich druhy. V podstatě si je rozdělte na ty, které se při splněné podmínce neprovedou vůbec, a které alespoň jednou. Ostatní je jen na způsobu zadání podmínky.
Nejdůležitější ale je uvědomit si, že se cykly nemusí používat na pouhé sčítání hodnot, ale všude, kde potřebujete opakovat stejné příkazy. Namísto sčítání můžete tisknout, měnit formátování, vyhledávat hodnoty, přeskakovat do buněk, listů… Využití je mnoho a záleží zejména na vás, jak je použijete.