Cykly v makrech

programovani.png Cyklus je periodicky se opakující děj, proces nebo jev. Pro programování některých příkazů je cyklus nezbytný pro jejich hladký a rychlý průběh. Cyklus opakuje příkazy do té doby, dokud mu nepřikážete skončit.  

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 Zobrazení všech provedených výpočtů makra

Výsledek cyklu Výsledek cyklu

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.

(Jako ve škole) Průměr: 1,53 | Hodnotilo: 17
 

Komentáře

user avatar Franta
Odpovědět
Cykly v makrech
14. 03. 2015, 18:04:54
Dobrý den
Mám takový problém že příkaz Do until "" ....Loop v libreOffice nefunguje.
Cyklus se má ukončit jakmile skočí na prázdnou buňku ale neukončí cyklus.
Vlastně dojde k zacyklení.
netuším čím to je?

předem děkuji za radu Franta
user avatar j-pastierik
Odpovědět
Cykly v makrech
15. 03. 2015, 19:57:30
Musíte ukázať, ako to máte naprogramované, z krištáľovej gule sa ťažko veští príčina…
user avatar lp.
Odpovědět
Cykly v makrech
15. 03. 2015, 23:53:07
Je to jasné.

Není splněna podmínka ukončení cyklu. Opravte ji a bude to fungovat.
user avatar Franta
Odpovědět
Cykly v makrech
19. 03. 2015, 12:22:48
Dobrý den

tady je ten můj problém.

Do Until Selection = ""
Select Case Selection
End Select
dim args2(1) as new com.sun.star.beans.PropertyValue
args2(0).Name = "By"
args2(0).Value = 1
args2(1).Name = "Sel"
args2(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args2())
Loop

Ve ¨VBA to fungovalo dobře ale v LibreOffice to nefunguje.
Teprve začínam s Libre Office.
Děkuji Franta
user avatar j-pastierik
Odpovědět
Re:Cykly v makrech
24. 03. 2015, 19:13:10
Neaktualizovani ste premennú Selection, zápis nezodpovedá makrám v OpenOffice. Toto funguje:

dim vyber, bunka, document, dispatcher as object
vyber=ThisComponent.getCurrentSelection()
bunka=vyber.getCellByPosition(0,0)
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "By"
args1(0).Value = 1
args1(1).Name = "Sel"
args1(1).Value = false
Do Until bunka.getstring()=""
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args1())
vyber=ThisComponent.getCurrentSelection()
bunka=vyber.getCellByPosition(0,0)
Loop

Přidat názor

 

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích najdete v nápovědě. Diskuzi můžete sledovat pomocí RSS kanálu.

 
Daniel Sedláček

Daniel Sedláček

Amatérsky se věnuji programování maker od podzimu 2010.
Aktivní jsem na fóru od ledna 2011.
Od července 2011 spolupracuji i jako moderátor fóra.

Využívám pouze OpenOffice.org (LibreOffice nemám nainstalován).

 
 
 
woo jaw demo hz