Warunki są bardzo przydatne w programowaniu, gdyż pozwalają na wykonywanie akcji w zależności od zadanych kryteriów (ta sama zasada jest stosowana jak w funkcji IF Excel).
Instrukcja VBA If...Then...Else wykonuje zestaw instrukcji w zależności od tego, czy określony warunek jest prawdziwy, czy nie. Jeżeli warunek (test logiczny) jest spełniony, wykonywany jest jeden zestaw akcji. Jeśli jednak warunek jest fałszywy, wykonywany jest alternatywny zestaw działań.
Jednak w celu zapewnienia czytelności można użyć instrukcji Select Case zamiast wielu poziomów zagnieżdżonych instrukcji If...Then...Else.
Zatem najważniejszą funkcją ustawiającą warunek jest IF i teraz zobaczymy, jak to działa:
If [TERMIN TUTAJ] Then '=> JEŚLI warunek jest prawdziwy WTEDY 'Instrukcje, jeśli „prawda” Else '=> INACZEJ 'Instrukcje w przypadku „kłamstwa” End If
Przejdźmy do praktyki i wróćmy do przykładu, którego użyliśmy w lekcji o zmiennej. Celem tej procedury było wyświetlenie okna dialogowego, w którym zostanie wyświetlona wartość z ciągu znaków określonego w komórce F5:
Jeśli wpiszesz literę w komórce F5, spowoduje to błąd. Chcemy temu zapobiec.
Sub variables() 'Deklaracja zmiennych Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Przypisywanie wartości do zmiennych row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'Okno dialogowe MsgBox last_name & " " & first_name & ", " & age & "lata" End Sub
Dodajmy warunek, który przed wykonaniem kodu sprawdzi, czy wartość wpisana w komórce F5 jest liczbą.
Do przetestowania warunku użyjemy funkcji IsNumeric:
Sub variables() 'Jeśli wartość w nawiasach (komórka F5) jest numeryczna (stąd IF WARUNEK JEST PRAWDZIWY), to 'wykonaj poniższe instrukcje WTEDY If IsNumeric(Range("F5")) Then 'Deklaracja zmiennych Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Przypisywanie wartości do zmiennych row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'Okno dialogowe MsgBox last_name & " " & first_name & ", " & age & "lata" End If End Sub
Instrukcje musimy napisać także w przypadku, gdy nie jest spełniony ustawiony przez nas warunek:
Sub variables() If IsNumeric(Range("F5")) Then 'Jeśli warunek jest spełniony 'Deklaracja zmiennych Dim last_name As String, first_name As String, age As Integer, row_number As Integer 'Przypisywanie wartości do zmiennych row_number = Range("F5") + 1 last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) 'Okno dialogowe MsgBox last_name & " " & first_name & ", " & age & "lata" Else 'Jeśli warunek nie jest spełniony 'Okno dialogowe: ostrzeżenie MsgBox "Wprowadzona wartość" & Range("F5") & "to nie jest prawda!" 'Usuń zawartość komórki F5 Range("F5").ClearContents End If End Sub
Teraz wartość inna niż numeryczna nie spowoduje żadnych problemów.
Pracując z naszą tablicą zawierającą 16 wierszy danych, naszym następnym krokiem będzie sprawdzenie, czy zmienna row_number jest: „większa lub równa 2” i „mniejsza lub równa 17”.
Ale najpierw spójrzmy na operatory porównania:
= | Dokładnie |
<> | nie dokładnie |
< | mniej niż |
<= | mniejszy lub równy |
> | więcej niż |
>= | większe bądź równe |
i te przydatne operatory:
AND | [warunek1] AND [warunek2] Muszą zostać spełnione dwa warunki |
OR | [warunek1] OR [warunek2] Musi być spełniony co najmniej 1 z 2 warunków |
NOT | NOT [warunek1] Warunek nie może być spełniony |
Dodajmy teraz jeden z powyższych warunków AND pomiędzy operatorami porównania:
Sub variables() If IsNumeric(Range("F5")) Then 'Jeśli wartość liczbowa Dim last_name As String, first_name As String, age As Integer, row_number As Integer row_number = Range("F5") + 1 If row_number >= 2 And row_number <= 17 Then 'Jeśli poprawny numer last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) MsgBox last_name & " " & first_name & ", " & age & "lata" Else 'Jeśli numer jest nieprawidłowy MsgBox "Wprowadzony numer" & Range("F5") & "nie jest poprawne!" Range("F5").ClearContents End If Else 'Jeśli nie jest to wartość liczbowa MsgBox "Wprowadzona wartość" & Range("F5") & "to nie jest prawda!" Range("F5").ClearContents End If End Sub
Jeśli chcemy uczynić nasze makro bardziej praktycznym, możemy zastąpić 17 zmienną, która będzie przechowywać liczbę linii. Pozwoliłoby nam to dodawać i usuwać wiersze z tablicy bez konieczności każdorazowej zmiany tego limitu.
Aby to zrobić musimy utworzyć zmienną nb_rows i dodać tę funkcję.
W tym przypadku użyjemy funkcji WorksheetFunction.CountA, która jest analogiczna do funkcji COUNTA w samym Excel.
Chcemy, aby ta funkcja zliczyła liczbę niepustych komórek w pierwszej kolumnie i zapisała wynikową wartość do zmiennej nb_rows:
Sub variables() If IsNumeric(Range("F5")) Then 'JEŚLI NUMER Dim last_name As String, first_name As String, age As Integer, row_number As Integer Dim nb_rows As Integer row_number = Range("F5") + 1 nb_rows = WorksheetFunction.CountA(Range("A:A")) 'Funkcja zliczania liczby linii If row_number >= 2 And row_number <= nb_rows Then 'JEŚLI WAŻNY NUMER last_name = Cells(row_number, 1) first_name = Cells(row_number, 2) age = Cells(row_number, 3) MsgBox last_name & " " & first_name & ", " & age & "lata" Else 'JEŚLI NUMER JEST NIEPRAWIDŁOWY MsgBox "Wprowadzony numer" & Range("F5") & "nie jest poprawne!" Range("F5").ClearContents End If Else 'JEŚLI NIE NUMER MsgBox "Wprowadzona wartość" & Range("F5") & "to nie jest prawda!" Range("F5").ClearContents End If End Sub
ElseIf umożliwia dodanie dodatkowych warunków po poleceniu IF:
If [WARUNEK 1] Then '=> JEŚLI warunek 1 jest prawdziwy WTEDY 'Instrukcje 1 ElseIf [WARUNEK 2] Then '=> JEŚLI warunek 1 jest fałszywy, ale warunek 2 jest prawdziwy WTEDY 'Instrukcje 2 Else '=> INACZEJ 'Instrukcje 3 End If
Jeśli WARUNEK 1 jest prawdziwy, Instrukcja 1 wykona i zakończy instrukcję IF (która zaczyna się od IF i kończy End If). Jeśli WARUNEK 2 zwróci wartość false, wówczas zostanie wykonana Instrukcja 2, a jeśli zwróci wartość false, wówczas zostanie wykonana Instrukcja 3 (w opcji Else).
Oto przykład z ocenami od 1 do 6 w komórce A1 i komentarzem do tych ocen w komórce B1:
Sub scores_comment() 'Zmienne Dim note As Integer, score_comment As String note = Range("A1") 'Komentarze na podstawie otrzymanej punktacji If note = 6 Then score_comment = "Świetny wynik!" ElseIf note = 5 Then score_comment = "Słuszna uwaga" ElseIf note = 4 Then score_comment = "Wynik zadowalający" ElseIf note = 3 Then score_comment = "Wynik niezadowalający" ElseIf note = 2 Then score_comment = "Zły wynik" ElseIf note = 1 Then score_comment = "Straszny wynik" Else score_comment = "Wynik zerowy" End If 'Komentarz w komórce B1 Range("B1") = score_comment End Sub
Istnieje alternatywa dla użycia If z wieloma instrukcjami ElseIf, a mianowicie polecenie Select Case, które jest bardziej odpowiednie w tego rodzaju sytuacjach.
Rozważmy przykład makra z operatorem Select Case:
Sub scores_comment() 'Zmienne Dim note As Integer, score_comment As String note = Range("A1") 'Komentarze na podstawie otrzymanej punktacji Select Case note '=> wynik testu (punkty) Case Is = 6 '=> jeśli wartość = 6 score_comment = "Świetny wynik!" Case Is = 5 '=> jeśli wartość = 5 score_comment = "Słuszna uwaga" Case Is = 4 '=> jeśli wartość = 4 score_comment = "Wynik zadowalający" Case Is = 3 '=> jeśli wartość = 3 score_comment = "Wynik niezadowalający" Case Is = 2 '=> jeśli wartość = 2 score_comment = "Zły wynik" Case Is = 1 '=> jeśli wartość = 1 score_comment = "Straszny wynik" Case Else '=> jeśli wartość nie jest równa żadnej z powyższych score_comment = "Wynik zerowy" End Select 'Komentarz w komórce B1 Range("B1") = score_comment End Sub
Warto zauważyć, że moglibyśmy użyć także innych operatorów porównania:
Case Is >= 6 'jeśli wartość >= 6
Przykłady o różnych znaczeniach:
Case Is = 6, 7 'jeśli wartość = 6 lub 7 Case Is <> 6, 7 'jeśli wartość nie jest równa 6 lub 7
Case 6 To 10 'jeśli wartość = dowolna liczba od 6 do 10