Loops an VBA

Et gi Situatiounen, wann e VBA Programm erfuerderlech ass fir dee selwechte Set vun Aktiounen e puer Mol hannereneen auszeféieren (dat ass, de selwechte Codeblock e puer Mol widderhuelen). Dëst kann mat VBA Loops gemaach ginn.

VBA Loops enthalen:

Als nächst wäerte mir all eenzel vun dësen Zyklen méi genau kucken.

Fir Loop Operator an Visual Basic

D'Struktur vum Loopoperateur d' an Visual Basic kann an enger vun zwou Formen organiséiert ginn: als Loop Fir ... Nächst oder als Loop Fir all.

Zyklus "Fir ... Nächst"

Cycle Fir ... Nächst benotzt eng Variabel déi sequenziell Wäerter aus engem bestëmmte Beräich hëlt. Mat all Ännerung vum Wäert vun der Variabel ginn d'Aktiounen, déi am Kierper vum Zyklus zougemaach sinn, ausgefouert. Dëst ass einfach ze verstoen aus engem einfache Beispill:

Fir i = 1 Ze 10 Ganzen = Ganzen + iArray (i) Next i

An dësem einfache Loop Fir ... Nächst Variabel benotzt gëtt i, déi sequenziell d'Wäerter 1, 2, 3, ... 10 hëlt, a fir all dës Wäerter gëtt de VBA Code an der Loop ausgefouert. Also summéiert dës Loop d'Elementer vun der Array. iArray an variabelen Ganzen.

Am uewe genannte Beispill gëtt de Loop-Inkrement net spezifizéiert, also fir d'Variabel ze erhéijen i vun 1 op 10, ass de Standard en Inkrement 1... Wéi och ëmmer, an e puer Fäll ass et néideg verschidde Inkrementwäerter fir d'Loop ze benotzen. Dëst kann mam Schlësselwuert gemaach ginn Schrëttwéi an der folgender einfach Beispill gewisen.

Fir d = 0 Ze 10 Schrëtt 0.1 dTotal = dTotal + d Next d

Zënter dem uewe genannte Beispill ass den Inkrementschrëtt gläich gesat 0.1, dann d'Variabel d Gesamt fir all Widderhuelung vum Zyklus hëlt d'Wäerter 0.0, 0.1, 0.2, 0.3, ... 9.9, 10.0.

Fir de Loop Schrëtt am VBA ze bestëmmen, kënnt Dir en negativen Wäert benotzen, zum Beispill, wéi dëst:

Fir i = 10 Ze 1 Schrëtt -1 iArray (i) = ech Next i

Hei ass d'Erhéijung -1, also d'Variabel i mat all Widderhuelung vum Zyklus hëlt d'Wäerter 10, 9, 8, ... 1.

Loop "Fir Jiddereen"

Cycle Fir all ähnlech zu engem Zyklus Fir ... Nächst, awer amplaz iwwer d'Sequenz vu Wäerter fir d'Kontervariabel ze iteréieren, d'Loop Fir all mécht eng Rei vun Aktiounen fir all Objet an der spezifizéierter Grupp vun Objeten. Am folgende Beispill benotzt eng Loop Fir all enumeréiert all Blieder am aktuellen Excel-Aarbechtsbuch:

Dim wSheet Als Worksheet Fir All wSheet an Worksheets MsgBox "Найден лист: " & wSheet.Name Next wSheet

Loop Ënnerbriechung Ausso "Exit Fir"

Betreiber Ausfahrt fir benotzt fir den Zyklus ze ënnerbriechen. Soubal dës Ausso am Code begéint ass, schléisst de Programm d'Ausféierung vun der Loop a geet op d'Ausféierung vun den Aussoen, déi am Code sinn direkt no dëser Loop. Dëst kann zum Beispill benotzt ginn fir no engem spezifesche Wäert an enger Array ze sichen. Fir dëst ze maachen, mat enger Loop, gëtt all Element vun der Array gescannt. Soubal dat néidegt Element fonnt gëtt, ass et net néideg fir de Rescht ze kucken - den Zyklus gëtt ënnerbrach.

Bedreiwer Applikatioun Ausfahrt fir am folgende Beispill bewisen. Hei iteréiert d'Loop iwwer 100 Array Entréen a vergläicht jidderee mam Wäert vun der Variabel dVal... Wann e Match fonnt gëtt, da gëtt d'Loop ofgeschloss:

Fir i = 1 bis 100 Wann dValues(i) = dVal Dann IndexVal = i Exit Fir Enn Wann Next i

D'Do While Loop an Visual Basic

Cycle Maacht während fiert e Block vu Code aus soulaang déi spezifizéiert Konditioun erfëllt ass. Déi folgend ass e Beispill vun enger Prozedur sub, an deem d'Loop benotzt Maacht während Fibonacci Zuelen net méi wéi 1000 ginn sequenziell ugewisen:

'Sub Prozedur gëtt Fibonacci Zuelen net méi wéi 1000 Sub Fibonacci() Dim i As Integer' Konter fir d'Positioun vum Element an der Sequenz unzeginn Dim iFib As Integer 'späichert den aktuelle Wäert vun der Sequenz Dim iFib_Next As Integer 'späichert den nächste Wäert vun der Sequenz Dim iStep As Integer 'späichert d'Gréisst vum nächsten Inkrement' Verännerlechen initialiséieren i an iFib_Next i = 1 iFib_Next = 0 'Do While Loop wäert ausféieren bis de Wäert vun 'aktueller Fibonacci Zuel méi grouss ass wéi 1000 Do Während iFib_Next <1000 Wann i = 1 Dann 'speziell Fall fir éischt Element iStep = 1 iFib = 0 Anescht 'späichert d'Gréisst vum nächsten Inkrement ier Dir den aktuelle Wäert vun der Sequenz iwwerschreift iStep = iFib iFib = iFib_Next End Wann 'Dréckt déi aktuell Fibonacci Nummer an der Kolonn A vun den aktiven Aarbechtsblat 'an der Zeil mat Index i Zellen (i, 1). Value = iFib 'berechent déi nächst Fibonacci Zuel an erhéicht den Element Positioun Index vun 1 iFib_Next = iFib + iStep i = i + 1 Loop End Sub

Am uginn Beispill, d'Konditioun iFib_Next < 1000 am Ufank vun der Loop iwwerpréift. Dofir, wann den éischte Wäert iFib_Next Wann et méi wéi 1000 wier, da géif d'Loop ni ausgefouert ginn.

Eng aner Manéier fir eng Loop ëmzesetzen Maacht während - Plaz d'Konditioun net am Ufank, mee um Enn vun der Loop. An dësem Fall gëtt d'Loop op d'mannst eemol ausgefouert, egal ob d'Konditioun erfëllt ass.

Schematesch, esou en Zyklus Maacht während mat der Bedingung déi um Enn iwwerpréift gëtt, wäert esou ausgesinn:

Maacht ... Loop Während iFib_Next < 1000

Цикл "Do Bis" an Visual Basic

Cycle Maacht bis ganz ähnlech dem Zyklus Maacht während: de Block vum Code am Kierper vun der Loop gëtt ëmmer erëm ausgefouert bis déi spezifizéiert Konditioun erfëllt ass (d'Resultat vum bedingten Ausdrock ass richteg). An der nächster Prozedur sub mat engem Zyklus Maacht bis recuperéieren Wäerter aus all Zellen an enger Kolonn A Aarbechtsblat bis d'Kolonn eng eidel Zelle begéint:

iRow = 1 Do Bis IsEmpty (Cells (iRow, 1)) 'De Wäert vun der aktueller Zell gëtt an der Array gespäichert dCellValues ​​​​dCellValues ​​(iRow) = Zellen (iRow, 1). Value iRow = iRow + 1 Loop

Am Beispill uewen, d'Konditioun IsEmpty(Cells(iRow, 1)) um Ufank vun der Struktur läit Maacht bis, sou datt d'Loop op d'mannst eemol ausgefouert gëtt, wann déi éischt Zell, déi geholl gëtt, net eidel ass.

Wéi och ëmmer, wéi an de Loop Beispiller gewisen Maacht während, an e puer Situatiounen ass et néideg datt d'Loop op d'mannst eemol ausgefouert gëtt, onofhängeg vum initialen Resultat vum bedingte Ausdrock. An dësem Fall soll de bedingte Ausdrock um Enn vun der Loop plazéiert ginn, sou:

Maacht ... Loop Bis IsEmpty(Cells(iRow, 1))

Hannerlooss eng Äntwert