Loops VBA-ում

Կան իրավիճակներ, երբ VBA ծրագրից պահանջվում է մի քանի անգամ անընդմեջ կատարել նույն գործողությունների փաթեթը (այսինքն՝ մի քանի անգամ կրկնել նույն կոդի բլոկը): Դա կարելի է անել VBA օղակների միջոցով:

VBA օղակները ներառում են.

Հաջորդը, մենք ավելի մանրամասն կանդրադառնանք այս ցիկլերից յուրաքանչյուրին:

Loop օպերատորի համար Visual Basic-ում

Օղակային օպերատորի կառուցվածքը The Visual Basic-ում կարող է կազմակերպվել երկու ձևերից մեկով՝ որպես օղակ Համար… Հաջորդը կամ որպես օղակ Յուրաքանչյուրի համար.

«Հաջորդի համար» ցիկլը

ցիկլ Համար… Հաջորդը օգտագործում է փոփոխական, որը հաջորդաբար վերցնում է արժեքներ տվյալ տիրույթից: Փոփոխականի արժեքի յուրաքանչյուր փոփոխությամբ կատարվում են ցիկլի մարմնում պարփակված գործողությունները։ Սա հեշտ է հասկանալ պարզ օրինակից.

i = 1-ից 10-ի համար Ընդհանուր = Ընդհանուր + iArray(i) Հաջորդ i

Այս պարզ օղակում Համար… Հաջորդը փոփոխական օգտագործվում է i, որը հաջորդաբար վերցնում է 1, 2, 3, … 10 արժեքները, և այս արժեքներից յուրաքանչյուրի համար կատարվում է օղակի ներսում գտնվող VBA կոդը: Այսպիսով, այս օղակն ամփոփում է զանգվածի տարրերը։ iArray փոփոխականի մեջ Ընդհանուր.

Վերոնշյալ օրինակում հանգույցի աճը նշված չէ, ուստի փոփոխականը մեծացնելու համար i 1-ից 10-ը, կանխադրվածը հավելում է 1… Այնուամենայնիվ, որոշ դեպքերում անհրաժեշտ է օգտագործել տարբեր աճող արժեքներ օղակի համար: Դա կարելի է անել՝ օգտագործելով հիմնաբառը Քայլինչպես ցույց է տրված հետևյալ պարզ օրինակում.

d = 0-ից 10-ի համար Քայլ 0.1 dTotal = dTotal + d Հաջորդ d

Քանի որ վերը նշված օրինակում աճող քայլը հավասար է 0.1, ապա փոփոխականը dԸնդամենը ցիկլի յուրաքանչյուր կրկնության համար ստանում են 0.0, 0.1, 0.2, 0.3,… 9.9, 10.0 արժեքները:

VBA-ում հանգույցի քայլը որոշելու համար կարող եք օգտագործել բացասական արժեք, օրինակ, այսպես.

For i = 10 To 1 Step -1 iArray(i) = i Հաջորդ i

Ահա աճը -1, ուրեմն փոփոխականը i ցիկլի յուրաքանչյուր կրկնությամբ ստանում են 10, 9, 8, … 1 արժեքներ:

Օղակ «Յուրաքանչյուրի համար»

ցիկլ Յուրաքանչյուրի համար նման է ցիկլի Համար… Հաջորդը, բայց հաշվիչի փոփոխականի, հանգույցի արժեքների հաջորդականության վրա կրկնելու փոխարեն Յուրաքանչյուրի համար կատարում է գործողությունների մի շարք օբյեկտների նշված խմբի յուրաքանչյուր օբյեկտի համար: Հետևյալ օրինակում, օգտագործելով հանգույց Յուրաքանչյուրի համար թվարկում է բոլոր թերթերը ընթացիկ Excel աշխատանքային գրքում.

Մութ wSheet-ը որպես աշխատանքային թերթիկ յուրաքանչյուր wsheet-ի համար աշխատանքային թերթերում MsgBox «Найден лист:» & wSheet.Name Հաջորդ wSheet

Օղակի ընդհատման հայտարարություն «Ելք համար»

օպերատոր Ելք For օգտագործվում է ցիկլը ընդհատելու համար: Հենց որ այս հայտարարությունը հանդիպում է կոդում, ծրագիրը ավարտում է հանգույցի կատարումը և անցնում է այն հայտարարությունների կատարմանը, որոնք գտնվում են կոդի մեջ այս հանգույցից անմիջապես հետո: Սա կարող է օգտագործվել, օրինակ, զանգվածում որոշակի արժեք որոնելու համար: Դա անելու համար, օգտագործելով հանգույց, զանգվածի յուրաքանչյուր տարր սկանավորվում է: Հենց որ անհրաժեշտ տարրը գտնվի, մնացածը նայելու կարիք չկա. ցիկլը ընդհատվում է:

Օպերատորի դիմում Ելք For ցույց է տրված հետևյալ օրինակում. Այստեղ օղակը կրկնում է ավելի քան 100 զանգվածի գրառում և յուրաքանչյուրը համեմատում է փոփոխականի արժեքի հետ dVal… Եթե համընկնում է գտնվել, ապա հանգույցն ավարտվում է.

i = 1-ից 100-ի համար, եթե dValues(i) = dVal, ապա IndexVal = i Ելք վերջի համար, եթե հաջորդը i

Do while օղակը Visual Basic-ում

ցիկլ Արեք մինչ այդ կատարում է կոդի բլոկ, քանի դեռ նշված պայմանը բավարարված է: Ստորև բերված է ընթացակարգի օրինակ Sub, որում օգտագործելով հանգույցը Արեք մինչ այդ Ֆիբոնաչիի թվերը, որոնք չեն գերազանցում 1000-ը, ցուցադրվում են հաջորդաբար.

«Ենթակարգ պրոցեդուրան թողարկում է 1000-ը չգերազանցող Ֆիբոնաչիի թվեր, որոնք չեն գերազանցում 1-ը Sub Fibonacci() Dim i As Integer «հաշվիչը՝ նշելու տարրի դիրքը հաջորդականության մեջ Dim iFib As Integer «պահպանում է հաջորդականության ընթացիկ արժեքը Dim iFib_Next Քանի որ ամբողջ թիվը» պահպանում է հաջորդ արժեքը: հաջորդականության Dim iStep Քանի որ ամբողջ թիվը 'պահպանում է հաջորդ աճի չափը' սկզբնավորել փոփոխականները i և iFib_Next i = 0 iFib_Next = 1000 'Do while օղակը կգործի այնքան ժամանակ, մինչև «ընթացիկ Ֆիբոնաչիի համարի արժեքը լինի 1000-ից մեծ, Do while iFib_Next < 1 If i = 1 Այնուհետև «հատուկ դեպք առաջին տարրի համար iStep = 0 iFib = 1 Այլապես «պահեք հաջորդ աճի չափը նախքան «հաջորդականության ընթացիկ արժեքը iStep = iFib iFib = iFib_Next End Եթե «տպեք ընթացիկ Ֆիբոնաչիի համարը A սյունակում: ակտիվ աշխատաթերթը «i ինդեքսով տողում Բջիջներ (i, 1): Արժեք = iFib «հաշվիր հաջորդ Ֆիբոնաչիի թիվը և ավելացրեք տարրի դիրքի ինդեքսը 1-ով iFib_Next = iFib + iStep i = i + XNUMX Loop End Sub

Տրված օրինակում պայմանը iFib_Next < 1000 ստուգվել է օղակի սկզբում: Հետեւաբար, եթե առաջին արժեքը iFib_Next Եթե ​​1000-ից ավելի լինեին, ապա օղակը երբեք չէր կատարվի:

Օղակ իրականացնելու ևս մեկ միջոց Արեք մինչ այդ - դրեք պայմանը ոչ թե օղակի սկզբում, այլ վերջում: Այս դեպքում օղակը կիրականացվի առնվազն մեկ անգամ՝ անկախ պայմանը բավարարված լինելուց:

Սխեմատիկորեն նման ցիկլ Արեք մինչ այդ վերջում ստուգվելիք պայմանով այսպիսի տեսք կունենա.

Կատարեք ... Loop while iFib_Next < 1000

Կիկլ «Արա մինչև» Visual Basic-ում

ցիկլ Արեք մինչև շատ նման է ցիկլի Արեք մինչ այդ: հանգույցի մարմնի կոդի բլոկը կատարվում է նորից ու նորից, մինչև նշված պայմանը բավարարվի (պայմանական արտահայտության արդյունքը. Ճիշտ) Հաջորդ ընթացակարգում Sub օգտագործելով ցիկլը Արեք մինչև առբերեք արժեքները սյունակի բոլոր բջիջներից A աշխատանքային թերթիկ, մինչև սյունակը չհանդիպի դատարկ բջիջի.

iRow = 1 Do Until IsEmpty(Cells(iRow, 1)) 'Ընթացիկ բջիջի արժեքը պահվում է զանգվածում dCellValues ​​dCellValues(iRow) = Cells(iRow, 1): Value iRow = iRow + 1 Loop

Վերոնշյալ օրինակում պայմանը IsEmpty (Բջիջներ (iRow, 1)) գտնվում է կառույցի սկզբում Արեք մինչև, այնպես որ հանգույցը կկատարվի առնվազն մեկ անգամ, եթե առաջին վերցված բջիջը դատարկ չէ:

Այնուամենայնիվ, ինչպես ցույց է տրված հանգույցի օրինակներում Արեք մինչ այդ, որոշ իրավիճակներում անհրաժեշտ է, որ օղակը կատարվի առնվազն մեկ անգամ՝ անկախ պայմանական արտահայտության սկզբնական արդյունքից։ Այս դեպքում պայմանական արտահայտությունը պետք է տեղադրվի օղակի վերջում, այսպես.

Կատարեք ... Հանգիստ մինչև դատարկ լինի (Cells (iRow, 1))

Թողնել գրառում