|
Ve spolupráci se SEDUO jsem vytvořil několik videokurzů:
Opakuje příkazy, dokud platí nebo neplatí podmínka.
Doplněno: 2.8.2015
Potřebujeme-li vykonat určitou posloupnost příkazu na základě hodnoty příslušného výrazu. Například hodnota příspěvku dle věku dítěte. Velikost slevy podle hodnoty objednávky.
Konstrukce Do .. Loop opakuje příkazy, dokud je podmínka vyhodnocena jako True, nebo dokud podmínka není True. Funguje ve dvou provedeních:
Cyklus Do - While se provádí, dokud je splněna zadaná podmínka. Viz následující syntaxe.
Cyklus Do - Until se provádí tak dlouho, dokud podmínka není splněna. Viz následující syntaxe.
Do [{While | Until} podmínka]
[příkazy]
[Exit Do]
[příkazy]
Loop
Do
[příkazy]
[Exit Do]
[příkazy]
Loop [{While | Until} podmínka]
Do smyčky Do ... Loop může být umístěn libovolný počet příkazů Exit Do. Tento příkaz umožňuje předčasné ukončení smyčky. Popis funkce Exit do popíšů v jiném článku.
Při použití ve vnořených příkazech Do .. Loop předá příkaz Exit Do řízení do nadřazeného cyklu.
Ukázkové příklady
Pocitadlo = 1
Do While Pocitadlo < 10 ' Vnitřní smyčka.
Cells(Pocitadlo + 4, 2) = Pocitadlo
Pocitadlo = Pocitadlo + 1 ' Zvyš počítadlo.
Loop
Pocitadlo = 1
Do
Cells(Pocitadlo + 4, 3) = Pocitadlo
Pocitadlo = Pocitadlo + 1 ' Zvyš počítadlo.
Loop While Pocitadlo < 10 ' Vnitřní smyčka.
Ukázkové příklady
Pocitadlo = 1
Do Until Pocitadlo > 10 ' Vnitřní smyčka.
Cells(Pocitadlo + 4, 1) = Pocitadlo
Pocitadlo = Pocitadlo + 1 ' Zvyš počítadlo.
Loop
Pocitadlo = 1
Do
Cells(Pocitadlo + 4, 3) = Pocitadlo
Pocitadlo = Pocitadlo + 1 ' Zvyš počítadlo.
Loop Until Pocitadlo > 10 ' Vnitřní smyčka.
Cykly Do - Loop mohou obsahovat příkazy Exit Do. Exit Do ukončí provádění a přejde na příkaz za Loop.
Do While Pocitadlo < 20 ' Vnitřní smyčka.
Pocitadlo = Pocitadlo + 1 ' Zvyš počítadlo.
If Pocitadlo = 10 Then ' Je-li podmínka True.
Test = False ' Nastav hodnotu příznaku na False.
Exit Do ' Opusť vnitřní smyčku.
End If
Loop
Pocitadlo = 1
Do Until Pocitadlo > 10 ' Vnitřní smyčka.
Cells(Pocitadlo + 7, 2) = Pocitadlo
Pocitadlo = Pocitadlo + 1 ' Zvyš počítadlo.
If Pocitadlo = 5 Then ' Je-li podmínka True.
Test = False
Exit Do
End If
Loop
Do cyklů příkazu Do .. Loop je vhodné zabudovat ochranu. Excel pracuje ve dvojkové soustavě a zaokrouhluje s 15-ti místnou přesností. Budeme-li přičítat desetinná čísla může dojít k zacyklení. Například při přičítání čísla 0,00001 (100.000)nedostanete hodnotu 1,0 ale 0,999999999... Kód se neukončí a bude pokračovat dále do nekonečna.
Soubory ke stažení zdarma. Soubory využívají makra:
Tento článek je součástí on-line výukového kurzu VBA MS Excel.
Mate-li zajímavé použití cyklu Do .. Loop můžete jej uvést v komentářích.
Článek byl aktualizován: 02.08.2015 14:28
Ušetřil vám tento web čas, peníze? Pomohl vyřešit problém? Jste ochotni poskytnout symbolickou odměnu na další rozvoj? Vybrte si formu odměny, která vám vyhovuje.
Microsoft Office (Word, Excel, Google tabulky, PowerPoint) se věnuji od roku 2000 (od 2004 na této doméně) - V roce 2017 jsem od Microsoft získal prestižní ocenění MVP (zatím jsem jediný z ČR v kategorií Excel). Své vědomosti a zkušenosti dávám k dispozici i on-line ve videích pro SEDUO. Ve firmách školím a konzultuji, učím na MUNI. Tento web již tvořím přes 15 let. Zdarma je zde přes 1.000 návodu, tipů a triků, včetně přes 250 různých šablon, sešitů.
Přidáno: 29.10.13 15:17
Dobrý den,
převzal jsem nějaké VBA kódy po bývalém kolegovi a snažím se to trochu optimalizovat. Všude je hrozně moc cyklů. Většinu jsem odstranil, ale u jednoho si nevím rady. Byl by nějaký způsob jak zrušit tento loop a provézt příkaz nějakém hromadným přiřazením?
Range("I1").Select
Do
ActiveCell.Offset(1, 0).Select
'82 - CM(VIN je není v reportu z predchozího mesíce
'45 - BB (pocet mesíců zbývajících do konce)
'71 - CB (datum objednání nové vozidlo)
If ActiveCell.Offset(0, 82).Value = 1 And ActiveCell.Offset(0, 45).Value <= 3 And ActiveCell.Offset(0, 71).Value = "" Then Selection.Font.ColorIndex = 9 ' tmave cervena
If ActiveCell.Offset(0, 82).Value = 1 And ActiveCell.Offset(0, 45).Value <= 6 And ActiveCell.Offset(0, 45).Value > 3 And ActiveCell.Offset(0, 71).Value = "" Then Selection.Font.ColorIndex = 46 ' oranzova
Loop While Not IsEmpty(ActiveCell.Offset(1, -8))
Děkuji za pomoc
Přidáno: 25.06.14 13:47
To Petr: malo by to byť výrazne rýchlejšie:
Sub Test()
Dim rw, col
rw = Range("I1").Row ' I1 - StartCell
col = Range("I1").Column
Application.ScreenUpdating = False
Do
rw = rw + 1
With Cells(rw, col)
If .Offset(0, 82).Value = 1 Then '82 - CM(VIN je není v reportu z predchozího mesíce
If .Offset(0, 71).Value = "" Then '71 - CB (datum objednání nové vozidlo)
If .Offset(0, 45).Value <= 3 Then '45 - BB (pocet mesíců zbývajících do konce)
.Font.ColorIndex = 9 ' tmave cervena
ElseIf .Offset(0, 45).Value <= 6 Then '45 - BB (pocet mesíců zbývajících do konce)
.Font.ColorIndex = 46 ' oranzova
End If
End If
End If
End With
Loop Until IsEmpty(Cells(rw, col).Offset(1, -8))
Application.ScreenUpdating = True
End Sub
Přidáno: 27.01.16 14:24
Dobrý den, měl bych dotaz. Jak udělat makro, které mi vyhodnocuje tři podmínky true/false a když všechny podmínky budou false tak ukončí cyklus? mám to takhle, ale cyklus si vesele jede dál i když jsou podmínky pro ukončení cyklu splněny a = 1 b = 1 c = 1 Do Until a And b And c = 0 calculate a = Range("E5").Value b = Range("E6").Value c = Range("E7").Value Loop děkuji za odpověď.
Pomohl Vám návod? Sdílejte na Facebooku, G+ |
||
LinkedIn... |
Stránky o MS Office (Excel) produktu společnosti Microsoft. Neslouží jako technická podpora.
| Email na autora: pavel.lasak@gmail.com | Copyright © : Pavel Lasák 2004 - 2019 |
52415
Tento web zatím neprošel jazykovou korekturou. Beta verze redakčního systému.