Czym jest instrukcja warunkowa If Then Else VBA
W najprostszym rozumieniu, jest to odpowiednik funkcji „Jeżeli()” stosowany w kodzie VBA. Wyobraźmy sobie, że chcemy, by nasz program podejmował decyzje na podstawie danych, które wprowadzimy. W zależności od tego, jakie dane zostaną wprowadzone na początku, możemy otrzymać wiele różnych rezultatów. Uproszczony model działania instrukcji If Then Else VBA zamieszczam poniżej:
If [Warunek] Then [Kod uruchamiany, gdy warunek jest spełniony] Else: [Kod uruchamiany, gdy warunek nie jest spełniony] End If
Porównując instrukcję ze standardową funkcja „Jeżeli(warunek; kod po spełnieniu warunku; kod po niespełnieniu warunku)„, analogia fraz będzie wyglądać następujący sposób:
Jeżeli( If warunek [Warunek]; kod_po_spełnieniu_warunku; Then [Kod uruchamiany, gdy warunek jest spełniony] kod_po_niespełnieniu_warunku Else [Kod uruchamiany, gdy warunek nie jest spełniony] ) End If
Co istotne nasz program po spełnieniu warunku, nie przerabia bloku kodu zapisanego w klauzuli Else. Po prostu ją pomija. Jeśli więc to możliwe, w klauzuli Then powinniśmy wpisywać bloki kodu, które wykonywane będą z większym prawdopodobieństwem. Oszczędzamy w ten sposób zasoby naszego komputera.
Przykład wykorzystania instrukcji warunkowej If Then Else
Wyobraźmy sobie, że chcemy w Excelu napisać krótkie makro, które na podstawie wpisanego wieku w komórce A2, określi słownie czy osoba jest pełnoletnia, czy niepełnoletnia. Wynik powinien pojawić się w komórce B2.
Sub ITEExample() If Range("A2") = 18 Then Range("B2") = "Pełnoletni" Else: Range("B2") = "Niepełnoletni" End If End Sub
Przechodzimy z edytora VBA do naszego skoroszytu. Wchodzimy w arkusz, w którym chcemy wykonać nasz program. W moim przypadku będzie to „Arkusz1”. Klikamy w zakładkę „Developer” i z makr wybieramy nasz program.
Rozszerzenie instrukcji IF THEN ELSE: IF THEN ELSEIF
Kod z naszego poprzedniego programu jest oczywiście uproszczony i uwzględnia możliwość uzyskania jedynie dwóch różnych od siebie wyników. Nie uwzględnia także możliwości wpisania dat, tekstów, liczb ujemnych itp. Jeśli chcemy, by nasz program w zależności od wypisanej danej mógł zwrócić 3 lub też więcej różnych od siebie wyników, modyfikujemy naszą instrukcję o klauzulę ELSE IF. Instrukcję możemy porównać do zagnieżdżonych dwóch lub więcej funkcji JEŻELI(WARUNEK_1; BLOK_KODU_1 ;JEŻELI(WARUNEK_2; BLOK KODU2; BLOK_KODU_3)). Spróbujmy zatem usprawnić nasz program stosując się do niżej zapisanych dodatkowych warunków:
- Opieramy nasz program o wprowadzanie zdefiniowanej zmiennej
- Dane wpisujemy w okienku InputBox, a sam wynik wyświetlany jest w formie komunikatu MsgBox
- Dla liczb ujemnych i większych niż 100 będziemy prezentować komunikat o błędnie wprowadzonych danych
Do dzieła !
Na sam początek spróbujmy napisać program, spełniający nasze 3 pierwsze warunki. Typ danych Variant stosujemy tutaj celowo, z uwagi na to, by można było wprowadzić daną zarówno tekstową jak i liczbową:
Sub ITEExample() 'definiujemy zmienne Dim VarAge As Variant Dim StrResult As String VarAge = InputBox("Wprowadź swój wiek") If VarAge > 100 Then StrResult = "Wprowadź poprawne dane" ElseIf VarAge >= 18 Then StrResult = "Pełnoletni" ElseIf VarAge < 0 Then StrResult = "Wprowadź poprawne dane" ElseIf VarAge < 18 Then StrResult = "Niepełnoletni" End If MsgBox StrResult End Sub
Warunki zagnieżdżone
Nasz kod uwzględnia już wszystkie możliwości, w przypadku, gdy wprowadzimy wiek jako liczbę naturalną. Spróbujmy teraz usprawnić nasz kod o warunki takie jak:
- Wprowadzimy komunikat o błędnie wpisanych danych dla wartości nienumerycznych
- Wiek z miejscem dziesiętnym zaokrąglamy do liczby całkowitej
W tym celu wprowadzimy instukcję IF THEN ELSEIF wewnątrz instrukcji IF THEN ELSE. W przypadku zaokrąglenia liczby z miejscem dziesiętnym zastosujemy prostą funkcję Round(). To, czy zmienna jest numeryczna sprawdzamy przy pomocy funkcji IsNumeric.
Sub ITEExample() 'definiujemy zmienne Dim VarAge As Variant Dim StrResult As String VarAge = InputBox("Wprowadź swój wiek") If IsNumeric(VarAge) = True Then VarAge = Round(VarAge, 0) 'zaokrąglenie bez miejsc dziesiętnych If VarAge > 100 Then StrResult = "Wprowadź poprawne dane" ElseIf VarAge >= 18 Then StrResult = "Pełnoletni" ElseIf VarAge < 0 Then StrResult = "Wprowadź poprawne dane" ElseIf VarAge < 18 Then StrResult = "Niepełnoletni" End If 'zakończenie instrukcji zagnieżdżonej Else: StrResult = "Wprowadź wartość liczbową" End If 'zakończenie warunku dotyczącego wprowadzania danych liczbowych MsgBox StrResult End Sub
Zadania (Rozwiązanie możesz wpisać w komentarzu)
5.1 Wykorzystując funkcje znakowe oraz instrukcję If Then Else napisz program, który na podstawie ostatniej litery wprowadzonego imienia określi, czy jest to kobieta, czy mężczyzna. Upraszając zadanie skupmy się na tym, że żeńskie imiona kończą się na literę „a”.
5.2 Korzystając z danych w arkuszu napisz program określający, czy komórka A1 jest pusta, czy też wypełniona
5.3 Analogicznie do przykładu z tego rozdziału napisz program, który na podstawie wprowadzonej daty urodzenia określi, czy osoba jest pełnoletnia, czy niepełnoletnia.
5.4 Zmodyfikuj w dowolny sposób przykład z tego rozdziału wykorzystując operator logiczny „OR”.
11 komentarzy “Instrukcja warunkowa If Then Else w Excel VBA”
czad, czekam na więcej
Sub kobieta_czy_mezczyzna()
Dim imie As String
imie = InputBox(„Podaj swoje imię”)
Range(„E2”) = Right(imie, 1)
If Range(„E2”) = „a” Then
plec = „kobieta”
Else
plec = „mężczyzna”
End If
Range(„E1”) = plec
End Sub
Sub czyPusta()
If Range(„A1”) = „” Then
Range(„A2”) = „Pusta”
Else
Range(„A2”) = „Wypełniona”
End If
End Sub
Sub czyPelnoletni()
If Range(„A1”) >= 18 Then
Range(„A2”) = „pełnoletni”
Else
Range(„A2”) = „niepełnoletni”
End If
End Sub
Sub CzyKobieta()
Dim strText As String
Dim StrResult As String
strText = InputBox(„Podaj Imie:”)
If Right(strText, 1) = „a” Then
StrResult = „kobieta”
Else: StrResult = „facet”
End If
MsgBox (StrResult)
End Sub
Sub CzyPusta()
Dim StrResult As String
If Range(„A1”).Value = Empty Then
StrResult = „pusta”
Else: StrResult = „pełna”
End If
MsgBox (StrResult)
End Sub
Sub zad16()
Dim data As Variant
Dim okienko As String
data = InputBox(„Podaj datę urodzenia w formacie: YYYY/MM/DD:”)
If IsDate(data) = True Then
If DateDiff(„yyyy”, data, Date) > 18 Then
okienko = „pełnoletni”
ElseIf DateDiff(„yyyy”, data, Date) = 18 And Month(data) – Month(Date) >= 0 And Day(Date) – Day(data) >= 0 Then
okienko = „pełnoletni”
Else
okienko = „niepełnoletni”
End If
Else
okienko = „Wprowadź prawidłowe dane”
End If
MsgBox (okienko)
End Sub
Wyjątek: „Beatrycze” jest żeńśkim imieniem, co też można zawrzeć w kodzie.
5.1
Option Explicit
Sub FinkcjaWarunkowaIf4()
Const strFemale As String = „Kobieta”
Const strMale As String = „Mężczyzna”
Dim strName As String
strName = Cells(2, 1)
If Len(strName) > 0 Then
If Right(strName, 1) = „a” Then
Cells(2, 4) = „Kobieta”
Else: Cells(2, 4) = „Mężczyzna”
End If
Else: End If
End Sub
5.2
Option Explicit
Sub FunkcjaWasrunkowaIf5()
Dim CzyPusta As Variant
CzyPusta = Cells(1, 1)
If Len(CzyPusta) > 0 Then
MsgBox „Niepusta”
Else: MsgBox „Pusta”
End If
End Sub
5.3
Option Explicit
Sub FunkcjaWarunkowaIf6()
Dim varWiek As Variant
Dim strOdp As String
Dim sglUrodziny As Single
varWiek = InputBox(„Wprowadź swoją datę urodzenia. Wymagany format to RRRR/MM/DD”, „Sprawdź czy jestes pełnoletni”)
sglUrodziny = DateDiff(„yyyy”, DateValue(varWiek), Date)
If sglUrodziny >= 18 Then
strOdp = „Jesteś pełnoletni”
Else:
strOdp = „Jesteś niepełnoletni”
End If
MsgBox strOdp
End Sub
5.4
Option Explicit
Sub FunkcjaWarunkowaIf7()
Dim varWiek As Variant
Dim strOdp As String
varWiek = InputBox(„Wprowadź swój wiek:”, „Sprawdź czy jestes pełnoletni”)
If varWiek < 0 Or varWiek > 100 Then
strOdp = „Podaj wiek w przedziale od 0 do 100 lat”
ElseIf varWiek >= 18 Then
strOdp = „Jesteś pełnoletni”
ElseIf varWiek < 18 Then
strOdp = „Jesteś niepełnoletni”
End If
MsgBox strOdp
End Sub
Sub Jeżeli_zad3i4()
Dim datBorn As Date
Dim varAge As Single
Dim strResult As String
datBorn = DateSerial(InputBox(„Rok urodzenia”), InputBox(„Miesiąc urodzenia”), InputBox(„Dzień urodzenia”))
varAge = DateDiff(„yyyy”, datBorn, Date, vbMonday)
If IsNumeric(varAge) = True Then
If Application.WorksheetFunction.Or(varAge > 100, varAge < 0) Then
strResult = „Wprowadź poprawne dane”
ElseIf varAge >= 18 Then
strResult = „pełnoletni”
ElseIf varAge < 18 Then
strResult = „niepełnoletni”
End If
Else: strResult = „Wproawdź liczby”
End If
MsgBox strResult
End Sub
Witam,
Zadanie 5,3 sprawiło mi trochę problemów. Aby program dokładnie liczył nie wystarczy odjąć roku, trzeba to jeszcze połączyć z miesiącami i dniami. Napisałem program, który przelicza ilość dni w ciągu 18 lat i porównuje to z wynikiem otrzymanym po odjęciu od siebie 2 dat.
Czy da się coś takiego napisać na podstawie samych dat bez dodatkowych wyliczeń?
Najłatwiej podziałać z funkcją datediff z interwałem rocznym
Zad. 1
Zad. 2
Zad. 3
Zad. 4
Sub Program3()
Dim Data As String
Dim DataRobocza As String
Dim Dzisiaj As Date
Dzisiaj = Date
Data = InputBox(„Podaj datę urodzenia w formacie YYYY/MM/DD:”)
'Data robocza to dzień i miesiąc z aktualnej daty oraz rok, w którym ktoś osiąga/osiągnął pełnoletność
DataRobocza = DatePart(„yyyy”, Data) & „/” & DatePart(„m”, Dzisiaj) & „/” & DatePart(„d”, Dzisiaj)
'Sprawdzenie, czy podana wartość jest datą
If IsDate(Data) = False Then
MsgBox („Błędne dane, podaj właściwą wartość”)
'Sprawdzenie, czy różnica w latach wynosi więcej lub mniej niż 18
Else
If DateDiff(„yyyy”, Data, Date) > 18 Then
MsgBox („Jesteś pełnoletni”)
ElseIf DateDiff(„yyyy”, Data, Date) < 18 Then
MsgBox („Jesteś niepełnoletni”)
'W przypadku roku, w którym osiągana jest pełnoletność – porównanie ilości dni
ElseIf DateDiff(„yyyy”, Data, Date) = 18 Then
If DateDiff(„y”, DateValue(DataRobocza), Data) <= 0 Then
MsgBox („Jesteś pełnoletni”)
Else
MsgBox („Jesteś niepełnoletni”)
End If
End If
End If
End Sub