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
|