TOP

VBA-Lekcja 7.1. Warunki (Warunki)

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.


Jeśli... To... Inaczej

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
NOTNOT [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

Inaczej

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

Wybierz_ przypadek

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