Pętla Do Loop w Excel VBA

1. Schemat działania pętli Do While Loop

Pętla While…Wend, którą poznaliśmy w poprzednim rozdziale jest najprostszą pętlą w Excelowym VBA. Pętla, która daje nam więcej możliwości to Do…Loop. Daje nam ona wiele więcej możliwości. Możemy np zakończyć wykonywanie instrukcji wcześniej, poprzez wprowadzenie warunku wyjścia. Nasza kontrola nad wykonywaniem instrukcji jest znacznie większa. Poniżej podstawowy schemat pętli Do…Loop:

Do [Rodzaj Warunku] [Warunki]
[Instrukcje]
Loop

2. Rodzaje pętli Do…Loop

Pętle Do…Loop możemy podzielić na 5 kategorii. Ich dokładny opis zamieszczam w tabelce poniżej.

Rodzaj pętliOpis
Do While LoopPętla z warunkiem wejścia. Pętla Do While Loop uruchamia się po raz pierwszy, gdy warunek jest spełniony. Oznacza to tyle co „odtwarzaj instrukcję gdy warunek jest spełniony”.
Do Until LoopPętla z warunkiem wyjścia. Pętla uruchamia się po raz pierwszy i działa do momentu, aż warunek zostanie spełniony. Oznacza to tyle co „odtwarzaj instrukcję, dopóki warunek zostanie spełniony”. Gdy warunek zostanie spełniony następuje wyjście z pętli
Do Loop WhilePętla z warunkiem wejścia. Pętla uruchamia się i wykonuje 1 raz, po czym następuje sprawdzenie, czy instrukcja może wejść w pętlę po raz kolejny. Gdy warunek jest spełniony pętla uruchomi się po raz kolejny.
Do Loop UntilPętla z warunkiem wyjścia. Pętla uruchamia się i wykonuje 1 raz, po czym następuje sprawdzenie, czy instrukcja może wejść w pętlę po raz kolejny. Gdy warunek jest spełniony nastąpi wyjście z pętli.
Do LoopPętla bez określonego warunku. Możemy ją zatrzymać np przy pomocy instrukcji Exit Loop oraz instrukcji If Then Else.

Naszą pętlę możemy zakończyć przed spełnieniem warunku. Służy do tego instrukcja Exit Do. Używamy jej np, gdy chcemy, by jeszcze jakiś dodatkowy warunek mógł zakończyć pętle. Warunek, którego nie napisaliśmy  po While lub Until.

3. Przykład pętli w pętli

Spróbujmy zrobić w naszym arkuszu VBA prostą tabliczkę mnożenia. Wykorzystamy do tego celu poznane nam pętle Do Until Loop i Do loop Until. W pierwszej kolejności stwórzmy prostą pętlę, wypełniającą nam 10 kolumn pierwszego wiersza w naszym arkuszu:

Sub LoopExample1()

Dim intRow As Integer
Dim intCol As Integer
intRow = 1
intCol = 1

Do
Cells(intRow, intCol) = intCol * intRow
intCol = intCol + 1
Loop Until intCol = 10

End Sub

W powyższym przykładzie celowo wprowadziliśmy od razu obie zmienne dla kolumn i wierszy. Wykorzystamy je w pełni kończąc nasz przykład. Gdy mamy już makro wypełniające pierwszy wiersz, zapętlamy je powiększając za każdym razem licznik dla wierszy o 1. W ten sposób w naszym arkuszu utworzy się tabliczka mnożenia do 100.

Sub LoopExample1()

Dim intRow As Integer
Dim intCol As Integer
intRow = 1

Do Until intRow > 10
intCol = 1

Do
Cells(intRow, intCol) = intCol * intRow
intCol = intCol + 1
Loop Until intCol > 10

intRow = intRow + 1
Loop

End Sub

4. Przykład wykorzystania pętli

W przykładzie z użyciem pętli stworzymy prostą bazę osób. Po stworzeniu bazy zajmiemy się analizą danych z użyciem poznanych wcześniej funkcji i możliwości VBA. Na początek stwórzmy prostą tabelę, w której naszymi kolumnami będą Liczba porządkowa, numer indeksu, data egzaminu, wynik egzaminu, ocena słowna. Dodatkowo kolumnę Liczby porządkowej  wypełnijmy kolejno liczbami od 1 do 30.

Sub LoopExample()

Dim intCounter As Integer
Dim intColumn As Integer
Dim intRow As Integer

'wstawiamy nagłówki kolumn
Cells(1, 1) = "Liczba porządkowa"
Cells(1, 2) = "Numer indeksu"
Cells(1, 3) = "Data egzaminu"
Cells(1, 4) = "Wynik egzaminu"
Cells(1, 5) = "Ocena słowna"

'wypełniamy kolumnę Liczba porządkowa liczbami od 1 do 30
intCounter = 1
Do While intCounter <= 30
Cells(intRow + 2, 1) = intCounter
intCounter = intCounter + 1
intRow = intRow + 1
Loop

End Sub
Kurs Excel VBA - Pętla Do Loop
Kurs Excel VBA – Pętla Do Loop

W ten sposób uzyskaliśmy prostą tabelkę do której możemy wprowadzać dane. W następnej kolejności przy użyciu funkcji generowania liczb losowych zmodyfikujmy nasz skrypt, tak aby:

  • Kolumna Numer Indeksu była wypełniona liczbami losowymi z przedział od 90000 do 100000
  • Kolumna Data egzaminu była wypełniona datą z dnia dzisiejszego – 10 dni
  • Kolumna Wynik egzaminu zawierała liczby losowe od 1 do 100
  • Dane zawarte w kolumnie Ocena słowna powinny odnosić się do wyników w następujący sposób: wyniki od 0 do 33 otrzymują wartość „Poprawka”. Wartości od 34 do 67 otrzymują wartość „Zdał”. Wartości większe od  67 otrzymują wartość „Zdał z wyróżnieniem”.

Liczby losowe tworzymy przy wykorzystaniu funkcji RND(). Możemy w ten sposób wygenerować liczby losowe z przedziału od 0 do 1. Wylosowaną liczbę możemy zamienić na liczby całkowite używając funkcji INT(). Funkcje te są bardziej szczegółowo opisane w artykule o funkcjach matematycznych VBA. Do dzieła !

Sub LoopExample()

Dim intCounter As Integer
Dim intColumn As Integer
Dim intRow As Integer

'wstawiamy nagłówki kolumn
Cells(1, 1) = "Liczba porządkowa"
Cells(1, 2) = "Numer indeksu"
Cells(1, 3) = "Data egzaminu"
Cells(1, 4) = "Wynik egzaminu"
Cells(1, 5) = "Ocena słowna"

'wypełniamy kolumnę Liczba porządkowa liczbami od 1 do 30
intCounter = 1
Do While intCounter <= 30
Cells(intRow + 2, 1) = intCounter
intCounter = intCounter + 1
intRow = intRow + 1
Loop

'wypełniamy kolumnę numer indeksu
intCounter = 1 'do licznika przypisujemy wartość 1
intRow = 0 'do licznika wierszy przypisujemy wartość początkową

Do While intCounter <= 30
Cells(intRow + 2, 2) = Int(90000 + Rnd() * 10000) 'Całkowita liczba losowa od 90kdo 100k
intCounter = intCounter + 1
intRow = intRow + 1
Loop

'wypełniamy kolumnę data egzaminu
intCounter = 1 'do licznika przypisujemy wartość 1
intRow = 0 'do licznika wierszy przypisujemy wartość początkową

Do While intCounter <= 30
Cells(intRow + 2, 3) = Date - 10 ' wstawiamy datę w 3 kolumnę
intCounter = intCounter + 1
intRow = intRow + 1
Loop

'wypełniamy kolumnę wynik egzaminu
intCounter = 1 'do licznika przypisujemy wartość 1
intRow = 0 'do licznika wierszy przypisujemy wartość początkową

Do While intCounter <= 30
Cells(intRow + 2, 4) = Int(Rnd() * 100) 'mnożymy liczbę losową przez 100 i zaokrąglamy
intCounter = intCounter + 1
intRow = intRow + 1
Loop
'wypełniamy ocenę słowną
Dim StrResult As String 'wstawiamy zmienną reprezentującą oceną słowną
intCounter = 1 'do licznika przypisujemy wartość 1
intRow = 0 'do licznika wierszy przypisujemy wartość początkową

Do While intCounter <= 30

'instrukcja warunkowa przypisuje wynik słowny na podstawie pkt. z kolumny Wynik
If Cells(intRow + 2, 4) <= 33 Then
StrResult = "Poprawka"
ElseIf Cells(intRow + 2, 4) > 33 And Cells(intRow + 2, 4) <= 67 Then
StrResult = "Zdał"
ElseIf Cells(intRow + 2, 4) > 67 Then
StrResult = "Zdał z wyróżnieniem"
End If

Cells(intRow + 2, 5) = StrResult

intCounter = intCounter + 1
intRow = intRow + 1
Loop

End Sub

Plik z rozwiązaniem zadania zamieszczam poniżej:

Kurs_excel_vba_baza_osob

5. Zadania (Rozwiązanie możesz wpisać w komentarzu)

5.1 Stwórz tabliczkę mnożenia z wykorzystaniem pętli Do While Loop.

5.2 Przy użyciu pętli wylistuj w arkuszu wszystkie liczby parzyste od 0 do 100.

5.3 Przy użyciu pętli wylistuj wszystkie liczby z zakresu od 0 do 100 podzielne przez 4.

5.4 Zmodyfikuj przykład z bazą osób dodając kolor w kolumnie nr 5. W zależności od wyniku egzaminu wynikowi Zdał odpowiada kolor żółty, wynikowi poprawka kolor czerwony. Dla wyniku Zdał z wyróżnieniem przypisz kolor zielony.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

11 komentarzy “Pętla Do Loop w Excel VBA”