Přeskočit navigaci | Přeskočit na novinky
     

Jste zde: Úvodní stránka » excel » vba-teorie-zaklady » do-loop-excel-vba

Do ... Loop (While | Until) - Excel VBA

Videokurzy Excel

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

Úvodem do cyklů Do ... Loop (While | Until)

Microsoft Excel logo

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.


Teorie k Do ... Loop

Konstrukce Do .. Loop opakuje příkazy, dokud je podmínka vyhodnocena jako True, nebo dokud podmínka není True. Funguje ve dvou provedeních:

  • While - dokud je podmínka splněna
  • Until - dokud podmínka není splněna

While

Cyklus Do - While se provádí, dokud je splněna zadaná podmínka. Viz následující syntaxe.

Until

Cyklus Do - Until se provádí tak dlouho, dokud podmínka není splněna. Viz následující syntaxe.

Syntaxe 1

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

Syntaxe 2

Do [příkazy] [Exit Do] [příkazy] Loop [{While | Until} podmínka]
  • 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.

Rozdíl Syntaxe 1 / 2

Ve VBA je možno zapsat podmínku na začátek (syntaxe 1), nebo na konec (syntaxe 2). Rozdíl je v tom, kdy bude podmínka vyhodnocena. V prvním případě se obsah cyklu vůbec nemusí provést. Ve druhém případě se obsah cyklu vždy provede alespoň jednou.

Exit v Do ... Loop

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.

Microsoft Excel VBA - Do .. Loop While

While

Ukázkové příklady

Příklad 1

Pocitadlo = 1 Do While Pocitadlo < 10 ' Vnitřní smyčka. Cells(Pocitadlo + 4, 2) = Pocitadlo Pocitadlo = Pocitadlo + 1 ' Zvyš počítadlo. Loop

Příklad 2

Pocitadlo = 1 Do Cells(Pocitadlo + 4, 3) = Pocitadlo Pocitadlo = Pocitadlo + 1 ' Zvyš počítadlo. Loop While Pocitadlo < 10 ' Vnitřní smyčka.
Microsoft Excel VBA - Do .. Loop  Until

Until

Ukázkové příklady

Příklad 1

Pocitadlo = 1 Do Until Pocitadlo > 10 ' Vnitřní smyčka. Cells(Pocitadlo + 4, 1) = Pocitadlo Pocitadlo = Pocitadlo + 1 ' Zvyš počítadlo. Loop

Příklad 2

Pocitadlo = 1 Do Cells(Pocitadlo + 4, 3) = Pocitadlo Pocitadlo = Pocitadlo + 1 ' Zvyš počítadlo. Loop Until Pocitadlo > 10 ' Vnitřní smyčka.

Exit Do

Cykly Do - Loop mohou obsahovat příkazy Exit Do. Exit Do ukončí provádění a přejde na příkaz za Loop.

Příklad 1: While

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

Příklad 2: Until

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

Možné problémy v Do...Loop - ochrana

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.

Microsoft Excel VBA - stahuj logo

Ke stažení

Soubory ke stažení zdarma. Soubory využívají makra:


Další související články

Závěrem

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

Odměna

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.


Pavel Lasák - autor webu

Pavel Lasák

Microsoft Office (Word, Excel, PowerPoint) se věnuji od roku 2000 (od 2004 ne této doméně) - Roku 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 také na on-line videích pro SEDUO. Školím a konzultuji, učím na MUNI. Hlavně tvořím tento web. Je zde k dispozici přes 1.000 návodu, tipů a triků včetně stovek různých šablon, sešitů.

   Pavel Lasák LinkedIn Profil    Pavel Lasák Google+ Profil    Pavel Lasák facebook Profil    Pavel Lasák twitter Profil


Komentáře


Petr

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

Jojo

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

Honza S.

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ěď.







Sdílejte

Pomohl Vám návod?
Sdílejte na Facebooku, G+
LinkedIn...

Nové články


Newsletter

Přihlaste se odběru novinek a získejte:
Ebook zdarma -
10 kroků ke zvládnutí (Word, Excel, PowerPoint)
Šipka Kniha 3D Více o ebooku ...

TOPlist Licence Creative Commons webarchiv rss XML

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 - 2017 | 34159

Tento web zatím neprošel jazykovou korekturou. Beta verze redakčního systému.