TOP

VBA-Lekcja 8.1. Pętle (Loops)

YouLibreCalc for Excel logo

Pętle powtarzają instrukcje kilka razy i mogą zaoszczędzić dużo czasu.

W Excel VBA istnieją następujące typy pętli:

  • While ... Wend
  • Do ... Loop
  • For ... To ... Następny_

  • Poniższy kod wstawia sekwencję liczb do każdej komórki kolumny A (od 1 do 12):

    Sub while_loop()
    
        Cells(1, 1) = 1
        Cells(2, 1) = 2
        Cells(3, 1) = 3
        Cells(4, 1) = 4
        Cells(5, 1) = 5
        Cells(6, 1) = 6
        Cells(7, 1) = 7
        Cells(8, 1) = 8
        Cells(9, 1) = 9
        Cells(10, 1) = 10
        Cells(11, 1) = 11
        Cells(12, 1) = 12
    
    End Sub
    

    Ten kod jest bardzo powtarzalny...

    Wyobraź sobie, że musielibyśmy wstawiać kolejne liczby do setek komórek zamiast tylko 12... Teraz rozumiesz, dlaczego pętle są bardzo przydatne.

    WHILE ... WEND

    Podajmy przykład pustego cyklu While:

    Sub while_loop()
    
        While [stan : schorzenie]
            'Instrukcje
        Wend
    
    End Sub
    

    Dopóki warunek jest spełniony, instrukcje w pętli będą nadal wykonywane (należy jednak uważać, aby nie utworzyć nieskończonej pętli).

    Poniżej znajduje się omówione wcześniej makro zapętlające, zamienione w pętlę While:

    Sub while_loop()
    
        Dim num As Integer
        num = 1 'Numer początkowy (w tym przypadku jest to numer linii i ustawiana wartość)
    
        While num <= 12 'Dopóki zmienna num jest mniejsza lub równa 12, instrukcje zostaną wykonane
           Cells(num, 1) = num 'Numeracja
           num = num + 1 'Po każdym przejściu pętli liczba jest zwiększana o 1
        Wend
           
    End Sub
    

    Używając tej pętli w makrze, gdybyśmy potrzebowali 400 taśm zamiast 12, jedyne co musielibyśmy zrobić, to zastąpić 12 400.

    DO ... LOOP

    Istnieje inny sposób napisania pętli, która działa tak samo jak While Wend (działa tak długo, jak spełniony jest określony warunek zawarty w poleceniu While):

    Sub do_while_loop()
    
        Do While [stan : schorzenie]
            'Instrukcje
        Loop
    
    End Sub
    

    W poniższej wersji widać, że warunek można zapisać na końcu pętli Do Loop, co oznacza, że instrukcje zostaną wykonane dokładnie co najmniej raz:

    Sub do_while_loop()
    
        Do
            'Instrukcje
        Loop While [stan : schorzenie]
    
    End Sub
    

    Zamiast wykonywać pętlę, gdy warunek jest spełniony, możemy również wyjść z pętli na podstawie warunku, jeśli zastąpimy While przez Until:

    Sub do_while_loop()
    
        Do Until [stan : schorzenie]
            'Instrukcje
        Loop
    
    End Sub
    

    FOR ... TO ... NEXT

    Sub for_loop()
    
        For i = 1 To 5
            'Instrukcje
        Next
    
    End Sub
    

    Pętla For powtórzy się tutaj 5 razy.

    Za każdym razem, gdy ten cykl się powtarza, zmienna i jest automatycznie zwiększana o 1:

    Sub for_loop()
    
        For i = 1 To 5
            MsgBox i
        Next
    
    End Sub
    

    Wczesne wyjście z pętli (Exit)

    Możliwe jest wcześniejsze wyjście z pętli For, korzystając z poniższej instrukcji:

    Exit For 'Wyjdź z pętli For
    

    Rozważmy przykład, który wyraźnie to pokaże:

    Sub for_loop()
        Dim max_loops As Integer
        max_loops = Range("A1") 'W komórce A1 określiliśmy limit liczby powtórzeń
    
        For i = 1 To 7 'Oczekiwana liczba cykli: 7
           If i > max_loops Then 'Jeśli komórka A1 jest pusta lub zawiera liczbę mniejszą niż 7, to zmniejsz liczbę powtórzeń
               Exit For 'Jeżeli poprzedni warunek to TRUE to wyjście z pętli For...loop
           End If
       
           MsgBox i
        Next
    
    End Sub
    

    Inni operatorzy Exit:

    Exit Do 'Wyjście z pętli Do Loop
    
    Exit Sub 'Wyjdź z procedury
    
    Exit Function 'Funkcja wyjścia