1. Pętla While Wend – wprowadzenie
Pętla While Wend jest najprostszą w swojej konstrukcji pętlą dostępną w VBA. Jeśli nasz kod ma być krótki, nieskomplikowany i mieć prostą konstrukcję, zaleca się stosowanie właśnie tej pętli zamiast pętel Do…Loop. Daje nam ona podobne możliwości. Poniżej najprostszy przykład pętli wyświetlający licznik pętli, aż do momentu, gdy osiągnie on wartość 5. Wadą pętli While…Wend jest brak możliwości wyjścia z pętli przed jej ukończeniem. Dla przykładu pętle Do…Loop i For…Next dają nam taką możliwość.
2. Przykład wykorzystania pętli While…Wend
Zróbmy krótki przykład. Wklejmy do arkusza Excel dane z poniższej tabelki, zaczynając od komórki „A1”.
Indeks giełdowy | Obroty w mln | zmiana | Wzrost/spadek |
WIG20 | 1731,37 | 5% | |
WIG | 46756,18 | 2% | |
mWIG40 | 3912,73 | -6% | |
sWIG80 | 14136,79 | -8% | |
NCIndex | 286,9 | 5% |
Napiszmy proste makro z wykorzystaniem pętli. Naszym zadaniem będzie wypełnienie ostatniej kolumny wartością wzrost, spadek lub brak zmian w zależności od znaku+/- w kolumnie „C”. Wartości ujemne będą tutaj informowały o spadku.
Sub WhileWendExample() Dim intCounter As Integer intCounter = 2 While intCounter <= 6 Select Case Sgn(Cells(intCounter, 3)) Case -1 Cells(intCounter, 4) = "Spadek" Case 1 Cells(intCounter, 4) = "Wzrost" Case Else Cells(intCounter, 4) = "brak zmian" End Select intCounter = intCounter + 1 Wend End Sub
Jak widzisz licznik pętli zaczyna się od wartości 2, a więc od drugiego wiersza. Znak plus, bądź minus sprawdziliśmy przy użyciu funkcji SGN(). Funkcja ta zwraca wartość ze zbioru -1/0/1 w zależności od znaku argumentu. Sama instrukcja przyporządkowująca, to w naszym wypadku Select CASE. Oczywiście podobny przykład możemy zrobić przy użyciu instrukcji If…Then…Else. Blokiem kodu intCounter = intCounter + 1 zwiększamy licznik pętli o 1, przechodząc do kolejnych wierszy.
3. Zadania (Rozwiązanie możesz wpisać w komentarzu)
3.1 Zmodyfikuj przykład z rozdziału przy zastosowaniu instrukcji If Then Else.
3.2 Zmodyfikuj przykład, w taki sposób, by wynik Wzrost/Spadek/ brak zmian dodatkowo wypełniał komórkę kolorem np zielony, czerwony, żółty. Formatowanie komórek, czcionek i zakresów opisywałem w tej części szkolenia.
6 komentarzy “Pętla While Wend w Excel VBA”
poproszę o rozwiązania do zadań
Sub WhileWendExample2()
Dim intCounter As Integer
intCounter = 2
While intCounter <= 6
If Sgn(Cells(intCounter, 3)) = -1 Then
Cells(intCounter, 4) = "Spadek"
ElseIf Sgn(Cells(intCounter, 3)) = 1 Then
Cells(intCounter, 4) = "Wzrost"
Else
Cells(intCounter, 4) = "brak zmian"
End If
intCounter = intCounter + 1
Wend
End Sub
Zadanie 1. Ale po co zmieniać to?? nie widze najmniejszego sensu 🙂
zadanie 2.
Sub zmiany_wartości()
Dim intIleRazy As Integer
intIleRazy = 2
Do While intIleRazy <= 6
If Cells(intIleRazy, 3) < 0 Then
Cells(intIleRazy, 4) = "spadek"
Cells(intIleRazy, 4).Select
Selection.Interior.Color = RGB(255, 0, 0)
ElseIf Cells(intIleRazy, 3) = 0 Then
Cells(intIleRazy, 4) = "brak zmian"
Cells(intIleRazy, 4).Select
Selection.Interior.Color = RGB(255, 255, 0)
Else: Cells(intIleRazy, 4) = "wzrost"
Cells(intIleRazy, 4).Select
Selection.Interior.Color = RGB(0, 255, 0)
End If
intIleRazy = intIleRazy + 1
Loop
End Sub
Sub zad32()
Dim i As Integer
i = 2
While i <= 6
If Sgn(Cells(i, 3)) = 1 Then
Cells(i, 4) = „wzrost”
Cells(i, 4).Interior.Color = RGB(0, 255, 0)
ElseIf Sgn(Cells(i, 3)) = 0 Then
Cells(i, 4) = „bez zmian”
Cells(i, 4).Interior.Color = RGB(255, 255, 0)
Else
Cells(i, 4) = „spadek”
Cells(i, 4).Interior.Color = RGB(255, 0, 0)
End If
i = i + 1
Wend
End Sub
3.1
Option Explicit
Sub PetlaWhile2()
Dim intCounter As Integer
intCounter = 2
While intCounter < Application.WorksheetFunction.CountA(Range(„A:A”)) + 1
If Sgn(Cells(intCounter, 3)) < 0 Then
Cells(intCounter, 4) = „Spadek”
ElseIf Sgn(Cells(intCounter, 3)) = 0 Then
Cells(intCounter, 4) = „Bez zmian”
ElseIf Sgn(Cells(intCounter, 3)) > 0 Then
Cells(intCounter, 4) = „Wzrost”
End If
intCounter = intCounter + 1
Wend
End Sub
3.2
Option Explicit
Sub PetlaWhile3()
Dim intCounter As Integer
intCounter = 2
While intCounter < Application.WorksheetFunction.CountA(Range(„A:A”)) + 1
If Sgn(Cells(intCounter, 3)) < 0 Then
Cells(intCounter, 4) = „Spadek”
Cells(intCounter, 4).Select
Selection.Interior.Color = vbGreen
ElseIf Sgn(Cells(intCounter, 3)) = 0 Then
Cells(intCounter, 4) = „Bez zmian”
Cells(intCounter, 4) = „Spadek”
Cells(intCounter, 4).Select
Selection.Interior.Color = vbYellow
ElseIf Sgn(Cells(intCounter, 3)) > 0 Then
Cells(intCounter, 4) = „Wzrost”
Cells(intCounter, 4) = „Spadek”
Cells(intCounter, 4).Select
Selection.Interior.Color = vbRed
End If
intCounter = intCounter + 1
Wend
End Sub
Zad. 1
Zad. 2