Jak ustawić breakpoint dla zdarzenia np. Workbook_Open

przez | 2024-05-14

Tworząc różnego rodzaju makra bardzo często śledzę kod krok po kroku (debugguje), aby dowiedzieć się, dlaczego coś nie działa. Pewnie nie raz ustawiasz w różnych miejscach w kodzie „breakpointy”.

Niestety, ale zamykając skoroszyt (w przypadku Worda będzie to dokument) czyszczone są wszystkie wcześniej ustawione breakpointy.

Problem pojawia się wtedy, gdy chcę prześledzić krok po kroku np. zdarzenie Workbook_Open (dla uproszenia odnoszę się w tym wpisie do Excela, w przypadku Worda będzie to bliźniacze zdarzenie Document_Open). Jak wcześniej wspominałem: gdy zamknę skoroszyt to są czyszczone breakpointy więc otwierając owy skoroszyt na nowo nie mogę krok po kroku prześledzić, co się dzieje w zdarzeniu Workbook_Open.

Owszem mogę kombinować poprzez skopiowanie kodu z Workbook_Open do nowej procedury i debuggować ową procedurę, ale w przypadku nieco bardziej skomplikowanego kodu może to być utrudnione (np. mam też kod inicjujący wstążkę, nie wiem w jakiej kolejności wykonują się zdarzenia a podczas ładowania skoroszytu są inicjowane różne zmienne globalne itp.)

Na szczęście jest jeden dość ciekawy sposób na obejście tego problemu.

Otóż jest dość ciekawa metoda Debug.Assert. Powoduje ona przerwanie wykonywania kodu (tak jakby w tej linii był ustawiony breakpoint), gdy wyrażenie po Debug.Assert zwraca wartość False.

Może nieco zagmatwałem, ale jak rzucisz okiem na poniższy kod, to wszystko zrozumiesz:

Function isFileExists(File As String) As Boolean
    Dim fso As FileSystemObject
    Set fso = New FileSystemObject
    
    isFileExists = fso.FileExists(File)
    Set fso = Nothing
End Function


Sub Test_Debug_Assert()
    Dim Z As Boolean
    
    Z = isFileExists(ThisWorkbook.Path + "\opcje.ini")
    
    Debug.Assert Z
End Sub

Mamy tutaj bardzo prostą procedurę Test_Debug_Assert, która sprawdza czy w katalogu w którym jest skoroszyt istnieje plik o nazwie opcje.ini. Funkcja o nazwie isFileExists zwraca wartość True gdy sprawdzany plik istnieje, lub False gdy on nie istnieje.

W zmiennej Z jest przechowywany wynik funkcji isFileExists. I jeśli plik nie istnieje (w zmiennej Z będzie wartość False) to wykonywanie kodu zostanie przerwane na linijce w której jest wywołanie metody Debug.Assert (tak jakbym na tej linijce ręcznie ustawił breakpointa). Jeśli plik istnieje (w zmiennej Z będzie wartość True) to kod normalnie dalej się będzie wykonywał.

Poniższy zrzut ekranu ilustruje jak wygląda wykonywanie kodu, gdy plik nie istnieje

W ten sposób można wygodnie w kodzie ustawiać „na stałe” różnego rodzaju pułapki w miejscach gdzie coś pójdzie nie tak (np. nie uda się załadować jakiegoś pliku).

Ale nie o tym tutaj mowa.

Otóż jeśli chcesz ustawić breakpointa w zdarzeniu Workbook_Open to na samym początku możesz wpisać taką oto magiczną linijkę:

    Debug.Assert False

Jest to nic innego jak „ustawiony na stałe breakpoint”. Gdy uda się Tobie przeanalizować wykonywany kod, to należy wtedy taką linijkę zakomentować, aby ta pułapka nie została w produkcyjnej wersji kodu.

Wskazówka: zamiast Debug.Assert False można też użyć instrukcji Stop, która robi dokładnie to samo

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.