W poprzednich częściach kursu poznaliśmy zmienne i metody pracy z nimi. Czas przejść do ostatniego elementu układanki, czyli wspomnianego już wcześniej sterowania programem. Podstawową instrukcją sterowania w prawie każdym języku programowania jest IF, czyli "jeżeli". Może ona być używana na kilka sposobów, każdy jednak ogranicza się do sprawdzania, czy jakieś wyrażenie jest prawdziwe lub nie i wykonania odpowiedniego kodu, przyporządkowanego do jednej z tych dwóch wartości.
Wyrażenie może być porównaniem przy pomocy operatorów, wynikiem funkcji, atrybutem, lub ich połączeniem. Jeżeli wyrażenie jest prawdziwe, czyli równe True mówimy, że warunek jest spełniony.
Jak zwykle zachęcam do testowania samodzielnego poniższych przykładów. Jeżeli niektóre instrukcje są dla Ciebie nowe możesz łatwo znaleźć dla nich pomoc naciskając F1 w VBE po zaznaczeniu instrukcji.
IF w jednej linii
W najprostszej postaci instrukcja IF może zajmować tylko jedną linię (warunek plus kod do wykonania).
Sub test()
Dim Odpowiedz As String
Odpowiedz = MsgBox("Czy chcesz zakonczyć program?", _
vbYesNo + vbQuestion)
If Odpowiedz = vbYes Then Exit Sub
MsgBox "Procedura nie została zakończona"
End Sub
Jeżeli zostanie naciśnięty przycisk Tak, to drugi MsgBox nie wyświetli się. W powyższym przykładzie sprawdzanym warunkiem jest porównanie zmiennej i stałej. Procedurę można napisać jeszcze krócej, bez użycia pomocniczej zmiennej.
Sub test()
If MsgBox("Czy chcesz zakonczyć program?", vbYesNo + vbQuestion) = _ vbYes Then Exit Sub
MsgBox "Procedura nie została zakończona"
End Sub
Tym razem sprawdzanym warunkiem jest porównanie wyniku funkcji i stałej wbudowanej.
Podsumowując, taka instrukcja musi zawierać się w jednej linii (ewentualnie złamanej operatorem "_") i wygląda:
If warunek Then Kod do wykonania gdy warunek = True
If w wielu liniach.
Jeżeli chcemy wykonać kilka instrukcji w przypadku spełnienia warunku, musimy zamknąć je w klamrze zakończonej isntrukcją End If.
Sub formatujKomorke()
If ActiveCell.Value <> 0 Then
ActiveCell.Font.Bold = True
ActiveCell.Font.Color = vbBlue
End If
End Sub
Powyższa procedura zmienia formatowanie aktywnej komórki, jeżeli jej zawartość jest różna od zera.
Instrukcja więc wygląda następująco:
If Warunek Then
1 linia kodu
2 linia kodu
3 linia kodu
itd.
End If
Standardowa instrukcja IF
Ten podrozdział zatytułowałem jako standardowy IF ponieważ taka konstrukcja jest najczęściej wykorzystywana i zawiera kod zarówno dla przypadku, gdy warunek jest równy True oraz gdy równa się False.
Sub formatujKomorke2()
'Ta instrukcja wykona się zawsze
ActiveCell.ClearFormats
If ActiveCell.Value < 0 Then
'Ten instukcje wykonają się, jeżeli wartość komórki
'jest mniejsza od zera
ActiveCell.Font.Bold = True
ActiveCell.Font.Color = vbRed
Else 'FALSE
'Te instrukcje wykonają się, jeżeli wartość komórki
'nie jest mniejsza od zera
ActiveCell.Font.Italic = True
ActiveCell.Font.Color = vbGreen
End If
End Sub
Podsumowując:
If wyrażenie Then
'Kod jeżeli wyrażenie = True
1 linia kodu
2 linia kodu
3 linia kodu
Else
'Kod jeżeli wyrażenie = False
1 linia kodu
2 linia kodu
3 linia kodu
End If
Wielokrotne IF
Kolejną metodę użycia IF udostępnia nam instrukcja ElseIf. Dzięki temu możemy sprawdzać wiele warunków jednocześnie.
ActiveCell.ClearFormats
If ActiveCell.Value < 0 Then
ActiveCell.Font.Color = vbRed
ElseIf ActiveCell.Value < 20 Then
ActiveCell.Font.Color = vbYellow
ElseIf ActiveCell.Value < 40 Then
ActiveCell.Font.Color = vbGreen
Else
ActiveCell.Font.Color = vbBlue
End If
Każde ElseIf jest sprawdzane jeżeli poprzednie If oraz ElseIf nie są spełnione. Można użyć dowolną ilość ElseIf. Jeżeli If lub któreś ElseIf będą spełnione to wykona się kod do następnego ElseIf i kolejne warunki nie będą już sprawdzane.
Ostatni warunek Else nie jest konieczny, jeżeli go pominiemy i If oraz żaden ElseIf nie będę spełnione to nie wykona się żaden kod.
Zagnieżdżone IF
Ta forma używania warunków nie jest nową konstrukcją, jedynie wariacją na temat tego co już widzieliśmy. Wiele warunków możemy sprawdzać poprzez umieszczanie kolejnych instrukcji IF w bloku kodu nadrzędnego IF.
ActiveCell.ClearFormats
If ActiveCell.Column = 1 Then
'Czy aktywna komórka jest w kolumnie A?
If ActiveCell.Value < 0 Then ActiveCell.Font.Color = vbRed
ElseIf ActiveCell.Column >= 1 And ActiveCell.Column <= 4 Then
'Czy aktywna komórka jest w zakresie B:E?
If ActiveCell.Value < 0 Then
ActiveCell.Interior.Color = vbYellow
Else
ActiveCell.Interior.Color = vbGreen
End If
End If
Select Case
VBA udostępnia instrukcję pokrewną z IF, służącą do porównywania wyrażenia do wielu wartości jednocześnie. Nie udostępnia to nam nowych funkcjonalności, tylko sprawia, że kod jest czytelniejszy.
Select Case ActiveCell.Value
Case Is < 0
ActiveCell.Font.Color = vbRed
Case Is < 10
ActiveCell.Font.Color = vbYellow
Case 10 To 100
ActiveCell.Font.Color = vbGreen
Case 101, 102, 103
ActiveCell.Font.Bold = True
Case Not IsNumeric(ActiveCell.Value)
ActiveCell.Font.Underline = True
Case Else
ActiveCell.ClearContents
End Select
Wyrażenie ActiveCell.Value jest kolejno sprawdzane, czy:
- Jest mniejsze od zera
- Jest mniejsze od 10
- Jest w zakresie 10 - 100 włącznie, jest to bardziej czytelna metoda zapisu:
- ActiveCell.Value >= 10 and ActiveCell.Value <= 100
- Czy jest równe 101, 102, lub 103, jest to bardziej czytelna metoda zapisu:
- 101 Or 102 Or 103
- Czy nie jest wartością liczbową
Jeżeli którykolwiek warunek zostanie spełniony, kolejne nie są już sprawdzane. Jeżeli żaden warunek nie będzie spełniony zostanie wykonany kod po Case Else (jeżeli go umieścimy, nie jest konieczny).
Select Case przydaje się przy obsłudze funkcji MsgBox:
Select Case MsgBox("Wystąpił błąd, co robić?", _
vbAbortRetryIgnore + vbExclamation + _
vbDefaultButton1, Application.Name)
Case vbAbort
'Instrukcje po naciśnięciu Przerwij
Case vbRetry
'Instrukcje po naciśnięciu Ponów próbę
Case vbIgnore
'Instrukcje po naciśnięciu Ignoruj
End Select
Oczywiście powyższe przykłady są czysto dydaktyczne. Istnieją o wiele lepsze sposoby formatowania komórek na podstawie wartości, np. formatowanie warunkowe.
Subskrybuj RSS, lub polub blog na Facebooku aby otrzymywać najnowsze informacje o rozwoju kursu.
Zachęcam do zadawania pytań w komentarzach.