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).
1 2 3 4 5 6 7 8 9 10 |
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.
1 2 3 4 5 |
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 w wielu liniach.
Jeżeli chcemy wykonać kilka instrukcji w przypadku spełnienia warunku, musimy zamknąć je w klamrze zakończonej isntrukcją End If.
1 2 3 4 5 6 |
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:
1 2 3 4 5 6 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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:
1 2 3 4 5 6 7 8 9 10 11 |
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.
1 2 3 4 5 6 7 8 9 10 11 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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ą
1 2 3 4 5 6 7 8 9 10 11 |
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 |
Subskrybuj RSS, lub polub blog na Facebooku aby otrzymywać najnowsze informacje o rozwoju kursu.
Comments 9
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
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
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
Dziękuję za pytanie. Jeżeli wcześniej napełnił Pan combo box wartościami, np. tak:
http://msdn.microsoft.com/en-us/library/office/gg508925(v=office.15).aspx
To później można użyć wartości combo box bezpośrednio w instrukcji IF.
If ComboBox3.Value < 100 Then
MsgBox "warunek nie został spełniony"
Else
MsgBox "warunek został spełniony"
End If
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ę.
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,
Dziękuję za (p)odpowiedź.
Witam,
Potrzebuje pomocy, może mieliście kiedyś juz takie zadanie do zrobienia. Treść zadania jakie mam do zrobienia:
Potrzebuje zrobić taki jakby program w excelu odnośnie potwierdzenia algorytmu.
Przykład:
Czy odrobiłeś zadanie domowe? Dopóki nie wybiore lub nie zaznacze „TAK” Nie będę mógł przejść od następnego zadania.
Było kiedyś cos takiego do zrobienia? Pomożecie?
Author
Polecam zapoznać się z częścią dotyczącą pętli.
http://www.123office.pl/2014/01/kurs-vba-cz-14-petle.html