Excel VBA -sløjfer - For hver, for næste, gør mens, indlejret og mere

For at arbejde effektivt i VBA skal du forstå Loops.

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

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

VBA Loop Hurtige eksempler

For hver sløjfe

For hver sløjfe går hvert objekt i en samling igennem, f.eks. Hvert regneark i projektmappen eller hver celle i et område.

Sløjfe igennem alle regneark i projektmappe

Denne kode går gennem alle regneark i projektmappen, og hvert ark vises:

12345678 Sub LoopThroughSheets ()Dim ws Som regnearkFor hver gang i regnearkws.Visible = TrueNæsteAfslut Sub

Sløjfe gennem alle celler inden for rækkevidde

Denne kode går gennem en række celler og tester, om celleværdien er negativ, positiv eller nul:

1234567891011121314 Sub If_Loop ()Dim celle som rækkeviddeFor hver celle i området ("A2: A6")Hvis Cell.Value> 0 SåCell.Offset (0, 1) .Værdi = "Positiv"ElseIf Cell.Value <0 HerefterCell.Offset (0, 1) .Value = "Negativ"AndetCell.Offset (0, 1) .Value = "Nul"Afslut HvisNæste celleAfslut Sub

Til næste sløjfer

En anden type “For” Loop er For Next Loop. For næste løkke giver dig mulighed for at gå gennem heltal.

Denne kode går gennem heltal 1 til 10 og viser hver med en meddelelsesboks:

123456 Sub ForLoop ()Dim i As IntegerFor i = 1 til 10MsgBox iNæste iAfslut Sub

Gør mens loops

Do While Loops loopes, mens en betingelse er opfyldt. Denne kode vil også gå gennem heltal 1 til 10 og vise hver med en meddelelsesboks.

12345678 Sub DoWhileLoop ()Dim n Som heltaln = 1Gør Mens n <11MsgBox nn = n + 1SløjfeAfslut Sub

Gør indtil sløjfer

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

12345678 Sub DoUntilLoop ()Dim n Som heltaln = 1Gør indtil n> = 10MsgBox nn = n + 1SløjfeAfslut Sub

Vi vil diskutere dette nedenfor, men du skal være yderst forsigtig, når du opretter Do While eller Do Through loops, så du ikke opretter en loop, der aldrig slutter.

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 loops til at gå igennem forskellige objekter eller tal. Du kan udføre handlinger på hvert objekt og/eller kun vælge objekter, der opfylder visse kriterier.

Tilføjelsen indeholder også mange andre kodebyggere, et omfattende VBA-kodebibliotek og et sortiment af kodningsværktøjer. Det er et must for enhver VBA -udvikler.

Nu vil vi dække de forskellige typer sløjfer i dybden.

VBA til næste sløjfe

Til Loop Syntax

For næste løkke giver dig mulighed for at gentage en kodeblok et bestemt antal gange. Syntaksen er:

12345 [Dim tæller som heltal]For tæller = Start til slut [trinværdi][Gør noget]Næste [Tæller]

Hvor elementerne i parentes er valgfrie.

  • [Dim tæller så lang] - Deklarerer tællervariablen. Påkrævet, hvis Option Explicit er angivet øverst på dit modul.
  • Tæller - En heltalsvariabel, der bruges til at tælle
  • Start - Startværdien (eks. 1)
  • Ende - Slutværdien (eks. 10)
  • [Trinværdi] - Giver dig mulighed for at tælle hvert n heltal i stedet for hvert 1 heltal. Du kan også gå omvendt med en negativ værdi (f.eks. Trin -1)
  • [Gør noget] - Koden, der gentages
  • Næste [Tæller] - Afslutningserklæring til For Next Loop. Du kan inkludere 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-Next Loop:

12345678 Sub ForEach_CountTo10 ()Dim n Som heltalFor n = 1 til 10MsgBox nNæste nAfslut Sub

Til Loop Step

Tæl til 10 - kun lige tal

Denne kode tæller til 10 og tæller kun lige tal:

12345678 Sub ForEach_CountTo10_Even ()Dim n Som heltalFor n = 2 Til 10 Trin 2MsgBox nNæste nAfslut Sub

Bemærk, at 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 omvendt:

For sløjfe trin - omvendt

Nedtælling fra 10

Denne kode nedtælles fra 10:

123456789 Sub ForEach_Countdown_Inverse ()Dim n Som heltalFor n = 10 Til 1 Trin -1MsgBox nNæste nMsgBox "Lift off"Afslut Sub

Slet rækker, hvis cellen er tom

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

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

12345678910 Sub ForEach_DeleteRows_BlankCells ()Dim n Som heltalFor n = 10 Til 1 Trin -1If Range ("a" & n) .Value = "" HerefterOmråde ("a" og n) .EntireRow.DeleteAfslut HvisNæste nAfslut Sub

Indlejret til sløjfe

Du kan “rede” en For Loop inde i en anden For Loop. Vi vil bruge Nested For Loops til at oprette en multiplikationstabel:

1234567891011 Sub Nested_ForEach_MultiplicationTable ()Dim række som heltal, kol som heltalFor række = 1 til 9For kol = 1 til 9Celler (række + 1, kol + 1). Værdi = række * kolNæste kolNæste rækkeAfslut Sub

Afslut For

Med Exit For -sætningen kan du straks forlade en For Next -loop.

Du vil normalt bruge Exit For sammen med en If -erklæring og forlade For Next Loop, hvis en bestemt betingelse er opfyldt.

For eksempel kan du bruge en For Loop til at finde en celle. Når denne celle er fundet, kan du forlade sløjfen for at fremskynde din kode.

Denne kode går 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 løkken:

12345678910111213 Sub ExitFor_Loop ()Dim i As IntegerFor i = 1 til 1000Hvis område ("A" & i) .Value = "fejl" SåOmråde ("A" og i). VælgMsgBox "Fejl fundet"Afslut ForAfslut HvisNæste iAfslut Sub

Vigtigt: I tilfælde af Nested For Loops forlader Exit For kun den aktuelle For Loop, ikke alle aktive Loops.

Fortsæt til

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

VBA for hver sløjfe

VBA For Every Loop går gennem alle objekter i en samling:

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

Du kan også bruge indlejret for hver sløjfe til at:

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

Syntaksen er:

123 For hvert objekt i samlingen[Gør noget]Næste [Objekt]

Hvor:

  • Objekt - Variabel, der repræsenterer et område, regneark, arbejdsbog, form osv. (F.eks. Rng)
  • Kollektion - Indsamling af objekter (f.eks. Rækkevidde (“a1: a10”)
  • [Gør noget] - Kodeblok til at køre på hvert objekt
  • Næste [Objekt] - Afslutningserklæring. [Objekt] er valgfri, men anbefales stærkt.

For hver celle inden for rækkevidde

Denne kode går gennem hver celle i et område:

123456789 Sub ForEachCell_inRange ()Dim celle som områdeFor hver celle i området ("a1: a10")cell.Value = cell.Offset (0,1) .VærdiNæste celleAfslut Sub

For hvert regneark i projektmappe

Denne kode går gennem alle regneark i en projektmappe, uden at beskytte hvert ark:

123456789 Sub ForEachSheet_inWorkbook ()Dim ws Som regnearkFor hver gang i regnearkws.Beskyt "adgangskode"Næste wsAfslut Sub

For hver åben projektmappe

Denne kode gemmer og lukker alle åbne projektmapper:

123456789 Sub ForEachWB_inWorkbooks ()Dim wb Som projektmappeFor hver wb i projektmapperwb.Close SaveChanges: = TrueNæste wbAfslut Sub

For hver form i regnearket

Denne kode vil slette alle former i det aktive ark.

123456789 Sub ForEachShape ()Dim shp som formFor hver shp i ActiveSheet.Shapesshp.SletNæste shpAfslut Sub

For hver form i hvert regneark i projektmappen

Du kan også rede for hver sløjfe. Her går vi igennem alle former i alle regneark i den aktive projektmappe:

1234567891011 Sub ForEachShape_inAllWorksheets ()Dim shp As Shape, ws As WorksheetFor hver gang i regnearkFor hver shp In ws.Shapesshp.SletNæste shpNæste wsAfslut Sub

For hver - IF Loop

Som vi tidligere har nævnt, kan du bruge en If -sætning i en loop og kun udføre handlinger, hvis visse kriterier er opfyldt.

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

12345678910 Sub ForEachCell_inRange ()Dim celle som områdeFor hver celle i området ("a1: a10")Hvis cell.Value = "" Så _cell.EntireRow.Hidden = SandtNæste celleAfslut Sub

VBA Do While Loop

VBA Do While og Do Through (se næste afsnit) ligner meget. De vil gentage en loop, mens (eller indtil) en betingelse er opfyldt.

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

Her er Do While -syntaksen:

123 Gør mens tilstand[Gør noget]Sløjfe

Hvor:

  • Tilstand - Betingelsen for at teste
  • [Gør noget] - Kodeblokken skal gentages

Du kan også konfigurere en Do While -sløjfe med betingelsen i slutningen af ​​løkken:

123 Gør[Gør noget]Sløjfe mens tilstand

Vi vil demonstrere hver enkelt og vise, hvordan de adskiller sig:

Gøre imens

Her er Do While loop -eksemplet, som vi tidligere demonstrerede:

12345678 Sub DoWhileLoop ()Dim n Som heltaln = 1Gør Mens n <11MsgBox nn = n + 1SløjfeAfslut Sub

Sløjfe mens

Lad os nu køre den samme procedure, bortset fra at vi flytter tilstanden til slutningen af ​​sløjfen:

12345678 Sub DoLoopWhile ()Dim n Som heltaln = 1GørMsgBox nn = n + 1Sløjfe Mens n <11Afslut Sub

VBA Gør indtil sløjfe

Gør indtil sløjfer vil gentage en sløjfe, indtil en bestemt betingelse er opfyldt. Syntaksen er i det væsentlige den samme som Do While -loops:

123 Gør indtil tilstand[Gør noget]Sløjfe

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

123 Gør[Gør noget]Sløjfe indtil tilstand

Gør Indtil

Dette gør indtil loop vil tælle til 10, ligesom vores tidligere eksempler

12345678 Sub DoUntilLoop ()Dim n Som heltaln = 1Gør indtil n> 10MsgBox nn = n + 1SløjfeAfslut Sub

Sløjfe Indtil

Denne loop til loop vil tælle til 10:

12345678 Sub DoLoopUntil ()Dim n Som heltaln = 1GørMsgBox nn = n + 1Sløjfe Indtil n> 10Afslut Sub

Afslut Do Loop

Ligesom at bruge Exit For til at afslutte en For Loop, bruger du Exit Do -kommandoen til at afslutte en Do Loop med det samme

1 Afslut Do

Her er et eksempel på Exit Do:

123456789101112131415 Sub ExitDo_Loop ()Dim i As Integerjeg = 1Gør indtil jeg> 1000Hvis område ("A" & i) .Value = "fejl" SåOmråde ("A" og i). VælgMsgBox "Fejl fundet"Afslut DoAfslut Hvisi = i + 1SløjfeAfslut Sub

Afslut eller bryd sløjfe

Som vi nævnte ovenfor, kan du bruge Exit For eller Exit Do til at afslutte loops:

1 Afslut For
1 Afslut Do

Disse kommandoer skal dog føjes til din kode, før du kører din loop.

Hvis du forsøger at "bryde" en loop, der kører i øjeblikket, kan du prøve at trykke på ESC eller CTRL + Pause på tastaturet. Dette fungerer dog muligvis ikke. Hvis det ikke virker, skal du vente på, at din loop slutter, eller i tilfælde af en endeløs loop, bruge CTRL + ALT + Slet for at tvinge Luk Excel.

Det er derfor, jeg forsøger at undgå Do loops, det er lettere ved et uheld at oprette en endeløs loop, der tvinger dig til at genstarte Excel og muligvis miste dit arbejde.

Flere sløjfeeksempler

Sløjfe gennem rækker

Dette vil gå gennem alle rækker i en kolonne:

123456789 Offentlig Sub LoopThroughRows ()Dim celle som områdeFor hver celle i området ("A: A")Ff cell.value "" derefter MsgBox cell.address & ":" & cell.valueNæste celleAfslut Sub

Sløjfe gennem kolonner

Dette vil gå gennem alle kolonner i en række:

123456789 Offentlig Sub LoopThroughColumns ()Dim celle som områdeFor hver celle i området ("1: 1")Hvis cell.Value "" Så er MsgBox cell.Address & ":" & cell.ValueNæste celleAfslut Sub

Loop gennem filer i en mappe

Denne kode går gennem alle filer i en mappe og opretter en liste:

12345678910111213141516171819 Sub LoopThroughFiles ()Dim oFSO som objektDim oFolder som objektDim oFile som objektDim i As IntegerIndstil oFSO = CreateObject ("Scripting.FileSystemObject")Indstil oFolder = oFSO.GetFolder ("C: \ Demo)jeg = 2For hver oFile I oFolder.FilesOmråde ("A" og i) .value = oFile.Namei = i + 1Næste oFileAfslut Sub

Loop Through Array

Denne kode går gennem array 'arrList':

123 For i = LBound (arrList) Til UBound (arrList)MsgBox arrList (i)Næste i

LBound -funktionen får arrayets "nedre grænse", og UBound får den "øvre grænse".

Sløjfer i Access VBA

De fleste af eksemplerne ovenfor fungerer også i Access VBA. I Access går vi imidlertid gennem Recordset -objektet frem for Range -objektet.

123456789101112131415161718 Sub LoopThroughRecords ()Ved fejl Genoptag næsteDim dbs som databaseDim første som rekordsætIndstil dbs = CurrentDbIndstil rst = dbs.OpenRecordset ("tblClients", dbOpenDynaset)Med første.Flyt sidste.MoveFirstGør indtil .EOF = TrueMsgBox (rst.Fields ("ClientName")).MoveNextSløjfeAfslut medførst. lukIndstil rst = IntetIndstil dbs = IntetAfslut Sub

Du vil bidrage til udviklingen af ​​hjemmesiden, at dele siden med dine venner

wave wave wave wave wave