Loops nan VBA

Gen sitiyasyon lè yon pwogram VBA oblije fè menm seri aksyon plizyè fwa nan yon ranje (sa vle di, repete menm blòk kòd la plizyè fwa). Sa a ka fè lè l sèvi avèk bouk VBA.

Bouk VBA yo enkli:

Apre sa, nou pral pran yon gade pi pre nan chak nan sik sa yo.

Pou Operatè Loop nan Visual Basic

Estrikti operatè bouk la Jounal nan Visual Basic ka òganize nan youn nan de fòm: kòm yon bouk Pou… Next oswa kòm yon bouk Pou chak.

Fè sik "Pou ... Next"

Sik Pou… Next sèvi ak yon varyab ki sekans pran valè nan yon seri bay yo. Avèk chak chanjman nan valè varyab la, aksyon ki fèmen nan kò sik la fèt. Sa a se fasil pou konprann nan yon egzanp senp:

Pou i = 1 A 10 Total = Total + iArray(i) Next i

Nan bouk senp sa a Pou… Next varyab yo itilize i, ki sekansyèlman pran valè yo 1, 2, 3, ... 10, epi pou chak nan valè sa yo, kòd VBA anndan bouk la egzekite. Kidonk, bouk sa a sòm eleman yo nan etalaj la. iArray nan varyab Total.

Nan egzanp ki anwo a, enkreman nan bouk pa espesifye, kidonk ogmante varyab la i soti nan 1 a 10, default la se yon enkreman 1… Sepandan, nan kèk ka li nesesè yo sèvi ak diferan valè enkreman pou bouk la. Sa a ka fè lè l sèvi avèk mo kle a Etapjan yo montre nan egzanp senp sa a.

Pou d = 0 A 10 Etap 0.1 dTotal = dTotal + d Next d

Depi nan egzanp ki anwo a, etap enkreman an mete egal a 0.1, Lè sa a, varyab la dTotal pou chak repetisyon sik la pran valè 0.0, 0.1, 0.2, 0.3,... 9.9, 10.0.

Pou detèmine etap la bouk nan VBA, ou ka itilize yon valè negatif, pou egzanp, tankou sa a:

Pou i = 10 Pou 1 Etap -1 iArray(i) = i Next i

Isit la enkreman an se -1, se konsa varyab la i ak chak repetisyon nan sik la pran valè 10, 9, 8, ... 1.

Bouk "Pou chak"

Sik Pou chak menm jan ak yon sik Pou… Next, men olye pou yo repete sou sekans valè pou varyab vann san preskripsyon an, bouk la Pou chak fè yon seri aksyon pou chak objè nan gwoup la espesifye nan objè yo. Nan egzanp sa a, lè l sèvi avèk yon bouk Pou chak Enimere tout fèy nan liv travay Excel aktyèl la:

Dim wSheet Kòm Fèy Travay pou Chak wSheet nan Fichye MsgBox "Найден лист: " & wSheet.Name Next wSheet

Bouk entèwonp deklarasyon "Soti pou"

Operatè Sòti Pou itilize pou entèwonp sik la. Le pli vit ke deklarasyon sa a rankontre nan kòd la, pwogram nan fini ekzekisyon an nan bouk la ak montan nan ekzekisyon an nan deklarasyon yo ki nan kòd la imedyatman apre sa a bouk. Sa a ka itilize, pou egzanp, pou chèche yon valè espesifik nan yon etalaj. Pou fè sa, lè l sèvi avèk yon bouk, chak eleman nan etalaj la analize. Le pli vit ke yo jwenn eleman ki nesesè yo, pa gen okenn bezwen gade nan rès la - se sik la koupe.

Aplikasyon operatè Sòti Pou demontre nan egzanp sa a. Isit la bouk la repete plis pase 100 antre etalaj epi konpare chak ak valè varyab la dVal… Si yo jwenn yon match, lè sa a bouk la sispann:

Pou i = 1 Pou 100 Si dValues(i) = dVal Lè sa a, IndexVal = i Sòti pou Fen Si Next i

Do While Loop la nan Visual Basic

Sik Fè pandan egzekite yon blòk nan kòd osi lontan ke kondisyon an espesifye satisfè. Sa ki anba la a se yon egzanp yon pwosedi Gwoup, nan ki itilize bouk la Fè pandan Nimewo Fibonacci ki pa depase 1000 yo parèt sekans:

'Sub pwosedi pwodui nimewo Fibonacci ki pa depase 1000 Sub Fibonacci() Dim i As Integer 'kontwa pou endike pozisyon eleman an nan sekans Dim iFib As Integer 'sere valè aktyèl la nan sekans Dim iFib_Next Kòm Integer 'store pwochen valè a. nan sekans Dim iStep Kòm Integer 'magazen gwosè nan pwochen enkreman' inisyalize varyab i ak iFib_Next i = 1 iFib_Next = 0 'Do While boucle pral egzekite jiskaske valè 'nmewo Fibonacci aktyèl la pi gran pase 1000 Fè Pandan iFib_Next < 1000 Si i = 1 Lè sa a, 'ka espesyal pou premye eleman iStep = 1 iFib = 0 Sinon 'sove gwosè pwochen enkreman an anvan ou ranplase 'valè aktyèl la nan sekans iStep = iFib iFib = iFib_Next End If' enprime nimewo Fibonacci aktyèl la nan kolòn A nan Fèy travay la aktif 'nan ranje a ak endèks i Selil (i , 1).Valè = iFib 'kalkile pwochen nimewo Fibonacci ak ogmante endèks la pozisyon eleman pa 1 iFib_Next = iFib + iStep i = i + 1 Loop End Sub

Nan egzanp yo bay la, kondisyon an iFib_Next <1000 tcheke nan kòmansman bouk la. Se poutèt sa, si valè an premye iFib_Next Si te gen plis pase 1000, Lè sa a, bouk la pa ta janm dwe egzekite.

Yon lòt fason pou aplike yon bouk Fè pandan - mete kondisyon an pa nan kòmansman an, men nan fen bouk la. Nan ka sa a, bouk la pral egzekite omwen yon fwa, kèlkeswa si kondisyon an satisfè.

Schematically, tankou yon sik Fè pandan ak kondisyon yo dwe tcheke nan fen a pral sanble sa a:

Fè ... Bouk Pandan iFib_Next < 1000

Цикл «Do Until» nan Visual Basic

Sik Fè Jiskaske trè menm jan ak sik Fè pandan: blòk kòd la nan kò bouk la egzekite sou yo ak sou ankò jiskaske kondisyon espesifye a satisfè (rezilta ekspresyon kondisyonèl la se Vrè). Nan pwochen pwosedi a Gwoup lè l sèvi avèk yon sik Fè Jiskaske rekipere valè nan tout selil nan yon kolòn A Fèy travay jiskaske kolòn nan rankontre yon selil vid:

iRow = 1 Do Until IsEmpty(Cells(iRow, 1)) 'Valè selil aktyèl la estoke nan etalaj dCellValues ​​​​dCellValues(iRow) = Cells(iRow, 1).Valè iRow = iRow + 1 Loop.

Nan egzanp ki anwo a, kondisyon an Se Vide(Selil(iRow, 1)) sitiye nan kòmansman an nan estrikti a Fè Jiskaske, kidonk bouk la pral egzekite omwen yon fwa si premye selil ki pran an pa vid.

Sepandan, jan yo montre nan egzanp bouk yo Fè pandan, nan kèk sitiyasyon li nesesè ke bouk la dwe egzekite omwen yon fwa, kèlkeswa rezilta inisyal la nan ekspresyon an kondisyonèl. Nan ka sa a, ekspresyon kondisyonèl yo ta dwe mete nan fen bouk la, tankou sa a:

Fè ... Bouk jiskaske Vide(Selil(iRow, 1))

Kite yon Reply