„Excel VBA“ kilpos - kiekvienam, kitam, daryk, įdėkite ir dar daugiau

Norėdami efektyviai dirbti VBA, turite suprasti kilpas.

Ciklai leidžia kartoti kodo bloką nustatytą skaičių kartų arba kartoti kodo bloką kiekviename objektų rinkinio objekte.

Pirmiausia parodysime keletą pavyzdžių, kurie parodys, ką gali kilpos. Tada mes jus išmokysime visko apie kilpas.

Greiti „VBA Loop“ pavyzdžiai

Už kiekvieną kilpą

Kiekvienos kilpos ciklas per kiekvieną kolekcijos objektą, pvz., Kiekvieną darbaknygės darbalapį arba kiekvieną diapazono langelį.

Peržiūrėkite visus darbaknygės darbalapius

Šis kodas peržiūrės visus darbaknygės darbalapius, neatskleisdamas kiekvieno lapo:

12345678 Sub LoopThroughSheets ()Dim ws kaip darbalapisUž kiekvieną ws darbalapiuosews.Visible = TiesaKitasPabaiga Sub

Peržiūrėkite visas diapazono ląsteles

Šis kodas perkelia daugybę langelių, tikrindamas, ar langelio vertė yra neigiama, teigiama ar nulis:

1234567891011121314 Antrinis If_Loop ()„Dim Cell“ kaip diapazonasKiekvienai diapazono langeliui ("A2: A6")Jei langelis.Vertė> 0 TadaLangelis.Poilsis (0, 1) .Vertybė = "Teigiamas"ElseIf Cell.Value <0 TadaLangelis.Poilsis (0, 1) .Vertybė = "Neigiamas"KitasLangelis.Poilsis (0, 1) .Vertybė = "Nulis"Pabaiga JeiKitas langelisPabaiga Sub

Kitoms kilpoms

Kitas „For“ kilpos tipas yra „For Next Loop“. Naudojant „For Next Loop“ (ciklas kitai) leidžiama perjungti sveikuosius skaičius.

Šis kodas pereis per sveikuosius skaičius nuo 1 iki 10 ir kiekvienas bus rodomas su pranešimų langeliu:

123456 Sub ForLoop ()Dim i As IntegerJei i = nuo 1 iki 10„MsgBox“ iKitas I.Pabaiga Sub

„Do while Loops“

Atlikite „Do while Loops“, kol bus įvykdyta sąlyga. Šis kodas taip pat bus rodomas per sveikuosius skaičius nuo 1 iki 10, rodant kiekvieną su pranešimų langeliu.

12345678 Sub DoWhileLoop ()Dim n Kaip sveikasis skaičiusn = 1Daryti kol n <11„MsgBox“ nn = n + 1KilpaPabaiga Sub

Daryti iki kilpų

Ir atvirkščiai, „Do Before Loops“ veiks ciklu, kol bus įvykdyta sąlyga. Šis kodas veikia taip pat, kaip ir du ankstesni pavyzdžiai.

12345678 Sub DoUntilLoop ()Dim n Kaip sveikasis skaičiusn = 1Atlikite tol, kol n> = 10„MsgBox“ nn = n + 1KilpaPabaiga Sub

Mes tai aptarsime toliau, tačiau kurdami ciklus „Do while“ arba „Do Before“ turite būti labai atsargūs, kad nesukurtumėte nesibaigiančios kilpos.

VBA kilpų kūrėjas

Tai yra „Loop Builder“ ekrano kopija iš mūsų „Premium VBA“ priedo: „AutoMacro“. „Loop Builder“ leidžia greitai ir lengvai sukurti kilpas, kad būtų galima peržiūrėti įvairius objektus ar skaičius. Galite atlikti veiksmus su kiekvienu objektu ir (arba) pasirinkti tik objektus, atitinkančius tam tikrus kriterijus.

Priede taip pat yra daug kitų kodų kūrėjų, plati VBA kodų biblioteka ir kodavimo įrankių asortimentas. Tai būtina bet kuriam VBA kūrėjui.

Dabar mes išsamiai aptarsime įvairių tipų kilpas.

VBA kitai kilpa

Dėl kilpos sintaksės

„For Next Loop“ leidžia kartoti kodo bloką nurodytą skaičių kartų. Sintaksė yra tokia:

12345 [Dim skaitiklis kaip sveikasis skaičius]Skaitliukas = nuo pradžios iki pabaigos [žingsnio vertė][Kažką daryti]Kitas [skaitiklis]

Kai skliausteliuose esantys elementai yra neprivalomi.

  • [Ilgas pritemdytas skaitiklis] - deklaruoja skaitiklio kintamąjį. Būtina, jei jūsų modulio viršuje yra nurodyta „Option Explicit“.
  • Skaitliukas - Skaičiuoti naudojamas sveikasis skaičius
  • Pradėti - Pradinė vertė (pvz. 1)
  • Galas - Galutinė vertė (pvz. 10)
  • [Žingsnio vertė] - Leidžia skaičiuoti kiekvieną n sveikąjį skaičių, o ne kiekvieną sveikąjį skaičių. Taip pat galite eiti atvirkščiai su neigiama verte (pvz., -1 veiksmas)
  • [Kažką daryti] - Kodas, kuris kartosis
  • Kitas [skaitiklis] - Baigiamasis pranešimas „For Next Loop“. Galite įtraukti skaitiklį arba ne. Tačiau primygtinai rekomenduoju įtraukti skaitiklį, nes tai palengvina jūsų kodo skaitymą.

Jei tai painu, nesijaudinkite. Apžvelgsime keletą pavyzdžių:

Skaičiuokite iki 10

Šis kodas bus skaičiuojamas iki 10 naudojant „For-Next Loop“:

12345678 Sub ForEach_CountTo10 ()Dim n Kaip sveikasis skaičiusJei n = 1-10„MsgBox“ nKitas nPabaiga Sub

„Loop Step“

Skaičiuokite iki 10 - tik lyginiai skaičiai

Šis kodas bus skaičiuojamas iki 10, skaičiuojant tik lyginius skaičius:

12345678 Sub ForEach_CountTo10_Even ()Dim n Kaip sveikasis skaičiusJei n = 2 iki 10 2 žingsnis„MsgBox“ nKitas nPabaiga Sub

Atkreipkite dėmesį, kad pridėjome „2 veiksmą“. Tai nurodo „For Loop“ „pereiti“ per skaitiklį 2. Mes taip pat galime naudoti neigiamą žingsnio vertę, kad žingsniuotume atvirkščiai:

„Loop Step“ - atvirkštinis

Atgalinė atskaita nuo 10

Šis kodas skaičiuos nuo 10:

123456789 Sub ForEach_Countdown_Inverse ()Dim n Kaip sveikasis skaičiusJei n = 10 iki 1 -1 žingsnis„MsgBox“ nKitas n„MsgBox“ pakeltiPabaiga Sub

Ištrinkite eilutes, jei langelis tuščias

Aš dažniausiai naudoju neigiamą veiksmą „For-Loop“, norėdamas pereiti per ląstelių diapazonus, ištrindamas eilutes, atitinkančias tam tikrus kriterijus. Jei pereisite nuo viršutinių eilučių prie apatinių eilučių, ištrindami eilutes, sugadinsite savo skaitiklį.

Šis pavyzdys ištrins eilutes su tuščiais langeliais (pradedant nuo apatinės eilutės):

12345678910 Sub ForEach_DeleteRows_BlankCells ()Dim n Kaip sveikasis skaičiusJei n = 10 iki 1 -1 žingsnisJei diapazonas ("a" & n) .Value = "" TadaDiapazonas („a“ & n) .EntireRow.DeletePabaiga JeiKitas nPabaiga Sub

Įdėtas į kilpą

Galite „įdėti“ vieną už kilpą į kitą už kilpą. Mes naudosime „Nested For Loops“, kad sukurtume daugybos lentelę:

1234567891011 Sub Nested_ForEach_MultiplicationTable ()Pritemdyti eilutę kaip sveiką skaičių, stulpelį kaip sveiką skaičiųEilė = nuo 1 iki 9Spalva = nuo 1 iki 9Ląstelės (eilutė + 1, stulpelis + 1). Vertė = eilutė * stulpelisKitas stulpelisKita eilutėPabaiga Sub

Išeiti

„Exit For“ teiginys leidžia iš karto išeiti iš „For Next“ kilpos.

Paprastai naudodami „Exit For“ kartu su teiginiu „If“ išeinate iš „For Next Loop“, jei įvykdoma tam tikra sąlyga.

Pvz., Galite naudoti langelį „For Loop“, kad surastumėte langelį. Suradę tą langelį, galite išeiti iš ciklo, kad pagreitintumėte kodą.

Šis kodas eis per 1–1 000 eilutes, ieškodamas „klaidos“ A stulpelyje. Jei jis bus rastas, kodas pasirinks langelį, įspės apie rastą klaidą ir išeis iš ciklo:

12345678910111213 Sub ExitFor_Loop ()Dim i As IntegerJei i = nuo 1 iki 1000Jei diapazonas ("A" & i) .Vertybė = "klaida" TadaDiapazonas („A“ ir i). Pasirinkite„MsgBox“ rasta klaidaIšeitiPabaiga JeiKitas I.Pabaiga Sub

Svarbu: „Nested For Loops“ atveju „Exit For“ išeina tik iš dabartinės „For Loop“, o ne visos aktyvios kilpos.

Tęsti Už

VBA neturi komandos „Tęsti“, esančios „Visual Basic“. Vietoj to turėsite naudoti „Išeiti“.

VBA už kiekvieną kilpą

VBA kiekvienai kilpai aplenks visus kolekcijos objektus:

  • Visos ląstelės diapazone
  • Visi darbalapiai darbo knygoje
  • Visos formos darbalapyje
  • Visos atviros darbo knygos

Taip pat galite naudoti „Nested For Every Loops“:

  • Visi langeliai diapazone visuose darbalapiuose
  • Visos formos visuose darbalapiuose
  • Visi lapai visose atvirose darbo knygose
  • ir taip toliau…

Sintaksė yra tokia:

123 Kiekvienam kolekcijos objektui[Kažką daryti]Kitas [objektas]

Kur:

  • Objektas - Kintamasis, apimantis diapazoną, darbalapį, darbaknygę, formą ir tt (pvz., Rng)
  • Kolekcija - Objektų kolekcija (pvz., Diapazonas („a1: a10“)
  • [Kažką daryti] - Kodo blokas, skirtas paleisti ant kiekvieno objekto
  • Kitas [objektas] - Baigiamasis pranešimas. [Objektas] yra neprivalomas, tačiau primygtinai rekomenduojamas.

Kiekvienai diapazono langeliui

Šis kodas eis per kiekvieną langelį diapazone:

123456789 Sub ForEachCell_inRange ()Šviesos langelis kaip diapazonasKiekvienam diapazono langeliui („a1: a10“)ląstelė. Vertė = ląstelė. Poslinkis (0,1). VertėKitas langelisPabaiga Sub

Kiekvienam darbaknygės darbalapiui

Šis kodas perkelia visus darbalapio darbalapius, panaikindamas kiekvieno lapo apsaugą:

123456789 Sub ForEachSheet_inWorkbook ()Dim ws kaip darbalapisUž kiekvieną ws darbalapiuosews.Atsisaugoti „slaptažodį“Kitas wsPabaiga Sub

Kiekvienai atvirai darbo knygai

Šis kodas išsaugos ir uždarys visas atidarytas darbaknyges:

123456789 Sub ForEachWB_inWorkbooks ()Dim wb Kaip darbo knygaUž kiekvieną wb darbaknygėsewb. Uždaryti SaveChanges: = TiesaKitas wbPabaiga Sub

Kiekvienai formai darbalapyje

Šis kodas ištrins visas aktyviojo lapo figūras.

123456789 Sub ForEachShape ()Dim shp As ShapeUž kiekvieną „ActiveSheet.Shapes“ formąshp. IštrintiKitas shpPabaiga Sub

Kiekvienai formai kiekviename darbaknygės darbalapyje

Taip pat galite įdėti lizdus kiekvienai kilpai. Čia apžvelgsime visas formas visose aktyvios darbaknygės darbalapiuose:

1234567891011 Sub ForEachShape_inAllWorksheets ()Dim shp kaip forma, ws kaip darbalapisUž kiekvieną ws darbalapiuoseKiekvienai shp In ws.Shapesshp. IštrintiKitas shpKitas wsPabaiga Sub

Kiekvienam - IF kilpa

Kaip jau minėjome anksčiau, cikle galite naudoti „If“ teiginį, atlikdami veiksmus tik tuo atveju, jei įvykdyti tam tikri kriterijai.

Šis kodas paslėps visas tuščias eilučių eilutes:

12345678910 Sub ForEachCell_inRange ()Šviesos langelis kaip diapazonasKiekvienam diapazono langeliui („a1: a10“)Jei ląstelė.Vertybė = "" Tada _cell.EntireRow.Hidden = TiesaKitas langelisPabaiga Sub

VBA „Do while Loop“

VBA „Do while“ ir „Do Before“ (žr. Kitą skyrių) yra labai panašūs. Jie pakartos ciklą, kol (arba kol) bus įvykdyta sąlyga.

Ciklas „Daryti kol“ pakartos ciklą, kol bus įvykdyta sąlyga.

Štai sintaksė „Daryk tuo metu“:

123 Būkite sąlyga[Kažką daryti]Kilpa

Kur:

  • Būklė - Sąlyga išbandyti
  • [Kažką daryti] - Kodo blokas, kurį reikia pakartoti

Taip pat galite nustatyti „Do Do“ ciklą su sąlyga ciklo pabaigoje:

123 Daryk[Kažką daryti]Būklė

Demonstruosime kiekvieną ir parodysime, kuo jie skiriasi:

Daryti Nors

Štai „Do while“ ciklo pavyzdys, kurį parodėme anksčiau:

12345678 Sub DoWhileLoop ()Dim n Kaip sveikasis skaičiusn = 1Daryti kol n <11„MsgBox“ nn = n + 1KilpaPabaiga Sub

Loop Nors

Dabar atlikime tą pačią procedūrą, išskyrus tai, kad perkelsime sąlygą į ciklo pabaigą:

12345678 Sub DoLoopWhile ()Dim n Kaip sveikasis skaičiusn = 1Daryk„MsgBox“ nn = n + 1Ciklas, kol n <11Pabaiga Sub

VBA „Iki tol“

„Do Before Loops“ kartos ciklą, kol bus įvykdyta tam tikra sąlyga. Sintaksė iš esmės yra tokia pati kaip „Do while“ kilpos:

123 Daryti iki būklės[Kažką daryti]Kilpa

ir panašiai būklė gali kilti ciklo pradžioje arba pabaigoje:

123 Daryk[Kažką daryti]Ciklas iki būklės

Daryti iki

Tai daroma iki ciklo, kaip ir ankstesniuose mūsų pavyzdžiuose, bus skaičiuojama iki 10

12345678 Sub DoUntilLoop ()Dim n Kaip sveikasis skaičiusn = 1Darykite iki n> 10„MsgBox“ nn = n + 1KilpaPabaiga Sub

Loop Iki

Ši kilpa „ciklas iki“ bus suskaičiuota iki 10:

12345678 „Sub DoLoopUntil“ ()Dim n Kaip sveikasis skaičiusn = 1Daryk„MsgBox“ nn = n + 1Ciklas iki n> 10Pabaiga Sub

Išeikite iš „Do Loop“

Panašiai kaip naudojant „Exit For“, jei norite išeiti iš „For Loop“, naudodami komandą „Exit Do“ nedelsdami išeinate iš „Do Loop“

1 Išeiti Daryti

Štai „Exit Do“ pavyzdys:

123456789101112131415 Sub ExitDo_Loop ()Dim i As Integeri = 1Darykite, kol i> 1000Jei diapazonas ("A" & i) .Vertybė = "klaida" TadaDiapazonas („A“ ir i). Pasirinkite„MsgBox“ rasta klaidaIšeiti DarytiPabaiga Jeii = i + 1KilpaPabaiga Sub

Pabaigos arba pertraukos kilpa

Kaip minėjome aukščiau, norėdami išeiti iš kilpų, galite naudoti „Exit For“ arba „Exit Do“:

1 Išeiti
1 Išeiti Daryti

Tačiau šios komandos turi būti pridėtos prie jūsų kodo prieš paleidžiant ciklą.

Jei bandote „nutraukti“ šiuo metu veikiančią kilpą, galite pabandyti paspausti ESC arba CTRL + Pertrauka ant klaviatūros. Tačiau tai gali neveikti. Jei tai neveikia, turėsite palaukti, kol ciklas baigsis, arba, jei tai nesibaigianti kilpa, naudoti CTRL + ALT + Ištrinti priversti uždaryti „Excel“.

Štai kodėl aš stengiuosi vengti „Do“ kilpų, lengviau netyčia sukurti nesibaigiančią kilpą, verčiančią iš naujo paleisti „Excel“, galbūt prarandant darbą.

Daugiau ciklų pavyzdžių

Kartoti eilutes

Tai atliks visas stulpelio eilutes:

123456789 Viešas antrinis ciklas ()Šviesos langelis kaip diapazonasKiekvienai diapazono langeliui („A: A“)Ff cell.value "" tada "MsgBox cell.address &": "& cell.valueKitas langelisPabaiga Sub

Keliaukite per stulpelius

Tai atliks visus stulpelius iš eilės:

123456789 Viešas antrinis ciklasTulpeliai ()Šviesos langelis kaip diapazonasKiekvienai diapazono langeliui („1: 1“)If cell.Value "" Tada MsgBox cell.Address & ":" & cell.ValueKitas langelisPabaiga Sub

Peržiūrėkite failus aplanke

Šis kodas perkelia visus aplanko failus ir sukuria sąrašą:

12345678910111213141516171819 „Sub LoopThroughFiles“ ()Dim oFSO kaip objektasApšviesti aplanką kaip objektąDim oFile kaip objektasDim i As IntegerNustatykite oFSO = CreateObject ("Scripting.FileSystemObject")Nustatyti oFolder = oFSO.GetFolder ("C: \ Demo)i = 2Kiekvienam „oFile“ aplanke. FailaiDiapazonas („A“ ir i) .value = oFile.Namei = i + 1Kitas failasPabaiga Sub

„Loop Through Array“

Šis kodas pereis per masyvą „arrList“:

123 I = LBound (arrList) į UBound (arrList)„MsgBox“ sąrašas (i)Kitas I.

Funkcija „LBound“ gauna „apatinę masyvo ribą“, o „UBound“ - „viršutinę ribą“.

Prieigos VBA ciklai

Dauguma aukščiau pateiktų pavyzdžių taip pat veiks „Access VBA“. Tačiau programoje „Access“ mes einame per įrašų rinkinio objektą, o ne į diapazono objektą.

123456789101112131415161718 Sub LoopThroughRecords ()Dėl klaidos Tęsti toliauDim dbs kaip duomenų bazėPirmas kaip įrašų rinkinysNustatykite dbs = CurrentDbNustatykite rst = dbs.OpenRecordset ("tblClients", dbOpenDynaset)Su pirm.Perkelti paskutinį.MoveFirstDaryti iki .EOF = Tiesa„MsgBox“ (rst.Fields („Kliento pavadinimas“)).PerkeltiToliauKilpaPabaiga supirma. UždarytiNustatykite pirmąjį = niekoNustatyti dbs = niekoPabaiga Sub

Padėsite svetainės plėtrą, dalintis puslapį su draugais

wave wave wave wave wave