Operatori de buclă în vba. Bucle VBA. Declarații Continuare și Ieșire

28.03.2020 Știri

Algoritmul For….Next ciclu este prezentat în Fig. 5.28.

Tejghea – orice variabilă numerică VBA, de obicei o variabilă Integer sau Long.

start - orice expresie numerică determină valoarea initiala pentru variabila Counter.

Sfârşit – o expresie numerică care determină valoarea finală pentru o variabilă Tejghea .

Declarații – unul, mai mulți sau niciun operator. Aceste instrucțiuni execută corpul buclei. VBA execută fiecare dintre aceste instrucțiuni de fiecare dată când bucla este executată.

Cuvânt cheie Următorul

Counter=counter+StepSise

Fig.9.28. Pentru….Algoritmul buclei următoare

Cuvânt cheie Următorul spune VBA că sfârșitul buclei a fost atins. Opțional Variabila contor după cuvânt cheie Următoarea trebuie să fie aceeași variabilă Counter care a fost specificată după cuvântul cheie For la începutul structurii buclei.

Sintaxă:

Pentru contor = Start To End

La executarea unei buclePentruUrmătorul VBAprocedează după cum urmează:

Atribuie valoarea reprezentată de Stea , variabil CU mătușă .

Execută toate instrucțiunile reprezentate de Declarații până ajunge la cuvântul cheie Următorul . Cuvânt cheie Următorul indică VBA că a fost atins capătul corpului buclei.

Modifică o variabilă CU mătușă prin suma StepSize (dacă este inclus cuvântul opțional Step) Dacă Step nu este definit, atunci VBA crește variabila contor cu 1.

Revine la începutul buclei și compară valoarea curentă a variabilei CU mătușă cu valoarea reprezentată de End. Dacă valoarea CU mătușă mai putin decat valoarea Sfârşit , VBA continuă execuția de la prima instrucțiune după cuvântul cheie Următorul .

9.2.4. I/O de tablouri unidimensionale și bidimensionale

matrice(matrice) este o colecție de variabile care au un nume și un tip de bază comun. O matrice este o modalitate convenabilă de a stoca mai multe elemente de date asociate într-un singur container pentru o mai mare comoditate și eficiență de programare. Toate elementele de date stocate într-o matrice trebuie să fie de același tip.

O matrice vă permite să stocați și să manipulați multe elemente de date printr-o singură variabilă. Pe lângă reducerea numărului total de nume de variabile diferite care trebuie urmărite, celălalt avantaj principal al utilizării tablourilor este că buclele pot fi folosite pentru a procesa cu ușurință diferite elemente ale matricei. Combinând tablouri și structuri de buclă (de obicei For....Next), puteți scrie un număr mic de instrucțiuni care procesează o cantitate mare de date. Efectuarea acelorași sarcini folosind variabile individuale poate necesita scrierea a sute de declarații.

Dimensiunea matricei

Limbajul de programare utilizează de obicei matrice unidimensionale și multidimensionale, dintre care unele descriu obiecte relativ simple, iar altele mai complexe.

Matrice unidimensionale

Un exemplu de matrice unidimensională este dat în tabelul nr. 9.9.

Tabelul nr. 9.9

În programare, numerotarea pe bază de zero este frecvent utilizată.

Pentru a accesa datele stocate într-un anumit element de matrice, trebuie să specificați numele matricei urmat de un număr numit index de element. Indexul este cuprins între paranteze. De exemplu, dacă tabloul din tabelul #1.1 este numit DoubleArray, atunci următoarea instrucțiune atribuie numărul 45 variabilei DoubleAny.

DoubleAny = DoubleArray (3)

În această declarație, numărul 3 este indexul matricei. Deoarece numerotarea elementelor începe de la zero, elementul referit de operator este, de fapt, al patrulea element al DoubleArray.

La executarea instrucțiunii DoubleArray, VBA selectează valoarea 45 și stochează acea valoare în variabila DoubleArray.

Același operator poate fi utilizat atunci când stocați date într-o matrice:

DoubleArray (5)=12.

Când această instrucțiune este executată, VBA plasează valoarea 12 în elementul de matrice specificat, înlocuind conținutul anterior al acelui element.

Matricele unidimensionale sunt utilizate în mod obișnuit pentru a reprezenta diverse liste de date.

Matrice multidimensionale

Atunci când este necesar să se reprezinte tabele de date cu date organizate în format de rânduri și coloane, pentru aceasta se folosesc matrice multidimensionale.

Într-o matrice bidimensională, adresa fiecărei celule este formată din două numere: numărul rândului (primul index) și numărul coloanei (al doilea indice). În VBA puteți crea matrice de până la 60 de dimensiuni.

Dacă numărul de elemente dintr-o matrice nu se modifică, atunci o astfel de matrice se numește static.

Matrice statice și dinamice

Dacă, atunci când executați un program VBA, puteți modifica numărul de elemente dintr-o matrice, atunci astfel de matrice se numesc dinamice. Pentru a modifica dimensiunea unui tablou dinamic, utilizați operatorul ReDim.

VBA menține o zonă de memorie rezervată pentru toate elementele dintr-o matrice atâta timp cât există variabila de tip matrice. Astfel de matrice sunt numite statice deoarece numărul de elemente din matrice nu se modifică.

OperatorOpțiune Baza

De obicei, VBA utilizează matrice bazată pe zero. Operatorul de bază de opțiuni vă permite să specificați 0 sau 1 ca sămânță implicită pentru indici de matrice. Dacă operatorul Opțiune Baza nu este utilizat, VBA începe numerotarea indexului de la 0 (implicit). Trebuie să plasați instrucțiunea Option Base în zona de declarare a modulului înainte de a declara orice variabile, constante sau proceduri. Nu puteți plasa o instrucțiune Option Base într-o procedură. Puteți avea doar o declarație de bază de opțiuni per modul.

Sintaxă:

Opțiune Baza 0|1

Declararea Arrays

Declararea unui tablou folosind un operator Dim are următoarea sintaxă.

Sintaxă:

DimVarName()

Dim VarName (sus, sus]....)[ La fel de tip],

VarName – orice nume pentru matrice care îndeplinește regulile VBA pentru denumirea identificatorilor.

Indice – dimensiunea matricei.

Ca tip – tipul de date.

Inferioară – limita inferioară a valorii indicelui.

Superioară – limita superioară a valorii indicelui.

Tip – tip de date

Dacă omiteți tipul, toate elementele matricei vor fi de tipul Variant. VBA inițializează elementele matricelor numerice la zerouri și elementele matricelor de șiruri în șiruri de caractere goale.

Dim str_array (de la 1 la 100) ca șir

Dim variant_array()

Dim str_Multiplication (0 la 15, 0 la 15) ca șir

Utilizarea Arrays

Pentru a accesa un element de matrice, trebuie să specificați numele matricei urmat de valoarea indexului, cuprins între paranteze.

Referirea la un element de matrice are următoarea sintaxă.

Sintaxă.

arrayName(validIndex1, ….)

validIndex – numele matricei.

validIndex1 – valoare de index validă pentru prima dimensiune a matricei.

validIndex2 – valoare de index validă pentru a doua dimensiune a matricei.

Trebuie să furnizați o valoare de index pentru fiecare dimensiune a matricei ori de câte ori accesați orice element al matricei.

I/O de tablouri unidimensionale

Când introduceți o matrice unidimensională, trebuie să introduceți secvențial primul, al doilea etc. elementele matricei acționează în mod similar la ieșire. Pentru a introduce sau a ieși o matrice, trebuie să organizați o buclă. Cea mai convenabilă modalitate de a introduce și ieși o matrice unidimensională este utilizarea unui algoritm care utilizează o buclă necondiționată.

Algoritmul de intrare/ieșire pentru o matrice unidimensională este prezentat în Fig. 5.29.

Procedura este explicată mai jos.

Sub Massiv() – numele procedurii.

Dim Mas (5) As Integer - declarat o matrice unidimensională cu 5 elemente, tipul numerelor este numere întregi.

Dim s As String – a declarat o variabilă de lucru pentru ieșirea finală a datelor din matrice în caseta de dialog. As String – tip de date din variabila de stocare.

For i = 1 To 5 – procedura din prima buclă For….Next preia numere întregi de la 1 la 5 și le pune într-o matrice.

Mas (i) = InputBox (i) – intrarea unui număr întreg pentru al-lea element.

Următorul – trecerea la al doilea ciclu (elementele matricei sunt introduse într-o linie și afișate într-o casetă de dialog folosind operatorul MsgBox).

Pentru i = 1 până la 5 – elemente din rândul 1 până la 5.

s = s & Mas(i) & “ ;” - formarea unui șir din elemente de matrice. Matricea este imprimată pe o singură linie. Elementele matricei sunt separate prin caracterul „;”.

MsgBox s – ieșirea matricei introduse anterior.

Fig.5.27. Algoritm de intrare-ieșire unidimensional

Orez. 9.29. Algoritm și procedură de intrare-ieșire a unui tablou unidimensional

I/O matrice 2D

Algoritmul și procedura pentru intrarea și ieșirea unui tablou bidimensional sunt prezentate în Fig. 5.30.

Descrierea acestei proceduri:

Sub Massiv() – numele procedurii

Declarația variabilelor care sunt utilizate în această procedură:

Dim Mas (5, 5) As Integer - declarat o matrice bidimensională cu 5 coloane și cinci rânduri, tipul numerelor este numere întregi.

Dim s As String – a declarat o variabilă de lucru pentru ieșirea finală a datelor din matrice în caseta de dialog. As String – tip de date din variabila de stocare

Următorul i – sfârșitul operației de atribuire a variabilelor

Introducerea elementelor de matrice în memoria computerului:

Pentru i = 1 La 5 – intrarea se efectuează de la primul element al primei linii, apoi de la al doilea etc.

Pentru j = 1 La 5 până la sfârșitul primei linii, apoi de la primul element al celei de-a doua linii etc.

Mas(i,j) = InputBox(i,j) – operator pentru introducerea elementelor matricei în memoria computerului

Orez. 9.30. Algoritm și procedură de intrare-ieșire a unui tablou bidimensional

Algoritmi de ordonare a matricei

Ca exemplu, oferim un algoritm și o procedură pentru sortarea unei matrice unidimensionale folosind metoda „bubble”.

Elementele de ieșire ale matricei introduse din memoria computerului:

Pentru i = 1 până la 5 – ieșirea se realizează în același mod ca și intrarea

s = s & Mas (i,j) & “ ; ”

s = s & Chr (13) – line feed (ieșire nu într-o singură linie, ci în mai multe, ca în matricea de intrare)

Următorul i – sfârșitul operatorului For….Next

MsgBox s – scoateți matricea introdusă anterior în caseta de dialog

End Sub – sfârșitul procedurii.

Buclele vă permit să executați una sau mai multe linii de cod de mai multe ori. VBA acceptă următoarele bucle:

Pentru... Următorul Pentru fiecare... Următorul Do... Buclă

Construcția Pentru. . . Următorul. Când numărul de repetări este cunoscut în prealabil, se folosește o buclă For. . . Următorul. O buclă For utilizează o variabilă numită variabilă de buclă sau contor de buclă, care este incrementată sau decrementată cu o valoare specificată de fiecare dată când bucla se repetă. Sintaxa pentru acest construct este următoarea:

Pentru contor = start Pentru a termina operatori Next

Parametrii contor, start, end și increment sunt numerici.

Notă. Parametrul de increment poate fi pozitiv sau negativ. Dacă este pozitiv, parametrul start trebuie să fie mai mic sau egal cu parametrul final, altfel bucla nu se va executa. Dacă incrementul este negativ, atunci începutul trebuie să fie mai mare sau egal cu sfârşitul pentru ca corpul buclei să fie executat. Dacă parametrul Step nu este specificat, valoarea implicită a parametrului de increment este 1.

VBA execută o buclă For în următoarea secvență:

1. Setează valoarea contorului variabilei buclei să înceapă.

2. Compară valoarea contorului variabilei buclei și valoarea parametrului final. Dacă contorul este mai mare, VBA încheie bucla. (Dacă incrementul este negativ, VBA oprește executarea buclei dacă valoarea contorului variabilei buclei este mai mică decât valoarea finalului.)

3. Execută instrucțiunile din corpul buclei de instrucțiuni.

4. Crește valoarea contorului variabilei buclei cu 1 sau cu valoarea parametrului de increment, dacă este specificat.

5. Repetați pașii de la 2 la 4.

Luați în considerare un exemplu: Calculați valoarea funcției f(t)

pentru dat a, b, n, dacă t se schimbă de la a la b cu pasul Dt=(b-a)/(n-1).

Sub example3() Dim f() As Single Dim a As Single, b As Single, t As Single, dt As Single Dim i Ca Integer, n As Integer Call read("a1", a): Call read("b1" , b): Apel read("c1", n) ReDim f(1 To n - 1) dt = (b - a) / (n - 1) : t = a Call out("a2", "i") : Call out("b2", "t"): Call out("c2", "f(t)") Pentru i = 1 To n - 1 t = t + dt Dacă t<= -1 Then f(i) = -1 ElseIf t >1 Atunci f(i) = 1 Else f(i) = t End If Call out("a" & (2 + i), i): Call out("b" & (2 + i), t): Apel out("c" & (2 + i), f(i)) Next i End Sub

Construcția Pentru fiecare. . . Următorul

Pentru fiecare buclă. . . Next este similar cu o buclă For. . . Apoi, dar repetă un grup de instrucțiuni pentru fiecare element dintr-un set de obiecte sau dintr-o matrice, în loc să repete instrucțiunile de un număr specificat de ori. Este util mai ales atunci când nu se știe câte elemente sunt într-o mulțime.

Sintaxa constructului de buclă For Each. . . Următorul este:

Pentru fiecare element În instrucțiuni de grup Următorul element

Țineți cont de următoarele limitări atunci când utilizați o buclă For Each. . . Următorul:

Pentru seturi, parametrul elementului poate fi doar o variabilă de tip variantă, o variabilă generică de tip obiect sau un obiect listat în Object Browser

Pentru matrice, parametrul element poate fi doar o variabilă de tip Variant

Nu puteți utiliza o buclă For Each. . . Apoi, cu o matrice care are un tip definit de utilizator, deoarece o variabilă de tip variantă nu poate conține o valoare a unui tip definit de utilizator

Faceți... Design bucle

Bucla Do poate fi folosită pentru a executa un bloc de instrucțiuni de un număr nelimitat de ori. Există mai multe variante ale designului Do. . . Buclă, dar fiecare dintre ele evaluează o expresie de condiție pentru a determina când să iasă din buclă. Ca și în cazul constructului If. . . Atunci condiția trebuie să fie o valoare sau o expresie care se evaluează la Fals (zero) sau Adevărat (nu zero).

În construcția următoare, Do. . . Instrucțiunile buclei sunt executate atâta timp cât valoarea condiției este adevărată:

Do While Condition Loop declarații

La executarea acestei bucle, VBA verifică mai întâi condiția. Dacă condiția este False, omite toate instrucțiunile buclei. Dacă este adevărat, VBA execută instrucțiunile buclei, revine la instrucțiunea Do While și testează din nou condiția.

Prin urmare, bucla reprezentată de acest construct poate fi executată de orice număr de ori atâta timp cât valoarea condiției nu este zero sau adevărată. Rețineți că instrucțiunile corpului buclei nu sunt executate nici măcar o dată dacă prima dată când condiția este verificată, se dovedește a fi falsă.

Luați în considerare un exemplu: Calculați suma unei serii

cu o precizie dată.

Sub example4() Dim e As Single, x As Single, s As Single Dim m As Single, p As Single, i As Single Call read("a1", x): Apel read("b1", e) s = 0 : i = 1: m = 1: p = -1 Call out("a2", "i"): Call out("b2", "m"): Call out("c2", "s") Do While Abs(m) >= e p = -p * x m = p / i s = s + m Call out("a" & (2 + i), i): Call out ("b" & (2 + i), Abs (m)): Call out("c" & (2 + i), s) i = i + 1 Loop End Sub

O altă variantă a designului Do. . . Loop execută mai întâi instrucțiunile corpului buclei și apoi verifică condiția după fiecare execuție. Această variație asigură că instrucțiunile buclei sunt executate cel puțin o dată:

Efectuați declarațiile Loop While condiție

Celelalte două variante ale construcției buclei sunt similare cu cele anterioare, cu excepția faptului că bucla este executată în timp ce condiția este falsă:

Bucla nu este executată deloc sau este executată de mai multe ori:

A face până la condiție

Operatori de buclă

Bucla este executată cel puțin o dată:

operatori

Loop Până la stare

7.2 Bucle imbricate.

Puteți plasa structuri de control în interiorul altor structuri de control (de exemplu, un bloc If...Then în interiorul unei bucle For...Next). Se spune că o structură de control plasată în interiorul unei alte structuri de control este imbricată.

Adâncimea de imbricare a structurilor de control în VBA nu este limitată. Pentru a îmbunătăți lizibilitatea codului, se adoptă practica de a muta corpul unui construct sau al unei bucle de luare a deciziilor într-un program atunci când sunt utilizate structuri de control imbricate.

Când una sau mai multe alte bucle sunt imbricate într-o buclă, vorbim de bucle imbricate, care fac diferența între buclele exterioare (înglobate) și cele interioare (imbricate).

Să luăm în considerare un exemplu de însumare a elementelor Aij ale matricei A(n,m) rând cu rând.

Sub example5() Dim a() As Single, s() As Single Dim n As Integer, m As Integer Dim i As Integer, j As Integer Call read("a1", n): Apel read("b1", m ) ReDim a(1 To n, 1 To m), s(1 To n) "Citește matricea Pentru i = 1 To n Pentru j = 1 To m Apelați readcell(i + 1, j, a(i, j)) Următorul j Următorul i „Calcul Pentru i = 1 La n s(i) = 0 Pentru j = 1 La m s(i) = s(i) + a(i, j) Următorul j Apelați celula(i + 1, m + 1) , s(i)) Next i End Sub

Rețineți că prima instrucțiune Next închide bucla interioară For, iar ultima instrucțiune Next închide bucla externă For. De asemenea, pentru instrucțiunile If imbricate, instrucțiunile End If sunt aplicate automat pentru a închide cea mai apropiată instrucțiune If. Structuri imbricate Do. . . Buclele funcționează într-un mod similar: cea mai îndepărtată instrucțiune Loop se potrivește cu cea mai îndepărtată instrucțiune Do.

La introducerea/retragerea elementelor matrice bidimensională la foaia de lucru Microsoft Excel Este convenabil să utilizați proceduri I/O personalizate:

Sub readcell(i Ca Integer, j Ca Integer, val Ca Varianta) val = Sheet1.Cells(i, j).Value End Sub Sub Outcell(i Ca Integer, j Ca Integer, val Ca Varianta) Sheet1.Cells(i, j).Valoare = val End Sub

unde I este numărul rândului, j este numărul coloanei foii de lucru.

Ieșire din structurile de control

Instrucțiunea Exit vă permite să ieșiți direct dintr-o procedură For loop, Do loop, Sub procedură sau Function. Sintaxa instrucțiunii Exit este simplă:

For counter = start To end [bloc de instrucțiuni] [bloc de instrucțiuni] Next Do [(While | Until) condiție] [bloc de instrucțiuni] [bloc de instrucțiuni] Buclă

Ieșire pentruîn interiorul unei bucle For și Exit Do în interiorul unei bucle Do pot apărea de orice număr de ori.

Instrucțiunea Exit Do funcționează cu toate variațiile sintaxei buclei Do.

Instrucțiunile Exit For și Exit Do sunt folosite atunci când doriți să terminați imediat o buclă fără a continua iterații ulterioare sau a aștepta ca un bloc de instrucțiuni din corpul buclei să se finalizeze.

Când utilizați instrucțiunea Exit pentru a ieși dintr-o buclă, valorile variabilei buclei depind de modul în care se termină bucla:

Când o buclă se termină normal, valoarea variabilei buclei este cu o mai mare decât limita superioară a numărului de bucle

Când o buclă se termină prematur, variabila buclă își păstrează valoarea, pe care a primit-o folosind regulile obișnuite

Când bucla se termină la sfârșitul setului, variabila buclă este Nimic dacă este o variabilă de tip obiect sau goală dacă este o variabilă de tip Variant

Există situații în care unui program VBA este necesar să efectueze același set de acțiuni de mai multe ori la rând (adică, repetă același bloc de cod de mai multe ori). Acest lucru se poate face folosind bucle VBA.

For Loop Statement în Visual Basic

Structura instrucțiunii buclei Pentru V Visual Basic poate fi organizat în una din două forme: ca o buclă Pentru următorul sau ca un ciclu Pentru fiecare.

Ciclul „Pentru... Următorul”

Ciclu Pentru următorul folosește o variabilă care preia secvențial valori dintr-un interval dat. La fiecare modificare a valorii variabilei, sunt efectuate acțiunile conținute în corpul buclei. Acest lucru este ușor de înțeles dintr-un exemplu simplu:

Pentru i = 1 până la 10 Total = Total + iArray(i) Următorul i

În această buclă simplă Pentru următorul este utilizată variabila i, care ia secvențial valorile 1, 2, 3, ... 10, iar pentru fiecare dintre aceste valori este executat codul VBA din interiorul buclei. Astfel, această buclă însumează elementele matricei iArrayîntr-o variabilă Total.

În exemplul de mai sus, pasul de incrementare a buclei nu este specificat, deci pentru a incrementa variabila i De la 1 la 10, valoarea implicită este increment 1 . Cu toate acestea, în unele cazuri, este necesar să utilizați valori de increment diferite pentru buclă. Acest lucru se poate face folosind cuvântul cheie Etapa, așa cum se arată în exemplul simplu următor.

Pentru d = 0 la 10 Pasul 0,1 dTotal = dTotal + d Următorul d

Deoarece în exemplul de mai sus, pasul de creștere este setat la 0.1 , apoi variabila dTotal pentru fiecare repetare a ciclului ia valorile 0,0, 0,1, 0,2, 0,3, ... 9,9, 10,0.

Pentru a determina pasul buclei în VBA, puteți utiliza o valoare negativă, de exemplu, astfel:

Pentru i = 10 To 1 Step -1 iArray(i) = i Next i

Aici este pasul de creștere -1 , deci variabila i cu fiecare repetare a ciclului ia valorile 10, 9, 8, ... 1.

Pentru fiecare buclă

Ciclu Pentru fiecare arata ca un ciclu Pentru următorul, dar în loc să parcurgeți secvența de valori pentru variabila contor Pentru fiecare efectuează un set de acțiuni pentru fiecare obiect dintr-un grup specificat de obiecte. În exemplul următor, folosind o buclă Pentru fiecare Sunt listate toate foile din foaia curentă registrul de lucru Excela:

Dim wSheet ca foaie de lucru pentru fiecare wSheet din foile de lucru MsgBox "Sheet Found: " & wSheet.Name Next wSheet

Ieșire pentru operatorul de întrerupere a buclei

Operator Ieșire pentru folosit pentru a întrerupe ciclul. De îndată ce această instrucțiune este întâlnită în cod, programul încheie execuția buclei și trece la executarea instrucțiunilor găsite în cod imediat după această buclă. Aceasta poate fi folosită, de exemplu, pentru a căuta o anumită valoare într-o matrice. Pentru a face acest lucru, utilizați o buclă pentru a căuta prin fiecare element al matricei. Odată ce elementul necesar este găsit, nu mai este nevoie să vă uitați prin restul - ciclul este întrerupt.

Aplicație de operator Ieșire pentru demonstrat în exemplul următor. Aici bucla trece prin 100 de intrări de matrice și compară fiecare cu valoarea variabilei dVal. Dacă se găsește o potrivire, bucla este întreruptă:

Pentru i = 1 până la 100 Dacă dValues(i) = dVal Atunci IndexVal = i Ieșire pentru End If Next i

Faceți bucla While în Visual Basic

Ciclu Face în timp ce execută un bloc de cod atâta timp cât o anumită condiție este îndeplinită. Următorul este un exemplu de procedură Sub, în care, folosind o buclă Face în timp ce Numerele Fibonacci care nu depășesc 1000 sunt afișate secvenţial:

„Procedura Sub tipărește numere Fibonacci care nu depășesc 1000 Sub Fibonacci() Dim i As Integer „un contor pentru a indica poziția unui element în secvența Dim iFib As Integer „stochează valoarea curentă a secvenței Dim iFib_Next As Integer „stochează următoarea valoare a secvenței Dim iStep As Integer „stochează dimensiunea următorului increment „inițializează variabilele i și iFib_Next i = 1 iFib_Next = 0 „bucla Do While va fi executată până când valoarea „numărului actual Fibonacci depășește 1000 Do În timp ce iFib_Next< 1000 If i = 1 Then "особый случай для первого элемента последовательности iStep = 1 iFib = 0 Else "сохраняем размер следующего приращения перед тем, как перезаписать "текущее значение последовательности iStep = iFib iFib = iFib_Next End If "выводим текущее число Фибоначчи в столбце A активного рабочего листа "в строке с индексом i Cells(i, 1).Value = iFib "вычисляем следующее число Фибоначчи и увеличиваем индекс позиции элемента на 1 iFib_Next = iFib + iStep i = i + 1 Loop End Sub

În exemplul dat, condiția iFib_Next< 1000 verificat la începutul ciclului. Prin urmare, dacă prima valoare iFib_Next Dacă ar fi mai mult de 1000, atunci bucla nu ar fi executată nici măcar o dată.

O altă modalitate de a implementa o buclă Face în timp ce– plasați condiția nu la început, ci la sfârșitul buclei. În acest caz, bucla va fi executată cel puțin o dată, indiferent dacă condiția este adevărată.

Schematic un astfel de ciclu Face în timp ce cu condiția verificată la sfârșit, va arăta astfel:

Faceți... Buclă în timp ce iFib_Next< 1000

Faceți până la bucla în Visual Basic

Ciclu Face până la foarte asemănător cu un ciclu Face în timp ce: Blocul de cod din corpul buclei este executat din nou și din nou până când condiția specificată este îndeplinită (rezultatul expresiei condiționate este Adevărat). În procedura următoare Sub folosind o buclă Face până la extrage valori din toate celulele dintr-o coloană A foaie de lucru până când se întâlnește o celulă goală în coloană:

IRow = 1 Do Until IsEmpty(Cells(iRow, 1)) "Valoare celula curentă stocat în matrice dCellValues ​​​​dCellValues(iRow) = Cells(iRow, 1).Valoare iRow = iRow + 1 buclă

În exemplul de mai sus condiția IsEmpty(Celele(iRow, 1)) situat la începutul structurii Face până la, prin urmare, bucla va fi executată cel puțin o dată dacă prima celulă luată nu este goală.

Cu toate acestea, așa cum sa arătat în exemplele de buclă Face în timp ce, în unele situații doriți ca bucla să fie executată cel puțin o dată, indiferent de rezultatul inițial al expresiei condiționate. În acest caz, expresia condiționată ar trebui plasată la sfârșitul buclei, astfel:

Efectuați... Buclă până când este gol(Celele(iRând, 1))

Pe lângă structurile decizionale, există un alt tip de structură de control numită ciclu.

Ciclu este o structură algoritmică cu ajutorul căreia se implementează mai multe repetiții ale blocurilor de operatori.

Există trei tipuri principale de bucle în Visual Basic, care sunt implementate folosind constructele For:Next, Do:Loop și While:Wend.

Pentru: bucla următoare. Folosit atunci când numărul de repetări ale unui anumit bloc de instrucțiuni este cunoscut în prealabil. Acest design arată astfel:

Pentru contor = valoarea inițială Până la valoarea finală Operatori1 Operatori2 Următorul [contor]

Când instrucțiunile de mai sus sunt executate pentru prima dată, variabilei contor i se atribuie o valoare inițială, după care sunt posibile două opțiuni. Dacă în urma verificării contorului de condiție > valoarea finală, se obține valoarea True, atunci bucla se termină, iar blocurile operators1 și operators2 nu sunt niciodată executate. Pe de altă parte, dacă rezultatul testului de condiție este Fals, atunci blocurile de instrucțiuni sunt executate prima dată, după care are loc trecerea la începutul buclei. În continuare, valoarea variabilei contor este mărită cu un pas situat după cuvântul cheie Step (dacă este absent, este setat pasul = 1). După aceasta, se verifică din nou adevărul contorului de condiție > valoarea finală etc., sfârșitul buclei are loc în momentul în care rezultatul acestei verificări este valoarea True.

Este adesea necesar să se încheie „anormal” un ciclu atunci când se efectuează unele condiție suplimentară. În acest caz, în interiorul buclei, ar trebui să utilizați expresia de serviciu Exit:For, care este de obicei plasată într-un construct de control, de exemplu:

Dacă condiția Atunci Ieșire Pentru

Dacă rezultatul verificării condiției este adevărat, atunci execuția buclei va fi încheiată și blocul operator1 va fi executat din nou, dar blocul operator2 nu.

Do: Buclă. Este utilizat atunci când numărul de repetări ale operatorilor de corp buclă este necunoscut în prealabil. Există patru varietăți ale acestui design. Când folosiți primele două, bucla fie va fi executată de multe ori, fie deloc.

Instrucțiuni de buclă de condiție Do Until

Dacă rezultatul verificării condiției este Fals, atunci blocul de instrucțiuni este executat, în caz contrar trecerea la instrucțiunea situată după cuvântul de serviciu Loop. Pe de altă parte, dacă primul test al condiției returnează rezultatul Adevărat, atunci bucla nu va fi executată nici măcar o dată.

Do While Condition Loop declarații

Dacă condiția este adevărată, atunci blocul de instrucțiuni este executat, dar dacă este fals, adică rezultatul verificării este Fals, atunci bucla nu va fi executată nici măcar o dată.

Dacă se folosesc ultimele două constructe, bucla va fi executată cel puțin o dată.

Efectuați bucla de instrucțiuni până la condiție

Blocul de instrucțiuni este executat atâta timp cât rezultatul testului de condiție este Fals, altfel bucla se termină.

Efectuați bucla de instrucțiuni în timpul condiției

Dacă condiția este falsă, blocul de instrucțiuni este executat, dar dacă este adevărat, i.e. Rezultatul verificării este Adevărat, apoi are loc sfârșitul ciclului.

Bucla While:Wend. Este, de asemenea, utilizat atunci când numărul de repetări ale instrucțiunilor buclei este necunoscut în prealabil și are următoarea sintaxă:

În timp ce starea Wend declarații

Dacă rezultatul verificării condiției este True, atunci blocul de instrucțiuni este executat, în caz contrar trecerea la instrucțiunea situată după cuvântul de serviciu Wend. Pe de altă parte, dacă primul test al condiției are ca rezultat False, atunci bucla nu va fi executată nici măcar o dată.

Un ciclu este o structură algoritmică cu ajutorul căruia se realizează repetarea repetată a unui bloc de operatori.

Declarație buclă cu contor (Pentru... Următorul)

Instrucțiunea For...Next vă permite să executați ciclic un set de instrucțiuni (operatori) de un anumit număr de ori. Sintaxa instrucțiunii:

Pentru counter = start_value La valoare_finală

[instrucțiuni]

[instrucțiuni]

Următorul [ tejghea]

Parametru tejghea este o variabilă numerică care își schimbă automat valoarea cu Etapa după fiecare repetare a ciclului. Bucla rulează până când tejghea£ valoare_finală cu o valoare pozitivă a parametrului Etapa sau până când tejghea³ valoare_finală cu o valoare negativă a parametrului Etapa. Astfel, bucla nu va fi executată nici măcar o dată dacă, cu o valoare de pas pozitivă start_value mai mult decât valoare_finală. Dacă parametrul Step Etapa este omis, apoi implicit incrementul variabilei contor este setat la 1.

Instrucțiunea Exit For termină bucla „devreme” și transferă controlul instrucțiunii după instrucțiunea buclă. Exit For este de obicei plasat într-o instrucțiune condiționată, de exemplu:

Dacă condiție Apoi Ieșire Pentru

Notă. Conform sintaxei operatorului For, parametrul tejghea– o variabilă aritmetică de orice tip, este totuși mai bine să folosiți întregul tip de variabilă, deoarece partea fracțională a valorii unei variabile de tip real are de obicei o eroare. Acest lucru are de-a face cu modul în care numerele sunt stocate într-un computer.

Exemplul 1

Aflați suma primelor 10 numere naturale: S = 1 + 2 + 3 + …+ 10 . Fragment de program:

Dim I ca Integer, S ca Integer

S=0 " Resetați valoarea variabilei S

Pentru i = 1 până la 10 " Începutul ciclului. Setați valorile de început și de sfârșit
"parametru buclă. Pasul implicit al buclei este 1.

S = S + i " Operatorul de atribuire este executat de fiecare dată
„executarea buclei, în în acest exemplu 10 ori

Apoi eu " Sfârșitul ciclului. Valoarea parametrului buclă este mărită cu un pas.

În acest fragment de program, bucla va fi executată de exact 10 ori.

Exemplul 2

Afișați în prima coloană a foii de lucru (începând cu a doua linie) valorile x în intervalul de la 0 la 3,2 în trepte de 0,4.

Subfilă publică()

Dim x ca unic, i ca întreg

Pentru x = 0 până la 3,2 Pasul 0.4

Deși lungimea intervalului este împărțită exact cu incremente de 0,4, rezultatul pe foaia de lucru este:

Ce să fac?

1. Puteți crește ușor valoarea finală, în acest exemplu, în loc de 3.2, scrieți 3.201.

2. Determinați numărul de repetări ale chiclei și scrieți o buclă folosind un numărător de tip întreg.

În acest caz, programul va lua forma:

Public Sub Tab1()

Dim x ca unic, i ca întreg, n ca întreg

n = CInt((3,2 - 0) / 0,4)

Pentru i = 0 la n Pasul 1

Celule (i + 2, 1) = x

Declarație buclă pentru fiecare... În continuare

Bucla For Each...Next vă permite să repetați execuția unui grup de instrucțiuni pentru fiecare element al unui tablou sau familie. Această instrucțiune are următoarea sintaxă:

Pentru fiecare elementÎn grup

[instrucțiuni]

[instrucțiuni]

Următorul [ element]

Parametru element este o variabilă care reprezintă un element al unei familii sau al unui tablou. Argument grup– numele matricei sau familiei. Instrucțiunile sunt executate o singură dată pentru fiecare membru al grupului. Utilizarea instrucțiunii este convenabilă deoarece nu trebuie să știți în avans câte elemente sunt în matrice sau familie. Variabil element trebuie să fie de tip Variant.

Exemplul 1

Găsiți media aritmetică a tuturor elementelor din intervalul selectat

Funcție publică Media (Range As Range) As Double

Dim Element ca variantă

Dim suma ca dublu

Dim Cantitate ca întreg

Cantitate = 0

Pentru fiecare element din interval

Sumă = Sumă + Element

Cantitate = Cantitate + 1

Următorul element

Medie = Sumă / Cantitate

Aplicație. Intervalul selectat de celule adiacente trebuie să conțină numere. Numerele din celulele goale sunt considerate a fi 0. Textul din celulă va avea ca rezultat o eroare.

Instrucțiunile If... End If, Select... Case, For... Next, For Each... Next enumerate mai sus sunt un grup de instrucțiuni de control care schimbă ordinea în care sunt executate comenzile. Instrucțiunile de control pot fi imbricate unele în altele, în orice ordine.