For hver, for næste, gør mens, indlejret & mere

for at arbejde effektivt i VBA, skal du forstå sløjfer.

sløjfer giver dig mulighed for at gentage en kodeblok et bestemt antal gange eller gentage en kodeblok på et hvert objekt i et sæt objekter.

først vil vi vise dig et par eksempler for at vise dig, hvilke sløjfer der er i stand til. Så lærer vi dig alt om sløjfer.

VBA Loop hurtige eksempler

for hver Loops

for hver Loops loop gennem hvert objekt i en samling, såsom hvert regneark i projektmappe eller hver celle i et område.

Loop gennem alle regneark i projektmappe

denne kode løber gennem alle regneark i projektmappen og fjerner hvert ark:

1
2
3
4
5
7
8

sub loopthroughsheets ()
dim vs som regneark
for hver VS i regneark
vs.
næste
End Sub

Loop gennem alle celler i området

denne kode vil løbe gennem en række celler, teste om celleværdien er negativ, positiv eller nul:

for næste sløjfer

en anden type “For” Loop er for næste loop. For næste Loop giver dig mulighed for at løbe gennem heltal.

denne kode løber gennem heltal 1 til 10 og viser hver med en meddelelsesboks:

1
2
3
4
5
6

sub forloop()
Dim i som heltal
for i = 1 til 10
msgboks i
næste i
End Sub

gør mens sløjfer

gør mens sløjfer løber, mens betingelsen er opfyldt. Denne kode løber også gennem heltal 1 til 10 og viser hver med en meddelelsesboks.

1
2
3
4
5
6
8
sub diveloop ()
dim n som heltal
n = 1
gør mens n <11
n = n + 1
loop
end sub

gør indtil sløjfer

omvendt, Gør indtil sløjfer løber, indtil en betingelse er opfyldt. Denne kode gør det samme som de to foregående eksempler.

1
2
3
4
5
6
8
sub dountilloop ()
dim n som heltal
n = 1
tilbage indtil n >= 10
n = n + 1
loop
End Sub

vi vil diskutere dette nedenfor, men du skal være yderst forsigtig, når du opretter gør mens eller gør indtil sløjfer, så du ikke opretter en uendelig løkke.

VBA Loop Builder

Dette er et skærmbillede af “Loop Builder” fra vores Premium VBA-tilføjelse: AutoMacro. Loop Builder giver dig mulighed for hurtigt og nemt at bygge sløjfer til at løbe gennem forskellige objekter eller tal. Du kan udføre handlinger på hvert objekt og / eller kun vælge objekter, der opfylder bestemte kriterier.tilføjelsesprogrammet indeholder også mange andre kodebyggere, et omfattende VBA-kodebibliotek og et udvalg af kodningsværktøjer. Det er et must have for enhver VBA Udvikler.

nu dækker vi de forskellige typer løkker i dybden.

VBA til næste Loop

til Loop syntaks

For næste Loop giver dig mulighed for at gentage en blok kode et bestemt antal gange. Syntaksen er:

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.
  • tæller-en heltalsvariabel, der bruges til at tælle
  • Start – startværdien (f.eks. 1)
  • End – slutværdien (eks. 10)
  • – giver dig mulighed for at tælle hver n heltal i stedet for hver 1 heltal. Du kan også gå omvendt med en negativ værdi (f.eks. Trin -1)
  • – koden, der gentager
  • næste afsluttende sætning til For næste sløjfe. Du kan medtage tælleren eller ej. Jeg anbefaler dog stærkt at inkludere tælleren, da det gør din kode lettere at læse.

Hvis det er forvirrende, skal du ikke bekymre dig. Vi vil gennemgå nogle eksempler:

Tæl til 10

denne kode tæller til 10 ved hjælp af en for-næste sløjfe:

1
2
3
4
5
6
8
sub foreach_countto10 ()
dim n som heltal
for n = 1 til 10
næste n

End Sub

for loop step

tæl til 10 – kun lige tal

dette kode vil tælle til 10 kun tælle lige tal:

1
2
3
4
5
6
8
sub foreach_countto10_even ()
dim n som heltal
for n = 2 til 10 trin 2
næste n

end sub

Bemærk vi tilføjede “trin 2″. Dette fortæller For Loop at” træde ” gennem tælleren med 2. Vi kan også bruge en negativ trinværdi til at træde i omvendt:

For Loop Step – invers

nedtælling fra 10

denne kode nedtælles fra 10:

1
2
3
4
5
6
8
sub foreach_count_inverse ()
dim n som heltal
for N = 10 til 1 trin -1
næste n
msgboks “lift off”
End Sub

slet Rækker, hvis cellen er tom

Jeg har oftest brugt et negativt trin for-Loop til at løbe gennem celleområder og slette rækker, der opfylder visse kriterier. Hvis du løber fra de øverste rækker til de nederste rækker, når du sletter rækker, vil du ødelægge din tæller.

dette eksempel sletter rækker med tomme celler (startende fra den nederste række):

indlejret til Loop

Du kan “rede” en til Loop inde i en anden til Loop. Vi bruger indlejret til sløjfer til at oprette en multiplikationstabel:

1
2
3
4
5
6
8
9
10
sub nested_foreach_multiplicationtable ()
dim række som heltal, Col som heltal
for række = 1 til 9
celler(række + 1, Col + 1).Værdi = række * col
næste col
næste række

End Sub

Afslut for

udgangen til sætning giver dig mulighed for at afslutte en til næste sløjfe med det samme.

Du vil normalt bruge Afslut til sammen med en if-sætning, forlader For næste Loop, hvis en bestemt betingelse er opfyldt.

Du kan f.eks. bruge en for-sløjfe til at finde en celle. Når cellen er fundet, kan du afslutte sløjfen for at fremskynde din kode.

denne kode løber gennem rækker 1 til 1000 og leder efter “fejl” i kolonne A. Hvis den findes, vælger koden cellen, advarer dig om den fundne fejl og afslutter sløjfen:

vigtigt: i tilfælde af indlejret for sløjfer, Afslut for kun afslutter strømmen for Loop, ikke alle aktive sløjfer.

Fortsæt for

VBA har ikke kommandoen “Fortsæt”, der findes i Visual Basic. I stedet skal du bruge “Afslut”.

VBA for hver sløjfe

VBA for hver sløjfe løber gennem alle objekter i en samling:

  • alle celler i et område
  • alle regneark i en projektmappe
  • Alle figurer i et regneark
  • alle åbne projektmapper

Du kan også bruge indlejrede for hver sløjfer til:

  • alle celler i et område på alle regneark
  • Alle figurer på alle regneark
  • Alle ark i alle åbne projektmapper
  • og så videre…

syntaksen er:

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.Fjern ” adgangskode “
næste vs
End Sub

for hver åben projektmappe

denne kode gemmer og lukker alle åbne projektmapper:

1
2
3
4
5
6
8
9
subforeachb_inarbejdsbøger ()
dim som projektmappe
for hvert arbejdsprogram i projektmapper
vb.Luk SaveChanges:=True
End Sub

for hver figur i regneark

denne kode sletter alle figurer i det aktive ark.

1
2
3
4
5
6
8
sub foreachshape ()
dim SHP som form
for hver SHP i ActiveSheet.Former
shp.Slet
næste shp

For hver figur i hvert regneark i projektmappen

Du kan også rede for hver løkke. Her løber vi gennem alle figurer i alle regneark i den aktive projektmappe:

1
2
3
4
5
6
8
9
10
sub foreachshape_inallarbejdsark ()
dim SHP som form, vs som regneark
for hver vs i regneark
for hver vs.Former
shp.Slet
næste shp
næste vs

for hver – if Loop

som vi har nævnt før, kan du bruge en if-sætning inden for en løkke, udfører handlinger kun, hvis visse kriterier er opfyldt.

denne kode skjuler alle tomme rækker i et område:

VBA gør Mens Loop

VBA gør mens og gør indtil (se næste afsnit) er meget ens. De gentager en løkke, mens (eller indtil) en betingelse er opfyldt.

Do Mens Loop gentager en loop, mens en betingelse er opfyldt.

Her er gør mens syntaks:

1
2
3

gør mens tilstand
loop

hvor:

  • betingelse – betingelsen for at teste
  • – kodeblokken for at gentage

Du kan også oprette en do mens loop med tilstanden i slutningen af sløjfen:

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
8
sub diveloop ()
dim n som heltal
n = 1
gør mens n <11
n = n + 1
loop
end sub

Loop Mens

lad os nu køre den samme procedure, undtagen vi vil flytte tilstanden til slutningen af sløjfen:

1
2
3
4
5
6
8
sub doloopmens ()
dim n som heltal
n = 1
tilbage
msgboks n
n = n + 1
Loop Mens n <11
end sub

VBA gør indtil loop

tilbage indtil Loops gentager en løkke, indtil en bestemt betingelse er opfyldt. Syntaksen er i det væsentlige den samme som do mens loops:

1
2
3

loop

og på samme måde kan tilstanden gå i starten eller slutningen af sløjfen:

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
8
Sub DoUntilLoop ()
Dim n som heltal
n = 1
tilbage til N >10
n = n + 1
loop
end sub

loop indtil

denne loop indtil loop tæller til 10:

1
2
3
4
5
6
8
sub doloopuntil ()
dim n som heltal
n = 1
tilbage
msgboks n
n = n + 1
loop indtil n >10
End Sub

Afslut Do Loop

svarende til at bruge Afslut til for at afslutte en For Loop bruger du kommandoen Afslut Do til at afslutte en Do Loop med det samme

1
Afslut do

Her er et eksempel på Afslut do:

end or break Loop

som vi nævnte ovenfor, kan du bruge udgangen til eller afslutte do for at afslutte loops:

1
Exit For
1
Exit Do

However, these commands must be added to your code before you run din løkke.

Hvis du prøver at “bryde” en løkke, der kører i øjeblikket, kan du prøve at trykke på ESC eller CTRL + Pause Pause på tastaturet. Dette fungerer muligvis ikke. Hvis det ikke virker, skal du vente på, at din løkke slutter, eller i tilfælde af en endeløs løkke skal du bruge CTRL + Alt + Delete for at tvinge luk.det er lettere at ved et uheld oprette en endeløs løkke, der tvinger dig til at genstarte, hvilket potentielt mister dit arbejde.

flere Loopeksempler

Loop gennem rækker

dette løber gennem alle rækkerne i en kolonne:

Loop gennem kolonner

dette løber gennem alle kolonner i en række:

Loop gennem filer i en mappe

denne kode løber gennem alle filer i en mappe og opretter en liste:

Loop gennem Array

denne kode løber gennem array ‘arrlist’:

1
2
3

for i = lbound(arrlist) til ubound(arrlist)
msgboks arrlist(i)
næste i

lbound-funktionen får “nedre grænse” af arrayet, og ubound får “øvre grænse”.

sløjfer i Access VBA

de fleste af eksemplerne ovenfor fungerer også i Access VBA. I Access løber vi imidlertid gennem Recordset-objektet snarere end Områdeobjektet.

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

sub loopthroughrecords ()
on error genoptag næste
dim DBS som database
dim rst som 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



Skriv et svar

Din e-mailadresse vil ikke blive publiceret.