Excel VBA Loops-pro každý, pro další, Do While, vnořené & více

Chcete-li efektivně pracovat ve VBA, musíte pochopit smyčky.

smyčky umožňují opakovat blok kódu nastavený počet opakování nebo opakovat blok kódu na každém objektu v sadě objektů.

nejprve vám ukážeme několik příkladů, které vám ukážou, jaké smyčky jsou schopny. Pak vás naučíme vše o smyčkách.

VBA smyčka rychlé příklady

pro každou smyčku

pro každou smyčku smyčky přes každý objekt v kolekci, například každý list v sešitu nebo každá buňka v rozsahu.

Smyčka Přes všechny Listy v Sešitu

Tento kód bude procházet všechny listy v sešitu, odkrytí každého listu:

1
2
3
4
5
6
7
8

Sub LoopThroughSheets()
Dim ws As Worksheet
Pro Každou ws V Listech
ws.Visible = True
End Sub

procházet Všechny Buňky v Rozsahu

Tento kód se smyčka přes oblast buněk, testování, pokud hodnota buňky je negativní, pozitivní, nebo nula.

Pro Další Smyčky

Další typ Smyčky „Pro“ je Pro Další Smyčka. Smyčka pro další umožňuje smyčku přes celá čísla.

Tento kód bude procházet celá čísla 1 až 10, zobrazování každý se zprávou:

1
2
3
4
5
6

Sub ForLoop()
Dim i As Integer
Pro i = 1 Až 10
MsgBox jsem
End Sub

Dělat, Zatímco Smyčky

Dělat, Zatímco Smyčky, smyčky a zároveň je splněna podmínka. Tento kód bude také smyčka přes celá čísla 1 až 10, zobrazující každý s pole zprávy.

1
2
3
4
5
6
7
8

Sub DoWhileLoop()
Dim n As Integer
, n = 1
Při n < 11
MsgBox n
n = n + 1
Opakování
End Sub

until

Naopak, Proveďte, dokud smyčky nebudou smyčky, dokud nebude splněna podmínka. Tento kód dělá totéž jako předchozí dva příklady.

1
2
3
4
5
6
7
8

Sub DoUntilLoop()
Dim n As Integer
, n = 1
Zpět, Dokud n >= 10
MsgBox n
n = n + 1
Opakování
End Sub

Budeme diskutovat o tom níže, ale při vytváření Do While nebo Do do smyček musíte být velmi opatrní, abyste nevytvořili nikdy nekončící smyčku.

VBA Loop Builder

Toto je snímek obrazovky „Loop Builder“z našeho prémiového doplňku VBA: AutoMacro. Loop Builder umožňuje rychle a snadno vytvářet smyčky pro smyčku přes různé objekty nebo čísla. Můžete provádět akce na každém objektu a / nebo vybrat pouze objekty, které splňují určitá kritéria.

doplněk obsahuje také mnoho dalších programátorů kódu, rozsáhlou knihovnu kódů VBA a sortiment kódovacích nástrojů. Je to nutné pro každého vývojáře VBA.

nyní pokryjeme různé typy smyček do hloubky.

VBA Pro Další Smyčky

cyklus For Syntaxe

Pro Další Smyčka umožňuje opakování bloku kódu zadaný počet krát. Syntaxe je:

1
2
3
4
5

For Counter = Start to End
Next

Where the items in brackets are optional.

  • – Declares the counter variable. Required if Option Explicit is declared at the top of your module.
  • Counter-celočíselná proměnná použitá k počítání
  • Start-počáteční hodnota (např. 1)
  • End-koncová hodnota (např. 10)
  • – umožňuje počítat každé n celé číslo namísto každého 1 Celé číslo. Můžete také jít obráceně se zápornou hodnotou (např. Krok -1)
  • – kód, který bude opakovat
  • další-závěrečné prohlášení pro další smyčku. Počítadlo můžete zahrnout nebo ne. Důrazně však doporučuji zahrnout počítadlo, protože usnadňuje čtení vašeho kódu.

Pokud je to matoucí, nebojte se. Přezkoumáme některé příklady:

počítat do 10

Tento kód bude počítat do 10 pomocí smyčky pro-Next:

1
2
3
4
5
6
7
8

Sub ForEach_CountTo10()
Dim n As Integer
Pro n = 1 Až 10
MsgBox n
n
End Sub

Krok Smyčky

Počítat do 10 – Pouze sudá Čísla

kód bude počítat do 10 pouze počítání sudých čísel:

1
2
3
4
5
6
7
8

Sub ForEach_CountTo10_Even()
Dim n As Integer
Pro n = 2 Až 10 Krok 2
MsgBox n
n
End Sub

Všimněte si, že jsme přidali „Krok 2“. To říká smyčce For, aby „prošla“ počítadlem o 2. Můžeme také použít zápornou hodnotu kroku ke kroku obráceně:

pro krok smyčky inverzní

odpočítávání od 10

Tento kód bude odpočítávat od 10:

1
2
3
4
5
6
7
8
9

Sub ForEach_Countdown_Inverse()
Dim n As Integer
Pro n = 10: 1 Step -1
MsgBox n
n
MsgBox „Lift Off“
End Sub

Odstranit Řádky pokud je buňka prázdná

nejčastěji jsem použil záporný krok Pro-Loop pro smyčku přes rozsahy buněk, mazání řádků, které splňují určitá kritéria. Pokud smyčku z horních řádků do dolních řádků, jak budete mazat řádky budete zkazit čítač.

Tento příklad bude odstranit řádky s prázdné buňky (počínaje spodní řádek):

Vnořené For Smyčky

můžete „hnízdo“ jeden Pro Smyčky do druhé Smyčky For. Pro vytvoření násobící tabulky použijeme vnořené smyčky:

1
2
3
4
5
6
7
8
9
10
11

Sub Nested_ForEach_MultiplicationTable()
Dim řádku Jako celé Číslo, kol Jako celé Číslo
Pro řádek = 1 Do 9
Pro col = 1 Do 9
Buňky(řádek + 1, col + 1).Hodnota = řádek * sloupec
Druhý sloupec
Další řádek
End Sub

Konec

Výstup Pro prohlášení umožňuje opustit a Pro Další smyčku ihned.

Obvykle byste použili Exit For spolu s příkazem If a ukončili smyčku For Next, pokud je splněna určitá podmínka.

můžete například použít smyčku For k nalezení buňky. Jakmile je tato buňka nalezena, můžete ukončit smyčku, abyste urychlili kód.

Tento kód bude procházet řádky 1 do 1000, hledal „chyba“ ve sloupci a. Pokud je nalezen, bude kód vyberte buňku, vás upozorní na nalezené chyby, a výstupní smyčky:

Důležité: V případě Vnořených Smyček, Výstup Pro pouze ukončí aktuální cyklus For, ne všechny aktivní Smyčky.

Pokračovat pro

VBA nemá příkaz „pokračovat“, který se nachází ve Visual Basic. Místo toho budete muset použít „Exit“.

VBA pro každou smyčku

VBA pro každou smyčku bude procházet všemi objekty v kolekci:

  • Všechny buňky v rozsahu
  • Všechny listy v sešitu
  • Všechny tvary v listu
  • Všechny otevřené sešity

můžete také použít Vnořené Pro Každé Smyčky:

  • Všechny buňky v řadě na všechny listy
  • Všechny tvary na všechny listy
  • Všech listů ve všech otevřených sešitech
  • a tak dále…

syntaxe je:

1
2
3

For Each Object in Collection
Next

Where:

For Each Cell in Range

This code will loop through each cell in a range:

For Each Worksheet in Workbook

This code will loop through all worksheets in a workbook, unprotecting each sheet:

1
2
3
4
5
6
7
8
9

Sub ForEachSheet_inWorkbook()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Odemknout „heslo“
Další ws
End Sub

Pro Každý Otevřený Sešit

Tento kód uložte a zavřete všechny otevřené sešity:

1
2
3
4
5
6
7
8
9

Sub ForEachWB_inWorkbooks()
Dim wb As Workbook
Pro Každou wb V Sešitech
wb.Zavřít SaveChanges:=True
Další wb
End Sub

Pro Každý Tvar v Listu

Tento kód bude odstranit všechny tvary v aktivní list.

1
2
3
4
5
6
7
8
9

Sub ForEachShape()
Dim shp Jako je Tvar
Pro Každý shp V ActiveSheet.Tvary
shp.Odstranit
Další shp
End Sub

Pro Každý Tvar v Každém Listu v Sešitu

můžete také hnízdo Pro Každé Smyčky. Zde budeme procházet všemi tvary ve všech pracovních listech v aktivním sešitu:

1
2
3
4
5
6
7
8
9
10
11

Sub ForEachShape_inAllWorksheets()
Dim shp, Jako je Tvar, ws As Worksheet
Pro Každou ws V Listech
Pro Každý shp V ws.Tvary
shp.Odstranit
Další shp
Další ws
End Sub

Pro Každého – je-LI Smyčka

Jak jsme se již zmínil dříve, můžete použít příkaz if uvnitř smyčky, provádění akcí pouze tehdy, pokud určitá kritéria splněna.

tento kód skryje všechny prázdné řádky v rozsahu:

VBA Do While Loop

VBA Do While and Do Until (viz další část) jsou velmi podobné. Budou opakovat smyčku, zatímco (nebo dokud) je splněna podmínka.

smyčka Do While opakuje smyčku, zatímco je splněna podmínka.

Tady je to Dělat, Zatímco Syntaxi:

1
2
3

, Zatímco Stav
Opakování

Kde:

  • Stav – stav k testování
  • – kód bloku opakovat

můžete také nastavit Dělat, Zatímco smyčka s Podmínkou na konci cyklu:

1
2
3

Do
Loop While Condition

We will demo each one and show how they differ:

Do While

Here is the Do While loop example we demonstrated previously:

1
2
3
4
5
6
7
8

Sub DoWhileLoop()
Dim n As Integer
, n = 1
Při n < 11
MsgBox n
n = n + 1
Opakování
End Sub

smyčka zatímco

nyní spustíme stejný postup, kromě toho, že podmínku přesuneme na konec smyčky:

1
2
3
4
5
6
7
8

Sub DoLoopWhile()
Dim n As Integer
, n = 1
MsgBox n
n = n + 1
Loop While n < 11
End Sub

VBA Udělat, Dokud Smyčky

Zpět, Dokud Smyčky budou opakovat smyčku, dokud nebude splněna určitá podmínka. Syntaxe je v podstatě stejné jako Dělat, Zatímco smyčky:

1
2
3

Do Stavu
Opakování

a podobně stav může jít na začátku nebo na konci smyčky:

1
2
3

Do
Loop Until Condition

Do Until

This do Until loop will count to 10, like our previous examples

1
2
3
4
5
6
7
8

Sub DoUntilLoop()
Dim n As Integer
, n = 1
Zpět, Dokud n > 10
MsgBox n
n = n + 1
Opakování
End Sub

Smyčka, Dokud

Tato Smyčka Do smyčky bude počítat do 10:

1
2
3
4
5
6
7
8

Sub DoLoopUntil()
Dim n As Integer
, n = 1
MsgBox n
n = n + 1
Smyčka, Dokud n > 10
End Sub

Exit Dělat Smyčky

Podobně pomocí Exit Pro ukončení Smyčky For, můžete použít Exit Udělat příkaz exit do Loop okamžitě

1
Konec

Zde je příklad Výstupu:

Ukončit nebo přerušit Smyčku

Jak jsme se zmínili výše, můžete použít Exit nebo Exit Udělat pro ukončení smyčky:

1
Exit For
1
Exit Do

However, these commands must be added to your code before you run tvoje smyčka.

Pokud se pokoušíte „přerušit“ smyčku, která je právě spuštěna, můžete zkusit stisknout klávesu ESC nebo CTRL + Pause Break na klávesnici. To však nemusí fungovat. Pokud to nefunguje, budete muset počkat na ukončení smyčky nebo v případě nekonečné smyčky pomocí kláves CTRL + ALT + Delete vynutit uzavření aplikace Excel.

to je důvod, proč se snažím vyhnout dělat smyčky, je snazší náhodně vytvořit nekonečnou smyčku, která vás nutí restartovat Excel a potenciálně ztratit práci.

další příklady smyček

smyčka přes řádky

tím se projdou všechny řádky ve sloupci:

Smyčka Přes Sloupce

Tento bude smyčka přes všechny sloupce v řádku:

procházet Soubory ve Složce

Tento kód bude procházet všechny soubory ve složce, vytvářet seznam:

Smyčku Přes Pole

Tento kód bude smyčku přes pole ‚arrList‘:

1
2
3

Pro i = LBound(arrList) UBound(arrList)
MsgBox arrList(i)

funkce LBound dostane „dolní mez“ pole a UBound dostane „horní mez“.

smyčky v Access VBA

většina výše uvedených příkladů bude fungovat také v Access VBA. V aplikaci Access však procházíme spíše objektem sady záznamů než objektem rozsahu.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Sub LoopThroughRecords()
On Error Resume Next
Dim dbs As Database
Dim rst As Recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset(„tblClients“, dbOpenDynaset)
With rst
.MoveLast
.MoveFirst
Do Until .EOF = True
MsgBox (rst.Fields(„ClientName“))
.MoveNext
Loop
End With
rst.Close
Set rst = Nothing
Set dbs = Nothing
End Sub



Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.