Loops në VBA

Ka situata kur një program VBA kërkohet të kryejë të njëjtin grup veprimesh disa herë me radhë (d.m.th., të përsërisë të njëjtin bllok kodi disa herë). Kjo mund të bëhet duke përdorur sythe VBA.

Sythet VBA përfshijnë:

Më pas, ne do të hedhim një vështrim më të afërt në secilin prej këtyre cikleve.

Për Operatorin Loop në Visual Basic

Struktura e operatorit të ciklit La në Visual Basic mund të organizohet në njërën nga dy format: si një lak Për… Tjetra ose si një lak Per secilin.

Cikli "Për ... Tjetra"

Cikël Për… Tjetra përdor një variabël që merr në mënyrë sekuenciale vlera nga një gamë e caktuar. Me çdo ndryshim të vlerës së ndryshores kryhen veprimet e mbyllura në trupin e ciklit. Kjo është e lehtë për t'u kuptuar nga një shembull i thjeshtë:

Për i = 1 deri në 10 Gjithsej = Total + iArray(i) Tjetra i

Në këtë lak të thjeshtë Për… Tjetra përdoret variabli i, i cili merr në mënyrë sekuenciale vlerat 1, 2, 3, ... 10, dhe për secilën nga këto vlera, ekzekutohet kodi VBA brenda lakut. Kështu, ky lak përmbledh elementet e grupit. iArray në variabël Total.

Në shembullin e mësipërm, rritja e ciklit nuk është specifikuar, kështu që për të rritur variablin i nga 1 në 10, parazgjedhja është një rritje 1… Megjithatë, në disa raste është e nevojshme të përdoren vlera të ndryshme të rritjes për lak. Kjo mund të bëhet duke përdorur fjalën kyçe Hapsiç tregohet në shembullin e thjeshtë vijues.

Për d = 0 deri në 10 Hapi 0.1 dTotal = dTotal + d Tjetër d

Meqenëse në shembullin e mësipërm, hapi i rritjes është vendosur i barabartë me 0.1, pastaj ndryshorja dTotal për çdo përsëritje të ciklit merr vlerat 0.0, 0.1, 0.2, 0.3,… 9.9, 10.0.

Për të përcaktuar hapin e lakut në VBA, mund të përdorni një vlerë negative, për shembull, si kjo:

Për i = 10 Tek 1 Hapi -1 iArray(i) = i Tjetra i

Këtu është rritja -1, pra ndryshorja i me çdo përsëritje të ciklit merr vlerat 10, 9, 8, ... 1.

Loop "Për secilin"

Cikël Per secilin të ngjashme me një cikël Për… Tjetra, por në vend që të përsëritet mbi sekuencën e vlerave për variablin numërues, lakun Per secilin kryen një grup veprimesh për çdo objekt në grupin e caktuar të objekteve. Në shembullin e mëposhtëm, duke përdorur një lak Per secilin numëron të gjitha fletët në librin aktual të punës Excel:

Zbeh wFletë si fletë pune për secilën wfletë në fletë pune MsgBox "Naйден fletë: " & wSheet.Name Next wSheet

Deklarata e ndërprerjes në qark "Dalje për"

operator Dil Për përdoret për të ndërprerë ciklin. Sapo kjo deklaratë të ndeshet në kod, programi përfundon ekzekutimin e ciklit dhe vazhdon me ekzekutimin e deklaratave që janë në kod menjëherë pas këtij cikli. Kjo mund të përdoret, për shembull, për të kërkuar një vlerë specifike në një grup. Për ta bërë këtë, duke përdorur një lak, çdo element i grupit skanohet. Sapo të gjendet elementi i kërkuar, nuk ka nevojë të shikoni pjesën tjetër - cikli ndërpritet.

Aplikacioni i operatorit Dil Për demonstruar në shembullin e mëposhtëm. Këtu cikli përsërit mbi 100 hyrje në grup dhe krahason secilën me vlerën e ndryshores dVal… Nëse gjendet një përputhje, atëherë cikli përfundon:

Për i = 1 deri në 100 Nëse dValues(i) = dVal Atëherë IndexVal = i Dilni për në fund nëse tjetër i

Loop Do while në Visual Basic

Cikël Bej Nderkohe ekzekuton një bllok kodi për sa kohë që plotësohet kushti i specifikuar. Më poshtë është një shembull i një procedure Sub, në të cilën duke përdorur lak Bej Nderkohe Numrat Fibonacci që nuk i kalojnë 1000 shfaqen në mënyrë sekuenciale:

'Nënprocedura nxjerr numra Fibonacci që nuk i kalojnë 1000 Sub Fibonacci() Dim i si numër i plotë 'për të treguar pozicionin e elementit në sekuencë Dim iFib As Integer 'ruan vlerën aktuale të sekuencës Dim iFib_Next Si Integer' ruan vlerën tjetër i sekuencës Dim iStep As Integer 'ruan madhësinë e rritjes së ardhshme' inicializon variablat i dhe iFib_Next i = 1 iFib_Next = 0 'Do while do të ekzekutohet derisa vlera e 'numrit aktual Fibonacci të jetë më e madhe se 1000 Do Ndërsa iFib_Next < 1000 Nëse i = 1 Pastaj 'rasti i veçantë për elementin e parë iStep = 1 iFib = 0 Përndryshe 'ruani madhësinë e rritjes tjetër përpara se të mbishkruani 'vlerën aktuale të sekuencës iStep = iFib iFib = iFib_Next Fundi Nëse 'shtypni numrin aktual të Fibonacci në kolonën A të fleta aktive e punës 'në rresht me indeksin i Cells(i , 1). Vlera = iFib 'llogarit numrin tjetër të Fibonaccit dhe rrit indeksin e pozicionit të elementit me 1 iFib_Next = iFib + iStep i = i + 1 Loop Fund Sub

Në shembullin e dhënë, kushti iFib_Next < 1000 kontrolluar në fillim të lakut. Prandaj, nëse vlera e parë iFib_Next Nëse do të kishte më shumë se 1000, atëherë cikli nuk do të ekzekutohej kurrë.

Një mënyrë tjetër për të zbatuar një lak Bej Nderkohe - vendoseni kushtin jo në fillim, por në fund të lakut. Në këtë rast, cikli do të ekzekutohet të paktën një herë, pavarësisht nëse kushti plotësohet.

Skematikisht, një cikël i tillë Bej Nderkohe me kushtin që do të kontrollohet në fund do të duket kështu:

Bëni ... Loop Ndërsa iFib_Next < 1000

Cikl «Bëje Deri» në Visual Basic

Cikël Bëni Deri shumë e ngjashme me ciklin Bej Nderkohe: blloku i kodit në trupin e lakut ekzekutohet pa pushim derisa të plotësohet kushti i specifikuar (rezultati i shprehjes së kushtëzuar është I vërtetë). Në procedurën e radhës Sub duke përdorur një cikël Bëni Deri merrni vlerat nga të gjitha qelizat në një kolonë A fletë pune derisa kolona të ndeshet me një qelizë boshe:

iRow = 1 Bëje deri në IsEmpty(Cells(iRow, 1)) 'Vlera e qelizës aktuale ruhet në grupin dCellValues ​​dCellValues(iRow) = Cells(iRow, 1).Vlera iRow = iRow + 1 lak

Në shembullin e mësipërm, kushti Është Bosh (Qelizat (iRow, 1)) ndodhet në fillim të strukturës Bëni Deri, kështu që cikli do të ekzekutohet të paktën një herë nëse qeliza e parë e marrë nuk është bosh.

Megjithatë, siç tregohet në shembujt e ciklit Bej Nderkohe, në disa situata është e nevojshme që cikli të ekzekutohet të paktën një herë, pavarësisht nga rezultati fillestar i shprehjes së kushtëzuar. Në këtë rast, shprehja e kushtëzuar duhet të vendoset në fund të ciklit, si kjo:

Bëj ... Loop Deri Is Empty (Cells(iRow, 1))

Lini një Përgjigju