Instrukcja If Then Else w Excel VBA (wyjaśniona z przykładami)

W programie Excel VBA instrukcja IF Then Else umożliwia sprawdzenie warunku i wykonanie odpowiedniej akcji.

Jest to niezwykle cenne w wielu sytuacjach, jak zobaczymy w przykładach w dalszej części tego samouczka.

Aby podać prosty przykład, załóżmy, że masz listę ocen w programie Excel i chcesz wyróżnić wszystkich uczniów, którzy zdobyli A. Teraz, jeśli poproszę, abyś zrobił to ręcznie, sprawdzisz ocenę każdego ucznia i jeśli jest A, zaznaczysz go, a jeśli nie, to zostawisz go tak, jak jest.

Tę samą logikę można zbudować w VBA za pomocą Jeśli to inaczej również oświadczenie (i oczywiście o wiele więcej niż tylko podkreślanie ocen).

W tym samouczku pokażę Ci różne sposoby użycia konstrukcji „If Then Else” w Excel VBA oraz kilka praktycznych przykładów w działaniu.

Ale zanim przejdę do konkretów, podam składnię instrukcji „IF Then Else”.

Jeśli interesuje Cię nauka VBA w prosty sposób, zajrzyj na mój Szkolenie Excel VBA online.

Składnia - JEŻELI Wtedy inaczej

Poniżej znajduje się ogólna składnia konstrukcji If Then Else w VBA

Warunek JEŻELI Wtedy prawdziwy_kod [W przeciwnym razie fałszywy_kod]

Lub

Warunek JEŻELI To prawda_kod W przeciwnym razie fałszywy_kod Koniec JEŻELI

Zauważ, że Else część tej instrukcji jest opcjonalna.

Teraz, jeśli zastanawiasz się, jaka jest różnica między tymi dwiema składniami, pozwól mi wyjaśnić.

Pierwsza składnia to prosta jednowierszowa instrukcja IF THEN ELSE, w której nie trzeba używać instrukcji END IF.

Jednak w drugiej składni część true_code znajduje się w drugim wierszu. Jest to przydatne, gdy kod, który należy uruchomić w przypadku spełnienia warunku JEŻELI, jest długi i składa się z wielu wierszy.

Kiedy dzielisz instrukcję IF na wiele wierszy, musisz wskazać VBA, gdzie kończy się konstrukcja IF Then.

Dlatego musisz użyć instrukcji End IF.

Jeśli nie używasz End IF, gdy jest to wymagane, VBA wyświetli błąd - „Zablokuj IF bez END IF”

Przykłady użycia instrukcji IF Then w VBA

Aby dać ci wyobrażenie o tym, jak instrukcja IF-THEN działa w VBA, zacznę od kilku podstawowych przykładów (niektóre praktyczne i bardziej przydatne przykłady są omówione w dalszej części tego samouczka).

Załóżmy, że masz wynik ucznia w komórce A1 i chcesz sprawdzić, czy uczeń zdał egzamin, czy nie (próg zaliczenia to 35).

Następnie możesz użyć następującego kodu:

Sub CheckScore() If Range("A1").Value >=35 Then MsgBox "Pass" End Sub

Powyższy kod zawiera pojedynczy wiersz instrukcji IF, która sprawdza wartość w komórce A1.

Jeśli jest ich więcej niż 35, wyświetla się komunikat „Pass”.

Jeśli jest mniej niż 35, nic się nie dzieje.

Ale co, jeśli chcesz pokazać komunikat w obu przypadkach, czy uczeń zdał lub nie zdał egzaminu.

Poniższy kod zrobi to:

Sub CheckScore() If Range("A1").Value >= 35 Then MsgBox "Pass" Else MsgBox "Fail" End If End Sub

Powyższy kod używa instrukcji IF oraz instrukcji ELSE do wykonania dwóch różnych warunków. Gdy wynik jest większy niż (lub równy) 35, warunek JEŻELI jest prawdziwy, a kod znajdujący się tuż pod nim jest wykonywany (wszystko przed instrukcją Else).

Ale gdy warunek JEŻELI ma wartość FALSE, kod przeskakuje do części Else i wykonuje w niej blok kodu.

Zauważ, że kiedy używamy pojedynczego wiersza instrukcji IF Then, nie musimy używać End IF. Ale kiedy podzielimy go na więcej niż jedną linię, musimy użyć instrukcji End If.

Zagnieżdżone JEŻELI Then (Wiele instrukcji JEŻELI Then)

Do tej pory używaliśmy pojedynczej instrukcji IF Then.

Jeśli masz wiele warunków do sprawdzenia, możesz użyć:

  • Wiele warunków JEŻELI
  • Instrukcja If Then Else
  • JEŻELI Wtedy ElseIf Else konstrukcja

Pokażę ci, jak się one różnią i jak tego użyć w Excel VBA.

Wiele instrukcji IF Then

Weźmy ten sam przykład wykorzystania wyniku ucznia.

Jeśli uczeń uzyska mniej niż 35 punktów, wyświetlany jest komunikat „Nie zaliczony”, jeśli wynik jest większy lub równy 35, wyświetlany jest komunikat „Zaliczono”.

Aby to zrobić, możemy użyć poniższego kodu:

Sub CheckScore() If Range("A1").Value = 35 Then MsgBox "Pass" End Sub

Możesz użyć wielu instrukcji IF Then, jak pokazano powyżej. Chociaż to działa, nie jest to przykład dobrego kodowania (jak zobaczysz poniżej alternatywy).

Jeśli zdecydujesz się z tego skorzystać, pamiętaj, że te stwierdzenia powinny być niezależne lub wzajemnie się wykluczać. Ważną rzeczą, którą należy tutaj wiedzieć, jest to, że w powyższej konstrukcji wszystkie instrukcje IF są oceniane, a te, w których warunek jest prawdziwy, kod jest wykonywany.

Więc nawet jeśli pierwsza instrukcja IF jest poprawna, druga nadal będzie oceniana.

JEŻELI to inaczej oświadczenie

Załóżmy, że tym razem zamiast po prostu wyświetlać komunikat Pass/Fail, mamy jeszcze jeden warunek.

Jeśli uczeń uzyska mniej niż 35 punktów, wyświetlany jest komunikat „Nie”, jeśli wynik jest większy lub równy 35, wyświetlany jest komunikat „Zaliczono”, a jeśli wynik jest większy niż 80, wyświetlany jest komunikat to „Pass, with Distinction”.

Aby to zrobić, możemy użyć poniższego kodu:

Sub CheckScore() If Range("A1").Value < 35 Then MsgBox "Niepowodzenie" Else If Range("A1").Value < 80 Then MsgBox "Powodzenie" Else MsgBox "Powodzenie, z wyróżnieniem" Koniec Jeśli Koniec Jeśli Koniec Pod

W powyższym kodzie użyliśmy wielu instrukcji IF (zagnieżdżonych IF Then) za pomocą Else.

Tak więc istnieje konstrukcja „IF Then Else” w konstrukcji „IF Then Else”. Ten rodzaj zagnieżdżania umożliwia sprawdzenie wielu warunków i uruchomienie odpowiedniego bloku kodu.

IF to ElseIf Else Instrukcja

Powyższy kod (który widzieliśmy w poprzedniej sekcji) można dodatkowo zoptymalizować za pomocą instrukcji ElseIf.

Oto, co próbujemy zrobić - jeśli uczeń uzyska mniej niż 35 punktów, wyświetlany jest komunikat „Niepowodzenie”, jeśli wynik jest większy lub równy 35, wyświetlany jest komunikat „Zaliczono”, a jeśli liczba punktów przekracza 80, wyświetlany komunikat to „Pass, with Distinction”.

Sub CheckScore() If Range("A1").Value < 35 Then MsgBox "Fail" ElseIf Range("A1").Value < 80 Then MsgBox "Pass" Else MsgBox "Powodzenie, z wyróżnieniem" End If End Sub

Powyższy kod używa ElseIf, co pozwala nam zachować wszystkie warunki w jednej instrukcji IF Then.

Używanie AND i OR w IF Then Else

Jak dotąd w tym samouczku sprawdzaliśmy tylko jeden warunek na raz.

Jeśli jednak masz wiele warunków zależnych, możesz użyć instrukcji AND lub OR z warunkami IF.

Poniżej znajduje się składnia użycia warunku AND/OR z instrukcją IF Then.

JEŻELI Warunek1 ORAZ Warunek2 Następnie prawda_kod W przeciwnym razie fałszywy_kod Koniec JEŻELI

W powyższym kodzie tylko wtedy, gdy oba Warunek1 i Warunek2 są spełnione, true_code jest wykonywany. Nawet jeśli jeden z warunków jest fałszywy, wykona fałszywy_kod.

Z OR, nawet jeśli jeden z warunków jest spełniony, wykona true_code. Tylko wtedy, gdy wszystkie warunki są fałszywe, wykonuje fałszywy_kod.

Zobaczmy teraz, jak instrukcje AND i OR działają z konstrukcją IF Then Else.

Załóżmy, że masz wyniki dla dwóch przedmiotów zamiast jednego i chcesz sprawdzić następujące warunki:

  • Zawieść - Gdy wynik jest mniejszy niż 35 w którymkolwiek z przedmiotów.
  • Podawać - Gdy wynik jest większy lub równy 35, ale mniejszy niż 80 w obu przedmiotach.
  • Zdał z wyróżnieniem - Gdy wynik jest większy niż 35 w obu przedmiotach i jest większy lub równy 80 w jednym lub obu przedmiotach.

Oto kod, który to zrobi:

Sub CheckScore() If Range("A1").Value < 35 Or Range("B1").Value < 35 Then MsgBox "Fail" ElseIf Range("A1").Value < 80 And Range("B1"). Wartość < 80 Następnie MsgBox "Powodzenie" W przeciwnym razie MsgBox "Powodzenie, z wyróżnieniem" Koniec, jeśli Koniec Sub

Powyższy kod używa zarówno instrukcji OR, jak i AND.

Możesz również napisać ten sam kod z niewielką zmianą (używając OR zamiast AND).

Sub CheckScore() If Range("A1").Value < 35 Or Range("B1").Value 80 Or Range("B1").Value > 80 Then MsgBox "Powodzenie, z wyróżnieniem" Else MsgBox "Powodzenie" End Jeśli koniec Sub

Oba powyższe kody VBA dadzą ten sam wynik. Osobiście wolę ten pierwszy, ponieważ ma logiczny przepływ sprawdzania wyników (ale to tylko ja).

Używanie Nie równa się w If Then

We wszystkich powyższych przykładach użyliśmy warunków, które sprawdzają, czy wartość jest równa określonej wartości, czy nie.

Możesz również użyć podobnych kodów podczas sprawdzania, czy wartość nie jest równa określonej wartości w kodzie VBA. Nie równa się reprezentowanemu przez Excel VBA.

Aby zobaczyć praktyczny przykład użycia , spójrz na przykład 1 poniżej.

Używanie If Then Else z pętlami w VBA

Do tej pory przeszliśmy przez kilka przykładów, które są dobre, aby zrozumieć, jak działają stwierdzenia „IF-THEN” w VBA, jednak nie są przydatne w praktycznym świecie.

Jeśli muszę oceniać uczniów, mogę to łatwo zrobić za pomocą funkcji Excela.

Rzućmy więc okiem na kilka przydatnych i praktycznych przykładów, które mogą pomóc zautomatyzować niektóre rzeczy i być bardziej wydajnym.

Przykład 1 - Zapisz i zamknij wszystkie skoroszyty z wyjątkiem aktywnego skoroszytu

Jeśli masz otwartych wiele skoroszytów i chcesz szybko zamknąć wszystkie, z wyjątkiem aktywnego skoroszytu, możesz użyć poniższego kodu,

Sub SaveCloseAllWorkbooks() Dim wb As Workbook Dla każdego pliku wb In skoroszytów Po błędzie wznowienia next If wb.Name ActiveWorkbook.Name Then wb.Save wb.Close End If Next wb End Sub

Powyższy kod zapisze i zamknie wszystkie skoroszyty (oprócz aktywnego).

Wykorzystuje pętlę For Next do przechodzenia przez kolekcję wszystkich otwartych skoroszytów i sprawdza nazwę przy użyciu warunku JEŻELI.

Jeśli nazwa nie jest taka sama jak aktywnego skoroszytu, zapisuje go i zamyka.

Jeśli w którymkolwiek ze skoroszytów znajduje się kod VBA i nie zapisałeś go jako .xls lub .xlsm, zobaczysz ostrzeżenie (ponieważ kody vba zostaną utracone po zapisaniu go w formacie .xlsx).

Przykład 2 - Zaznacz komórki z wartościami ujemnymi

Załóżmy, że masz kolumnę pełną liczb i chcesz szybko podświetlić wszystkie komórki z wartościami ujemnymi na czerwono, możesz to zrobić za pomocą poniższego kodu.

Sub HighlightNegativeCells() Dim Cll jako zakres dla każdej wybranej komórki Jeśli Cll.Value < 0 Wtedy Cll.Interior.Color = vbRed Cll.Font.Color = vbWhite End If Next Cll End Sub

Powyższy kod używa pętli For Each i sprawdza każdą komórkę w zaznaczeniu, którego dokonałeś. Jeśli komórka ma wartość ujemną, jest podświetlona na czerwono z białą czcionką.

Przykład 3 - Ukryj cały arkusz roboczy z wyjątkiem bieżącego arkusza roboczego

Jeśli chcesz szybko ukryć wszystkie arkusze oprócz aktywnego, możesz użyć poniższego kodu:

Sub HideAllExceptActiveSheet() Dim ws As Worksheet Dla każdego ws In ThisWorkbook.Worksheets If ws.Name ActiveSheet.Name Then ws.Visible = xlSheetHidden Next ws End Sub

Powyższy kod używa pętli For Each do przechodzenia przez kolekcję arkuszy. Sprawdza nazwę każdego arkusza roboczego i ukrywa go, jeśli nie jest to aktywny arkusz.

Przykład 4 - Wyodrębnij część numeryczną z ciągu alfanumerycznego

Jeśli masz w komórkach ciągi alfanumeryczne i chcesz wyodrębnić z nich część numeryczną, możesz to zrobić za pomocą poniższego kodu:

Funkcja GetNumeric(CellRef As String) Dim StringLength As Integer StringLength = Len(CellRef) For i = 1 To StringLength If IsNumeric(Mid(CellRef, i, 1)) Then Result = Result & Mid(CellRef, i, 1) Next i GetNumeric = Wynik Koniec funkcji

Ten kod utworzy niestandardową funkcję w programie Excel, której można używać w arkuszu (tak jak zwykła funkcja).

Gdzie umieścić kod VBA?

Zastanawiasz się, gdzie w skoroszycie programu Excel znajduje się kod VBA?

Excel ma zaplecze VBA zwane edytorem VB. Musisz skopiować i wkleić kod w oknie kodu modułu VB Editor.

Oto kroki, aby to zrobić:

  1. Przejdź do zakładki Deweloper.
  2. Kliknij opcję Visual Basic. Spowoduje to otwarcie edytora VB w zapleczu.
  3. W okienku Eksplorator projektu w edytorze VB kliknij prawym przyciskiem myszy dowolny obiekt skoroszytu, do którego chcesz wstawić kod. Jeśli nie widzisz Eksploratora projektów, przejdź do karty Widok i kliknij Eksplorator projektów.
  4. Przejdź do Wstaw i kliknij Moduł. Spowoduje to wstawienie obiektu modułu do skoroszytu.
  5. Skopiuj i wklej kod w oknie modułu.

Będziesz pomóc w rozwoju serwisu, dzieląc stronę ze swoimi znajomymi

wave wave wave wave wave