Excel VBA hurkok-minden, a következő, Do While, beágyazott & More
ahhoz, hogy hatékonyan működjön a VBA-ban, meg kell értenie a hurkokat.a
hurkok lehetővé teszik egy kódblokk meghatározott számú ismétlését, vagy egy kódblokk megismétlését minden objektumon egy objektumkészletben.
először néhány példát mutatunk be, hogy megmutassuk, milyen hurkok képesek. Akkor mindent megtanítunk a hurkokról.
VBA hurok gyors példák
minden hurokhoz
minden hurokhoz hurok a gyűjtemény minden objektumán, például a munkafüzet minden munkalapján vagy egy tartomány minden celláján.
hurok a munkafüzet összes munkalapján
Ez a kód végighalad a munkafüzet összes munkalapján, minden lap elrejtésével:
1
2
3
4
5
6
7
8
|
sub loopthroughsheets ()
Dim ws mint munkalap
minden egyes ws munkalapon
ws.Visible = True
következő
End Sub
|
hurok az összes cellán belül
Ez a kód végighalad egy cellatartományon, tesztelve, hogy a cellaérték negatív, pozitív vagy nulla:
a következő hurkokhoz
a “For” hurok másik típusa a következő hurok. A következő hurok lehetővé teszi az egész számok hurkolását.
Ez a kód az 1-től 10-ig terjedő egész számokon megy keresztül, mindegyik üzenetmezővel jelenik meg:
1
2
3
4
5
6
|
sub forloop()
Dim I egész számként
i = 1-től 10-ig
MsgBox I
következő i
end sub
|
do while loops
do while loops will loops while a feltétel teljesülése esetén. Ez a kód az 1-től 10-ig terjedő egész számokon is végighalad, mindegyik üzenetmezővel jelenik meg.
1
2
3
4
5
6
7
8
|
sub dowhileloop()
dim n egész számként
N = 1
do while n < 11
MsgBox n
N = N + 1
loop
End Sub
|
do amíg hurkok
fordítva, Addig tegye, amíg a hurkok hurkolnak, amíg egy feltétel teljesül. Ez a kód ugyanazt teszi, mint az előző két példa.
1
2
3
4
5
6
7
8
|
sub dountilloop()
dim n egész számként
N = 1
vissza, amíg n >= 10
MsgBox n
N = N + 1
hurok
vége sub
|
ezt az alábbiakban tárgyaljuk, de te rendkívül óvatosnak kell lennie a Do While vagy Do amíg hurkok létrehozásakor, hogy ne hozzon létre soha véget nem érő hurkot.
VBA Loop Builder
Ez egy screenshot a “Loop Builder” a mi prémium VBA Add-in: AutoMacro. A Loop Builder lehetővé teszi, hogy gyorsan és egyszerűen hozzon létre hurkokat a különböző objektumokon vagy számokon keresztül. Minden objektumon végrehajthat műveleteket, és/vagy csak bizonyos feltételeknek megfelelő objektumokat jelölhet ki.
A bővítmény számos más kódépítőt is tartalmaz, egy kiterjedt VBA kódkönyvtárat és egy sor kódolási eszközt. Ez egy kell minden VBA Fejlesztő.
most részletesen lefedjük a különböző típusú hurkokat.
VBA a következő ciklushoz
A hurok Szintaxisához
a következő ciklus lehetővé teszi egy kódblokk meghatározott számú ismétlését. A szintaxis:
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.
- számláló-egy egész változó, amelyet a
- Start számlálására használnak-a kezdő érték(pl. 1)
- vége-a végérték (pl. 10)
- – lehetővé teszi, hogy minden n egész számot számoljon minden 1 egész szám helyett. Azt is megy fordított negatív értéket (pl. Lépés -1)
- – a kód, amely megismétli a
- következő záró utasítást a következő hurokhoz. Felveheti a számlálót, vagy sem. Erősen ajánlom azonban a számláló felvételét, mivel ez megkönnyíti a kód olvasását.
Ha ez zavaró, ne aggódj. Néhány példát fogunk áttekinteni:
számolás 10-ig
Ez a kód 10-ig fog számolni egy For-Next hurok használatával:
1
2
3
4
5
6
7
8
|
sub foreach_countto10()
Dim n egész számként
n = 1 – től 10-ig
MsgBox n
következő N
vége
|
a huroklépéshez
számoljon 10-ig-csak páros számok
Ez a kód 10-ig számít, csak páros számokat számolva:
1
2
3
4
5
6
7
8
|
sub foreach_countto10_even()
dim n egész számként
n = 2-10 2.lépés
MsgBox n
következő n
vége sub
|
megjegyzés hozzáadtuk a “2. lépést”. Ez azt mondja a For huroknak, hogy 2-vel” lépjen ” át a számlálón. Negatív lépésértéket is használhatunk a fordított lépéshez:
hurok lépés-inverz
visszaszámlálás 10-től
Ez a kód visszaszámlál 10-től:
1
2
3
4
5
6
7
8
9
|
sub foreach_countdown_inverse()
dim n egész számként
n = 10-1 lépés -1
MsgBox n
következő N
MsgBox “lift off”
vége sub
|
törlés Sorok, ha a cella üres
leggyakrabban negatív lépést használtam a-Loop számára a cellatartományok közötti hurkoláshoz, bizonyos kritériumoknak megfelelő sorok törlésével. Ha hurok a felső sorok az alsó sorok, ahogy törli sorok akkor rendetlenség fel a számláló.
Ez a példa törli az üres cellákkal rendelkező sorokat (az alsó sorból kiindulva):
beágyazott hurokhoz
az egyik hurokhoz “fészkelhet” egy másik hurokhoz. Fogjuk használni beágyazott hurkok, hogy hozzon létre egy szorzótábla:
1
2
3
4
5
6
7
8
9
10
11
|
sub nested_foreach_multiplicationtable()
Dim sor egész számként, col egész számként
sor = 1-9
col = 1-9
cellák esetén(sor + 1, Col + 1).Value = row * col
következő col
következő sor
End Sub
|
kilépés
az exit for utasítás lehetővé teszi, hogy azonnal kilépjen a következő hurokból.
általában az Exit For-t használnád egy IF utasítás mellett, kilépve a For Next ciklusból, ha egy bizonyos feltétel teljesül.
például használhat egy For hurkot egy cella kereséséhez. Miután megtalálta a cellát, kiléphet a hurokból, hogy felgyorsítsa a kódot.
Ez a kód az 1-től 1000-ig terjedő sorokon keresztül hurkol, az A oszlopban a “hiba” kifejezést keresi.Ha megtalálta, a kód kiválasztja a cellát, figyelmezteti Önt a talált hibára, és kilép a hurokból:
fontos: beágyazott hurkok esetén az Exit For csak kilép az aktuális hurokból, nem minden aktív hurokból.
Folytatás
a VBA nem rendelkezik a Visual Basicben található” Folytatás ” paranccsal. Ehelyett az “Exit” – et kell használnia.
VBA minden hurokhoz
Az egyes hurkokhoz tartozó VBA a gyűjtemény összes objektumán keresztül fog hurkolni:
- a tartomány összes cellája
- a munkafüzet összes munkalapja
- a munkalap összes alakja
- az összes nyitott munkafüzet
Az egyes hurkokhoz beágyazott elemeket is használhat:
- az összes munkalapon lévő összes cella
- az összes munkalapon lévő összes alakzat
- az összes nyitott munkafüzetben lévő összes lap
a szintaxis:
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.”Jelszó”
következő ws
End Sub
|
minden megnyitott munkafüzethez
Ez a kód elmenti és bezárja az összes megnyitott munkafüzetet:
1
2
3
4
5
6
7
8
9
|
sub foreachwb_inworkbooks()
Dim WB munkafüzetként
minden munkafüzethez
WB.Bezárás SaveChanges:= True
következő wb
vége Sub
|
a munkalap minden egyes alakjához
Ez a kód törli az összes alakzatot az aktív lapon.
1
2
3
4
5
6
7
8
9
|
sub foreachshape()
Dim SHP alakként
minden SHP-re az activesheet-ben.Alakzatok
shp.Delete
következő shp
vége
|
minden alakzat a munkafüzet minden munkalapján
az egyes hurkokhoz is fészkelhet. Itt végigjárjuk az összes alakzatot az aktív munkafüzet összes munkalapján:
1
2
3
4
5
6
7
8
9
10
11
|
sub foreachshape_inallworksheets()
Dim SHP mint alakzat, ws mint munkalap
minden ws munkalapon
minden egyes SHP ws-ben.Alakzatok
shp.Delete
következő shp
következő ws
vége Sub
|
minden – if hurokhoz
mint már említettük, használhatunk egy If utasítást a egy hurok, amely csak bizonyos kritériumok teljesülése esetén hajt végre műveleteket.
Ez a kód elrejti a tartomány összes üres sorát:
VBA Do While Loop
a VBA Do While and Do Until (lásd a következő részt) nagyon hasonlóak. Meg fognak ismételni egy hurkot, amíg (vagy amíg) egy feltétel teljesül.
A do While hurok megismétli a hurkot, amíg egy feltétel teljesül.
itt van a Do While szintaxis:
2
3
|
do while condition
loop
|
ahol:
- feltétel – a tesztelési feltétel
- – a kódblokk ismétlése
beállíthat egy do while hurkot is a hurok végén lévő feltétellel:
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 egész számként
N = 1
do while n < 11
MsgBox n
N = N + 1
loop
End Sub
|
hurok míg
most futtassuk ugyanazt az eljárást, kivéve, hogy a feltételt a hurok végére mozgatjuk:
1
2
3
4
5
6
7
8
|
sub doloopwhile()
dim n egész számként
N = 1
vissza
MsgBox n
N = N + 1
hurok, míg n < 11
vége sub
|
VBA csinálni, amíg hurok
vissza, amíg A hurkok addig ismételnek egy hurkot, amíg egy bizonyos feltétel teljesül. A szintaxis lényegében ugyanaz, mint a Do While hurkok:
1
2
3
|
do amíg feltétel
hurok
|
és hasonlóan a feltétel mehet a ciklus elején vagy végén:
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 egész számként
n = 1
vissza, amíg n > 10
MsgBox n
n = n + 1
hurok
end sub
|
hurok, amíg
Ez a hurok, amíg a hurok 10-ig számít:
1
2
3
4
5
6
7
8
|
sub doloopuntil()
Dim n egész számként
N = 1
vissza
MsgBox n
N = N + 1
hurok amíg n > 10
vége sub
|
Kilépés a Do hurokból
az Exit For használatához hasonlóan az Exit Do paranccsal azonnal kiléphet a Do hurokból
1
|
kilépés do
|
itt van egy példa az Exit do-ra:
vége vagy törése hurok
mint már említettük, a kilépéshez vagy a kilépéshez használhatja a kilépést:
1
|
Exit For
|
1
|
Exit Do
|
However, these commands must be added to your code before you run a hurok.
Ha egy jelenleg futó hurkot próbál “megtörni”, megpróbálhatja megnyomni az ESC vagy a CTRL + Pause Break billentyűzetet. Ez azonban nem biztos, hogy működik. Ha nem működik, meg kell várnia, amíg a hurok véget ér, vagy végtelen hurok esetén használja CTRL + ALT + Delete kényszeríteni az Excel bezárását.
ezért próbálom elkerülni a do hurkokat, könnyebb véletlenül létrehozni egy végtelen hurkot, amely arra kényszeríti, hogy újraindítsa az Excel-t, potenciálisan elveszítve a munkáját.
további Hurokpéldák
sorokon Áthurok
Ez egy oszlop összes során áthurokol:
hurok át az oszlopokon
Ez egy sor Összes oszlopán keresztül fog hurkolni:
hurok át a mappában lévő fájlokon
Ez a kód végighalad a mappában lévő összes fájlon, létrehozva egy listát:
hurok át a tömbön
Ez a kód végighalad a az array ‘arrlist’:
1
2
3
|
mert i = lbound(arrlist) to ubound(arrlist)
MsgBox arrlist(i)
következő i
|
az lbound függvény megkapja a tömb “alsó határát”, az ubound pedig a “felső határt”.
hurkok az Access VBA-ban
a fenti példák többsége az Access VBA-ban is működik. Az Access alkalmazásban azonban a Recordset objektumot hurkoljuk át, nem pedig a Range objektumot.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
sub loopthroughrecords()
on hiba folytatás következő
dim DBS mint adatbázis
Dim RST mint 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
|