Kurs VBA – cz. 13 – Instrukcje warunkowe If, Case

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).

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.

 

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.

 

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:

 

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.

 

Podsumowując:

 

Wielokrotne IF

Kolejną metodę użycia IF udostępnia nam instrukcja ElseIf. Dzięki temu możemy sprawdzać wiele warunków jednocześnie.

 

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.

 

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.

 

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:
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.

Comments 7

  1. Chciałbym prosić o pomoc. Potrzebuje napisać skrypt, który pisuje w tabelce wartość po czym przechodzi niżej i znowu wpisuje wartość ( o którą pyta zawsze użytkownika) . Jak to zrobić. Mam już wpisywanie wartości do jednej komórki teraz muszę zrobić żeby przeszło niżej

  2. Witam,
    Dziękuję za pytanie. Pętle i kolekcje będą w następnej części kursu. Podejść jest oczywiście dużo. Jedno z najprostszych jest poniżej. Musi Pan tylko uzupełnić funkcję GetData.

    Option Explicit

    Const cs_OutputRange As String = "A2:A20"

    Sub FillRangfe()
    Dim lr_OutputRange As Range
    Dim lr_WorkingCell As Range

    Set lr_OutputRange = Range(cs_OutputRange)

    For Each lr_WorkingCell In lr_OutputRange

    lr_WorkingCell.Value = GetData
    Next lr_WorkingCell
    End Sub

    Function GetData() As String
    GetData = "test"
    End Function

  3. witam
    Chciałbym zastosować kilka instrukcji warunkowych do combobox napisałem coś takiego ale niestety nie działa tak jak powinno
    Dim a As Double
    a = (ComboBox3.Value = Worksheets(1).Cells(1, 3))
    If a < 100 Then
    MsgBox "warunek nie został spełniony"
    Else
    MsgBox "warunek został spełniony"
    End If

  4. Dzień dobry, potrzebuję pomocy przy napisaniu makra z wielokrotnym formatowaniem warunkowym do poniższego przykładu.

    C G H I
    M 39,0 39,0 38,5
    D 38,2 39,3 42,0
    D 46,4 52,0 53,5
    M 38,0 49,0 51,0
    D 42,9 42,9 42,9
    D 46,8 46,8 46,8
    M 46,4 46,4 46,4
    M 50,3 50,3 50,3

    Jeżeli w komórce w kolumnie C jest wartość "M", a w komórkach G:I wartości są poza zakresem (poniżej lub powyżej) 40 – 50, to komórki G:I potrzebuję wyróżnić pogrubioną czcionką i kolorowym tłem.
    Natomiast jeżeli w komórce w kolumnie C jest "D", to zakres wartości dla G:I wynosi 40 – 53 – wyróżnienie takie samo.
    Jeżeli wartości w komórkach G:I mieszczą się w odpowiednich zakresach, to formatowanie nie jest potrzebne.
    Dziękuję.

  5. Dzień dobry,
    W komentarzach staram się odpowiadać na konkretne pytania. Zapraszam na forum ExcelForum.pl. Znajduje się tam wielu specjalistów, być może któryś z nich będzie chętny poświecić swój czas na napisania dla Pana programu.
    Pozdrawiam,

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *