End Sub w środku procedury?
Każda procedura VBA musi zawierać początek i koniec. Słowo Sub z nazwą makra jest na początku, a koniec wyznacza linijka End Sub. Zanim przejdziemy do Exit Sub zobacz jak wygląda prawidłowa konstrukcja procedury.
![](https://www.dariuszskorniewski.pl/wp-content/uploads/2020/06/Przechwytywanie.png)
Instrukcja zakończenia procedury może pojawić się również w środku kodu, jednak edytor VBA nie pozwoli na dwukrotne użycie polecenia End Sub.
![](https://www.dariuszskorniewski.pl/wp-content/uploads/2020/06/Przechwytywanie-1.png)
Exit Sub przybywa na ratunek
W sytuacji pojawienia się drugiego polecenia End Sub edytor VBA wyświetli błąd. Dla edytora wszystko co jest po End Sub powinno być komentarzem, albo początkiem nowej procedury. W tym wypadku drugie End Sub nie może istnieć bez początku nowej procedury.
Jest jednak możliwość przerwania całej procedury jeśli zamiast słowa End zastosujemy Exit.
![Exit Sub pozwala przerwać makro](https://www.dariuszskorniewski.pl/wp-content/uploads/2020/06/Przechwytywanie-2.png)
Oczywiście przerwanie procedury powinno mieć jakieś logiczne uzasadnienie, dlatego polecenie Exit Sub często poprzedzone jest instrukcją warunkową If.
Przykład procedury z zastosowaniem Exit Sub
Stworzyłem prosty przykład z kolumną zawierającą wartości liczbowe od 10 do -5.
![](https://www.dariuszskorniewski.pl/wp-content/uploads/2020/06/image-1.png)
W ramach pętli For Next procedura sprawdzać będzie wartości kolejnych komórek. Pętla For Next wykorzystuje w działaniu zmienną liczbową, dlatego zadeklarowałem zmienną k, która przyjmować będzie kolejne wartości przy przechodzeniu pętli.
![](https://www.dariuszskorniewski.pl/wp-content/uploads/2020/06/image.png)
W takiej formie pętla rozpocznie swoje działanie od wiersza drugiego, a zakończy dochodząc do końca zakresu danych. Zapis [a1].End(xlDown).Row pozwala na uzyskanie informacji jaki jest ostatni numer wiersza, który zawiera jakieś dane. To tylko jedna z metod na wyznaczanie końca zakresu.
Pora na dodanie warunku, który spowoduje przerwanie pętli. Wykorzystując metodę Cells, w której odwołam się do zmiennej k jako numeru wiersza sprawdzę, czy wartość komórki jest mniejsza od 0. Jeśli warunek się spełni spełniony to polecenie przerwie procedurę. Mogę dodać jeszcze komunikat, który poinformuje mnie o tym fakcie. Ważne jest to, aby komunikat znalazł się przed poleceniem Exit Sub. Jeśli umieszczę komunikat po Exit Sub to nie zostanie on nigdy wyświetlony.
![komunikat musi być przed Exit Sub jeśli ma się wyświetlić](https://www.dariuszskorniewski.pl/wp-content/uploads/2020/06/image-3.png)
Jeśli przetestujesz to makro dla takich samych danych jak moje to za każdym razem pojawi się ten komunikat. Żeby mieć pewność, że makro zostanie przerwane zamieszczę przed końcem procedury linijkę z komunikatem „Koniec programu”.
![Exit Sub nie pozwoli na wyświetlenie komunikatu Koniec programu](https://www.dariuszskorniewski.pl/wp-content/uploads/2020/06/image-5.png)
Exit For?
Ten komunikat nigdy się nie wyświetli, chyba, że zmodyfikuję dane. Polecenie Exit służy jednak nie tylko przerywaniu procedury. Można przerwać nim również pętlę i w przypadku pętli For Next pełne polecenie przerywające pętlę brzmi Exit For.
![](https://www.dariuszskorniewski.pl/wp-content/uploads/2020/06/image-6.png)
2 thoughts on “Exit Sub czy End Sub? Co za różnica?”
Dzień dobry, nie można pobrać pliku.
Hej Kornelia, dziękuję za zwrócenie uwagi. Poprawiłem plik i już można pobrać.