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 |