Bucle Excel VBA – pentru fiecare, pentru Următorul, faceți în timp ce, imbricate și mai multe

pentru a funcționa eficient în VBA, trebuie să înțelegeți buclele.

buclele vă permit să repetați un bloc de cod de un anumit număr de ori sau să repetați un bloc de cod pe fiecare obiect dintr-un set de obiecte.

Mai întâi vă vom arăta câteva exemple pentru a vă arăta ce bucle sunt capabile. Apoi vă vom învăța totul despre bucle.

VBA buclă Exemple rapide

pentru fiecare bucle

pentru fiecare buclă buclă prin fiecare obiect dintr-o colecție, cum ar fi fiecare foaie de lucru din registrul de lucru sau fiecare celulă dintr-un interval.

bucla prin toate foile de lucru din registrul de lucru

acest cod va bucla prin toate foile de lucru din registrul de lucru, unhiding fiecare foaie:

1
2
3
4
5
6
7
8

sub loopthroughsheets()
dim ws ca foaie de lucru
pentru fiecare ws din foile de lucru
ws.Vizibil = adevărat
următor
End Sub

buclă prin toate celulele din gama

acest cod se va bucla printr-un interval de celule, testând dacă valoarea celulei este negativă, pozitivă sau zero:

pentru buclele următoare

un alt tip de buclă „pentru” este bucla pentru următoarea. Pentru următoarea buclă vă permite să bucla prin numere întregi.

acest cod va trece prin numere întregi de la 1 la 10, afișând fiecare cu o casetă de mesaj:

1
2
3
4
5
6

sub forloop()
dim i ca întreg
pentru i = 1 la 10
MsgBox i
next i
End Sub

do while loops

do while loops will loop în timp ce condiția este îndeplinită. Acest cod va trece, de asemenea, prin numere întregi de la 1 la 10, afișând fiecare cu o casetă de mesaj.

1
2
3
4
5
6
7
8

sub dowhileloop ()
dim n ca întreg
N = 1
face în timp ce n <11
MsgBox n
N = N + 1
buclă
End Sub

face până bucle

invers, Faceți până când buclele se vor bucla până când este îndeplinită o condiție. Acest cod face același lucru ca și cele două exemple anterioare.

1
2
3
4
5
6
7
8

sub dountilloop ()
dim n ca întreg
N = 1
înapoi până la N >= 10
MsgBox n
N = N + 1
buclă
End Sub

vom discuta acest lucru mai jos, dar tu trebuie să fiți extrem de atenți atunci când creați do While sau do Until loops, astfel încât să nu creați o buclă care nu se termină niciodată.

VBA Loop Builder

aceasta este o captură de ecran a „Loop Builder” din suplimentul nostru Premium VBA: AutoMacro. Loop Builder vă permite să construiți rapid și ușor bucle pentru a trece prin diferite obiecte sau numere. Puteți efectua acțiuni pe fiecare obiect și / sau selectați numai obiecte care îndeplinesc anumite criterii.programul de completare conține, de asemenea, mulți alți constructori de coduri, o bibliotecă extinsă de coduri VBA și un sortiment de instrumente de codificare. Este un must have pentru orice dezvoltator VBA.

acum vom acoperi diferitele tipuri de bucle în profunzime.

VBA pentru bucla următoare

pentru sintaxa buclei

bucla pentru următoarea vă permite să repetați un bloc de cod de un anumit număr de ori. Sintaxa este:

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-o variabilă întreagă utilizată pentru a număra
  • Start – valoarea de pornire (Ex. 1)
  • End-valoarea finală (Ex. 10)
  • – vă permite să numărați fiecare n numere întregi în loc de fiecare 1 număr întreg. De asemenea, puteți merge invers cu o valoare negativă (ex. Pasul -1)
  • – codul care va repeta
  • instrucțiunea Next – Closing la bucla For Next. Puteți include contorul sau nu. Cu toate acestea, recomand cu tărie includerea contorului, deoarece vă face Codul mai ușor de citit.

dacă este confuz, nu vă faceți griji. Vom examina câteva exemple:

numără până la 10

acest cod va număra până la 10 folosind o buclă For-Next:

1
2
3
4
5
6
7
8

sub foreach_countto10 ()
dim n ca întreg
pentru N = 1 la 10
MsgBox n
următor n
End Sub

pentru pasul buclă

numărați până la 10 – numai numere pare

acest codul va conta la 10 doar numărarea numerelor pare:

1
2
3
4
5
6
7
8

sub foreach_countto10_even ()
dim n ca întreg
pentru N = 2 până la 10 Pasul 2
MsgBox n
următor n
end sub

notă am adăugat „pasul 2”. Aceasta spune bucla For să „pășească” prin contor cu 2. Putem folosi, de asemenea, o valoare pas negativ la pas în sens invers:

pentru bucla pas invers

numărătoarea inversă de la 10

acest cod va numărătoarea inversă de la 10:

1
2
3
4
5
6
7
8
9

sub foreach_countdown_invers()
dim n ca întreg
pentru N = 10 la 1 pas -1
MsgBox n
următor n
MsgBox „lift off”
End Sub

șterge Rânduri dacă celula este necompletată

am folosit cel mai frecvent un pas negativ pentru-buclă pentru a trece prin intervale de celule, ștergând rândurile care îndeplinesc anumite criterii. Dacă vă buclați de la rândurile de sus la rândurile de jos, pe măsură ce ștergeți rândurile, vă veți încurca contorul.

acest exemplu va șterge rândurile cu celule goale (începând de la rândul de jos):

imbricate pentru buclă

puteți „cuibări” una pentru buclă în alta pentru buclă. Vom folosi imbricate pentru bucle pentru a crea un tabel de multiplicare:

1
2
3
4
5
6
7
8
9
10
11

sub nested_foreach_multiplicationtable()
dim rând ca întreg, col ca întreg
pentru rând = 1 la 9
pentru Col = 1 la 9
celule(rând + 1, Col + 1).Value = row * col
next col
next row
End Sub

ieșire pentru

instrucțiunea exit for vă permite să ieșiți imediat din bucla for next.

de obicei folosiți Exit For împreună cu o instrucțiune If, ieșind din bucla for Next dacă este îndeplinită o anumită condiție.

de exemplu, puteți utiliza o buclă For pentru a găsi o celulă. Odată ce celula este găsită, puteți ieși din buclă pentru a vă accelera codul.

acest cod va trece prin rândurile de la 1 la 1000, căutând „eroare” în coloana A. Dacă este găsit, codul va selecta celula, vă va alerta la eroarea găsită și va ieși din buclă:

Important: în cazul imbricate pentru bucle, Exit for iese doar din curent pentru buclă, nu toate buclele active.

continuare pentru

VBA nu are comanda „continuare” care se găsește în Visual Basic. În schimb, va trebui să utilizați „ieșire”.

VBA pentru fiecare buclă

VBA pentru fiecare buclă va trece prin toate obiectele dintr-o colecție:

  • toate celulele dintr-un interval
  • toate foile de lucru dintr-un registru de lucru
  • toate formele dintr-o foaie de lucru
  • Toate registrele de lucru deschise

De asemenea, puteți utiliza imbricate pentru fiecare bucle pentru:

  • toate celulele dintr-un interval de pe toate foile de lucru
  • toate li> și așa mai departe…

sintaxa este:

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.Dezinstalați „parola”
următorul ws
End Sub

pentru fiecare registru de lucru Deschis

acest cod va salva și închide toate registrele de lucru deschise:

1
2
3
4
5
6
7
8
9

sub foreachwb_inworkbooks()
dim WB ca registru de lucru
pentru fiecare WB din registrele de lucru
WB.Închide Salvareamodificări:=True
Next wb
End Sub

pentru fiecare formă din foaia de lucru

acest cod va șterge toate formele din foaia activă.

1
2
3
4
5
6
7
8
9

sub foreachshape()
dim SHP ca formă
pentru fiecare SHP din foaia activă.Forme
shp.Delete
next shp
End Sub

pentru fiecare forma în fiecare foaie de lucru în registrul de lucru

puteți, de asemenea, cuib pentru fiecare bucle. Aici vom parcurge toate formele din toate foile de lucru din registrul de lucru activ:

1
2
3
4
5
6
7
8
9
10
11

sub foreachshape_inallworksheets()
dim SHP ca formă, ws ca foaie de lucru
pentru fiecare ws din foile de lucru
pentru fiecare SHP din ws.Forme
shp.Delete
Next shp
Next ws
End Sub

pentru fiecare buclă – IF

după cum am menționat anterior, puteți utiliza o declarație If în o buclă, care efectuează acțiuni numai dacă sunt îndeplinite anumite criterii.

acest cod va ascunde toate rândurile goale într-un interval:

VBA Do While Loop

VBA Do While și Do până când (vezi secțiunea următoare) sunt foarte asemănătoare. Ei vor repeta o buclă în timp ce (sau până când) este îndeplinită o condiție.

bucla do While va repeta o buclă în timp ce o condiție este îndeplinită.

Iată sintaxa do While:

1
2
3

face în timp ce starea

buclă

unde:

  • condiție – condiția pentru a testa
  • – blocul de cod pentru a repeta

de asemenea, puteți configura o buclă do while cu condiția de la sfârșitul buclei:

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 ca întreg
N = 1
face în timp ce n <11
MsgBox n
N = N + 1
buclă
End Sub

buclă în timp ce

acum să rulăm aceeași procedură, cu excepția faptului că vom muta condiția la sfârșitul buclei:

1
2
3
4
5
6
7
8

sub doloopwhile ()
dim n ca întreg
N = 1
înapoi
MsgBox n
N = N + 1
buclă în timp ce n <11
End Sub

vba face până la bucla

înapoi până la Buclele vor repeta o buclă până când este îndeplinită o anumită condiție. Sintaxa este în esență aceeași cu Do While loops:

1
2
3

face până la starea
buclă

și în mod similar condiția poate merge la începutul sau la sfârșitul buclei:

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 ca număr întreg
n = 1
înapoi până la N >10
MsgBox n
n = n + 1
buclă
end sub

buclă până

această buclă până bucla va conta la 10:

1
2
3
4
5
6
7
8

sub doloopuntil ()
dim n ca întreg
N = 1
înapoi
MsgBox n
N = N + 1
buclă până la n >10
End Sub

Exit do Loop

Similar cu utilizarea Exit For Pentru a ieși dintr-o buclă For, utilizați comanda Exit Do pentru a ieși dintr-o buclă do imediat

1
ieșire do

iată un exemplu de ieșire do:

end sau Break loop

după cum am menționat mai sus, puteți utiliza exit for sau exit do pentru a ieși din bucle:

1
Exit For
1
Exit Do

However, these commands must be added to your code before you run bucla ta.

Dacă încercați să „rupeți” o buclă care rulează în prezent, puteți încerca să apăsați ESC sau CTRL + pauză pauză de pe tastatură. Cu toate acestea, este posibil să nu funcționeze. Dacă nu funcționează, va trebui să așteptați ca bucla dvs. să se încheie sau, în cazul unei bucle nesfârșite, utilizați CTRL + ALT + Delete pentru a forța închiderea Excel.

De aceea încerc să evit do loops, este mai ușor să creezi accidental o buclă nesfârșită care te obligă să repornești Excel, pierzându-ți potențial munca.

mai multe exemple de buclă

buclă prin rânduri

aceasta va trece prin toate rândurile dintr-o coloană:

bucla prin coloane

aceasta se va bucla prin toate coloanele dintr-un rând:

bucla prin fișierele dintr-un Folder

acest cod va trece prin toate fișierele dintr-un folder, creând o listă:

bucla prin matrice

acest cod matricea ‘arrlist’:

1
2
3

pentru i = lbound(arrlist) la ubound(arrlist)
MsgBox arrlist(i)
următor i

funcția lbound primește „limita inferioară” a matricei și ubound primește „limita superioară”.

bucle în Access vba

majoritatea exemplelor de mai sus vor funcționa și în Access vba. Cu toate acestea, în Access, vom bucla prin obiectul Recordset, mai degrabă decât obiectul Range.

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

sub loopthroughrecords()
pe eroare relua următorul
dim DBS ca bază de date
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



Lasă un răspuns

Adresa ta de email nu va fi publicată.