Excel VBA petlje - za svaku, za sljedeću, radi dok, ugniježđenu i više

Za učinkovit rad u VBA morate razumjeti petlje.

Petlje vam omogućuju ponavljanje bloka koda određeni broj puta ili ponavljanje bloka koda za svaki objekt u skupu objekata.

Prvo ćemo vam pokazati nekoliko primjera koji će vam pokazati za što su petlje sposobne. Tada ćemo vas naučiti sve o petljama.

Brzi primjeri petlje VBA

Za svaku petlju

Za svaku petlju petlja kroz svaki objekt u zbirci, kao što je svaki radni list u radnoj knjizi ili svaka ćelija u rasponu.

Prelistajte sve radne listove u radnoj svesci

Ovaj kôd će se provlačiti kroz sve radne listove u radnoj knjizi, otkrivajući svaki list:

12345678 Sub LoopThroughSheets ()Zatamni kao radni listZa svaki ws u radnim listovimaws.Visible = IstinaSljedećiKraj podm

Prođite kroz sve ćelije u dosegu

Ovaj kôd će se provlačiti kroz niz ćelija, provjeravajući je li vrijednost ćelije negativna, pozitivna ili nula:

1234567891011121314 Sub If_Loop ()Prigušena ćelija kao rasponZa svaku ćeliju u rasponu ("A2: A6")Ako je Cell.Value> 0 TadaCell.Offset (0, 1) .Value = "Pozitivno"Ostala ćelija.Vrijednost <0 ZatimCell.Offset (0, 1) .Value = "Negativno"DrugoCell.Offset (0, 1) .Value = "Nula"Završi akoSljedeća ćelijaKraj podm

Za sljedeće petlje

Druga vrsta petlje "Za" je petlja Za sljedeću. For Next Loop omogućuje vam da prolazite kroz cijele brojeve.

Ovaj kôd će se kretati kroz cijele brojeve od 1 do 10, prikazujući svaki s okvirom poruke:

123456 Sub ForLoop ()Dim i Kao cijeli brojZa i = 1 do 10MsgBox iSljedeći iKraj podm

Do While petlje

Do While petlje će se petljati dok je uvjet zadovoljen. Ovaj će kôd također prolaziti kroz cijele brojeve od 1 do 10, prikazujući svaki s okvirom za poruku.

12345678 Sub DoWhileLoop ()Dim n kao cijeli brojn = 1Učinite Dok je n <11MsgBox nn = n + 1PetljaKraj podm

Radite do petlji

Nasuprot tome, petlje Učinit će se sve dok se ne ispuni uvjet. Ovaj kôd radi isto što i prethodna dva primjera.

12345678 Sub DoUntilLoop ()Dim n kao cijeli brojn = 1Učinite sve dok n> = 10MsgBox nn = n + 1PetljaKraj podm

O tome ćemo raspravljati u nastavku, ali morate biti iznimno oprezni pri stvaranju petlji Do While ili Do Until kako ne biste stvorili neprekidnu petlju.

VBA graditelj petlji

Ovo je snimak zaslona „Loop Builder-a“ iz našeg Premium VBA dodatka: AutoMacro. Loop Builder omogućuje vam brzo i jednostavno stvaranje petlji za petlje kroz različite objekte ili brojeve. Možete izvesti radnje na svakom objektu i/ili odabrati samo objekte koji zadovoljavaju određene kriterije.

Dodatak također sadrži mnoge druge graditelje kodova, opsežnu biblioteku kodova VBA i niz alata za kodiranje. To mora imati svaki VBA programer.

Sada ćemo dubinski pokriti različite vrste petlji.

VBA za sljedeću petlju

Za sintaksu petlje

For Next Loop omogućuje ponavljanje bloka koda određeni broj puta. Sintaksa je:

12345 [Zatamni brojač kao cijeli broj]Za brojač = Početak do kraja [Vrijednost koraka][Učini nešto]Sljedeći [brojač]

Gdje su stavke u zagradama izborne.

  • [Dim Counter as Long] - Deklarira varijablu brojača. Obavezno ako je opcija Explicit deklarirana na vrhu vašeg modula.
  • Brojač - Cijela varijabla koja se koristi za brojanje
  • Početak - Početna vrijednost (Primjer 1)
  • Kraj - Krajnja vrijednost (Primjer 10)
  • [Vrijednost koraka] - Omogućuje vam brojanje svakih n cijelih brojeva umjesto svakog 1 cijelog broja. Također možete krenuti unatrag s negativnom vrijednošću (npr. Korak -1)
  • [Učini nešto] - Kôd koji će se ponoviti
  • Sljedeći [brojač] - Završna izjava za narednu petlju. Možete uključiti brojač ili ne. Međutim, toplo preporučujem uključivanje brojača jer vam olakšava čitanje koda.

Ako je to zbunjujuće, ne brinite. Pregledat ćemo neke primjere:

Broji do 10

Ovaj će se kôd brojati do 10 pomoću petlje For-Next:

12345678 Sub ForEach_CountTo10 ()Dim n kao cijeli brojZa n = 1 do 10MsgBox nDalje nKraj podm

Za Loop Step

Broji do 10 - samo parni brojevi

Ovaj kôd broji do 10 računajući samo parne brojeve:

12345678 Sub ForEach_CountTo10_Even ()Dim n kao cijeli brojZa n = 2 do 10 Korak 2MsgBox nDalje nKraj podm

Primijetite da smo dodali "Korak 2". To govori da For Loop "korača" kroz brojač za 2. Također možemo koristiti negativnu vrijednost koraka za korak unatrag:

Za korak petlje - obrnuto

Odbrojavanje od 10

Ovaj kôd će odbrojavati od 10:

123456789 Sub ForEach_Countdown_Inverse ()Dim n kao cijeli brojZa n = 10 do 1 korak -1MsgBox nDalje nMsgBox "Lift Off"Kraj podm

Izbriši retke ako je ćelija prazna

Najčešće sam koristio negativan korak For-Loop za petlje kroz raspone ćelija, brišući retke koji zadovoljavaju određene kriterije. Ako petljate iz gornjih redaka u donje redove, dok brišete retke, zabrljat ćete brojač.

Ovaj će primjer izbrisati retke s praznim ćelijama (počevši od donjeg retka):

12345678910 Sub ForEach_DeleteRows_BlankCells ()Dim n kao cijeli brojZa n = 10 do 1 korak -1Ako Range ("a" & n) .Value = "" ZatimRaspon ("a" & n) .EntireRow.DeleteZavrši akoDalje nKraj podm

Ugniježđeno za petlju

Možete "ugnijezditi" jedan For Loop u drugi For Loop. Za izradu tablice množenja koristit ćemo Ugniježđene petlje:

1234567891011 Pod ugniježđena_ForEach_MultiplicationTable ()Zatamni redak kao cijeli broj, stolnjak kao cijeli brojZa red = 1 do 9Za col = 1 do 9Ćelije (redak + 1, stupac + 1) .Vrijednost = redak * stupacSljedeći colSljedeći redKraj podm

Izlaz za

Naredba Exit For omogućuje vam da odmah izađete iz petlje For Next.

Obično biste upotrijebili Izlaz za zajedno s Izjavom Ako izlazite iz Petlje za sljedeće ako je ispunjen određeni uvjet.

Na primjer, za pronalaženje ćelije možete upotrijebiti For Loop. Nakon što se ta ćelija pronađe, možete izaći iz petlje kako biste ubrzali kôd.

Ovaj kôd će se provlačiti kroz retke od 1 do 1000, tražeći "pogrešku" u stupcu A. Ako se pronađe, kôd će odabrati ćeliju, upozoriti vas na pronađenu pogrešku i izaći iz petlje:

12345678910111213 PodizlazFor_Loop ()Dim i Kao cijeli brojZa i = 1 do 1000Ako Range ("A" & i) .Value = "error" TadaRaspon ("A" & i). OdaberiteMsgBox "Greška je pronađena"Izlaz zaZavrši akoSljedeći iKraj podm

Važno: U slučaju ugniježđene for petlje, Exit For napušta samo trenutnu For Loop, a ne sve aktivne petlje.

Nastavite za

VBA nema naredbu "Nastavi" koja se nalazi u Visual Basicu. Umjesto toga morat ćete upotrijebiti “Exit”.

VBA za svaku petlju

VBA za svaku petlju petljat će kroz sve objekte u zbirci:

  • Sve ćelije u rasponu
  • Svi radni listovi u radnoj bilježnici
  • Svi oblici na radnom listu
  • Sve otvorene radne bilježnice

Također možete koristiti Ugniježđeno za svaku petlju za:

  • Sve ćelije u rasponu na svim radnim listovima
  • Svi oblici na svim radnim listovima
  • Svi listovi u svim otvorenim radnim bilježnicama
  • i tako dalje…

Sintaksa je:

123 Za svaki objekt u zbirci[Učini nešto]Sljedeći [objekt]

Gdje:

  • Objekt - Varijabla koja predstavlja raspon, radni list, radnu knjigu, oblik itd. (Npr. Rng)
  • Kolekcija - Zbirka predmeta (npr. Raspon ("a1: a10"))
  • [Učini nešto] - Kodni blok za izvođenje na svakom objektu
  • Sljedeći [objekt] - Završna riječ. [Objekt] nije obavezan, ali se toplo preporučuje.

Za svaku ćeliju u dometu

Ovaj kôd će se provlačiti kroz svaku ćeliju u rasponu:

123456789 Sub ForEachCell_inRange ()Prigušena ćelija kao rasponZa svaku ćeliju u rasponu ("a1: a10")ćelija.Vrijednost = ćelija.Offset (0,1) .VrijednostSljedeća ćelijaKraj podm

Za svaki radni list u radnoj bilježnici

Ovaj kôd će proći kroz sve radne listove u radnoj knjizi, uklanjajući zaštitu svakog lista:

123456789 Pod ForEachSheet_inWorkbook ()Zatamni kao radni listZa svaki ws u radnim listovimaws.Unprotect "password"Sljedeći wsKraj podm

Za svaku otvorenu radnu knjigu

Ovaj će kôd spremiti i zatvoriti sve otvorene radne knjige:

123456789 Sub ForEachWB_inWorkbooks ()Dim wb Kao radna bilježnicaZa svaku wb u radnim bilježnicamawb.Zatvori Spremi promjene: = IstinaSljedeća wbKraj podm

Za svaki oblik na radnom listu

Ovaj će kôd izbrisati sve oblike na aktivnom listu.

123456789 Sub ForEachShape ()Dim shp As ShapeZa svaki shp u ActiveSheet.oblicishp.BrisatiSljedeći shpKraj podm

Za svaki oblik na svakom radnom listu u radnoj svesci

Također se možete ugnijezditi za svaku petlju. Ovdje ćemo proći kroz sve oblike na svim radnim listovima u aktivnoj radnoj knjizi:

1234567891011 Sub ForEachShape_inAllWorksheets ()Dim shp kao oblik, ws kao radni listZa svaki ws u radnim listovimaZa svaki shp U ws.oblicishp.BrisatiSljedeći shpSljedeći wsKraj podm

Za svaki - IF petlja

Kao što smo već spomenuli, možete koristiti naredbu If unutar petlje, izvodeći radnje samo ako su ispunjeni određeni kriteriji.

Ovaj će kôd sakriti sve prazne retke u rasponu:

12345678910 Sub ForEachCell_inRange ()Prigušena ćelija kao rasponZa svaku ćeliju u rasponu ("a1: a10")Ako je cell.Value = "" Tada _cell.EntireRow.Hidden = TrueSljedeća ćelijaKraj podm

VBA Do While Loop

VBA Do Do i Do Do (vidi sljedeći odjeljak) vrlo su slični. Ponavljat će petlju dok (ili dok) uvjet nije ispunjen.

Petlja Do While ponavljat će petlju dok je uvjet ispunjen.

Ovdje je sintaksa Do While:

123 Do While Stanje[Učini nešto]Petlja

Gdje:

  • Stanje - Uvjet za testiranje
  • [Učini nešto] - Blok koda za ponavljanje

Također možete postaviti petlju Do While s uvjetom na kraju petlje:

123 Čini[Učini nešto]Stanje petlje

Pokazat ćemo svaki od njih i pokazati kako se razlikuju:

Učinite Dok

Evo primjera petlje Do While koji smo prethodno demonstrirali:

12345678 Sub DoWhileLoop ()Dim n kao cijeli brojn = 1Učinite Dok je n <11MsgBox nn = n + 1PetljaKraj podm

Petlja Dok

Pokrenimo sada isti postupak, osim što ćemo premjestiti uvjet na kraj petlje:

12345678 Sub DoLoopWhile ()Dim n kao cijeli brojn = 1ČiniMsgBox nn = n + 1Petlja Dok je n <11Kraj podm

VBA Do Until Loop

Do Do Loops će ponavljati petlju sve dok se ne ispuni određeni uvjet. Sintaksa je u biti ista kao i petlje Do While:

123 Učinite do uvjeta[Učini nešto]Petlja

i slično, uvjet može ići na početak ili kraj petlje:

123 Čini[Učini nešto]Petlja do stanja

Učinite do

Ova petlja do, računat će se do 10, kao i naši prethodni primjeri

12345678 Sub DoUntilLoop ()Dim n kao cijeli brojn = 1Radite do n> 10MsgBox nn = n + 1PetljaKraj podm

Petlja do

Ova petlja Petlja do brojat će se do 10:

12345678 Sub DoLoopUntil ()Dim n kao cijeli brojn = 1ČiniMsgBox nn = n + 1Petlja do n> 10Kraj podm

Izađite iz Do Loopa

Slično kao i za izlaz iz For za izlaz iz For Loopa, naredbu Exit Do za izlaz iz Do Loopa odmah koristite

1 Izlaz Do

Evo primjera programa Exit Do:

123456789101112131415 PodizlazDo_Loop ()Dim i Kao cijeli broji = 1Učiniti do i> 1000Ako Range ("A" & i) .Value = "error" TadaRaspon ("A" & i). OdaberiteMsgBox "Greška je pronađena"Izlaz DoZavrši akoi = i + 1PetljaKraj podm

Kraj ili prekid petlje

Kao što smo gore spomenuli, za izlaz iz petlji možete koristiti Exit For ili Exit Do:

1 Izlaz za
1 Izlaz Do

Međutim, ove se naredbe moraju dodati vašem kodu prije nego što pokrenete svoju petlju.

Ako pokušavate "prekinuti" petlju koja se trenutno izvodi, možete pokušati pritisnuti ESC ili CTRL + Pauziraj stanku na tipkovnici. Međutim, ovo možda neće uspjeti. Ako ne radi, morat ćete pričekati da se vaša petlja završi ili, u slučaju beskonačne petlje, upotrijebiti CTRL + ALT + Izbrisati da biste prisilno zatvorili Excel.

Zato pokušavam izbjeći Do petlje, lakše je slučajno stvoriti beskrajnu petlju koja vas tjera na ponovno pokretanje programa Excel, što potencijalno može izgubiti vaš rad.

Više primjera petlji

Petlja kroz redove

Ovo će proći kroz sve retke u stupcu:

123456789 Javna podzvučna petljaThroughRows ()Prigušena ćelija kao rasponZa svaku ćeliju u rasponu ("A: A")Ff cell.value "" zatim MsgBox cell.address & ":" & cell.valueSljedeća ćelijaKraj podm

Petlja kroz kolone

Ovo će proći kroz sve stupce zaredom:

123456789 Javna podpružna petljaThroughColumns ()Prigušena ćelija kao rasponZa svaku ćeliju u rasponu ("1: 1")If cell.Value "" Then MsgBox cell.Address & ":" & cell.ValueSljedeća ćelijaKraj podm

Petlje kroz datoteke u mapi

Ovaj kôd će proći kroz sve datoteke u mapi, stvarajući popis:

12345678910111213141516171819 Sub LoopThroughFiles ()Dim oFSO As ObjectZatamni mapu kao objektDim oFile As ObjectDim i Kao cijeli brojPostavi oFSO = CreateObject ("Scripting.FileSystemObject")Postavi oFolder = oFSO.GetFolder ("C: \ Demo)i = 2Za svaki oFile In oFolder.FilesRaspon ("A" & i) .value = oFile.Namei = i + 1Sljedeća oFileKraj podm

Loop Through Array

Ovaj kôd će se provlačiti kroz niz 'arrList':

123 Za i = LBound (arrList) Za UBound (arrList)MsgBox arrList (i)Sljedeći i

LBound funkcija dobiva "donju granicu" niza, a UBound "gornju granicu".

Petlje u Access VBA

Većina gornjih primjera također će raditi u Access VBA. Međutim, u Accessu prolazimo kroz objekt skupa zapisa, a ne kroz objekt raspona.

123456789101112131415161718 Sub LoopThroughRecords ()Uključeno Slijedi nastavak greškeDim dbs kao baza podatakaDim rst As RecordsetPostavite dbs = CurrentDbPostavi rst = dbs.OpenRecordset ("tblClients", dbOpenDynaset)S prvim.Pomičite se posljednje.Pomiči se prvoUčiniti do .EOF = IstinaMsgBox (rst.Fields ("ClientName")).Pomiči seSljedećiPetljaZavrši sprvo.ZatvoriPostavite rst = NištaPostavite dbs = NištaKraj podm

Vi ćete pomoći u razvoju web stranice, dijeljenje stranicu sa svojim prijateljima

wave wave wave wave wave