Czasami program Excel po prostu wyświetla komunikat w stylu „Excel przestał działać. Przepraszamy za wszelkie niedogodności. ”
Kiedy otrzymasz taką wiadomość, możesz nacisnąć Ctrl + alt = "" + Delete i ponownie otworzyć skoroszyt (miejmy nadzieję, że zapisałeś wszystko, co wykonałeś!), Chcąc przejść przez kod, aby znaleźć obraźliwe stwierdzenie. Podczas wykonywania jednego kroku przez kod wszystko może działać dobrze, ale gdy uruchomisz go z pełną prędkością, ponownie może się zawiesić. Jak możesz znaleźć obraźliwe stwierdzenie?
Możesz napisać prosty wiersz kodu między każdym wierszem kodu, który może być winowajcą. Więc kod VBA może pierwotnie wyglądać mniej więcej tak:
Sub UICreation() Dim x As String On Error Resume Next x = Sheets("Scenario").Name If Err.Number 0 Then MsgBox "Current workbook needs to have a Scenario sheet!", vbCritical Exit Sub End If ActiveWorkbook.Unprotect WorkbookPassword Err.Clear ActiveWorkbook.Unprotect SheetPassword If Err.Number 0 Then MsgBox "Workbook cannot be unprotected by the macro.", vbCritical Exit Sub End If Application.OnTime Now, "More" ThisWorkbook.Sheets("FastPricer").Copy Before:=ActiveWorkbook.Sheets(1) End Sub
Ta procedura w rzeczywistości nie ulega awarii, ale ilustruje, co możesz zrobić, jeśli okaże się, że kod ulega awarii, gdy jest uruchamiany z pełną prędkością, ale nie podczas przechodzenia przez niego.
Zmieniasz powyższy kod na ten, wstawiając instrukcje Bug 1, Bug 2, itd .:
Sub UICreation() Dim x As String On Error Resume Next Bug 1 x = Sheets("Scenario").Name Bug 2 If Err.Number 0 Then MsgBox "Current workbook needs to have a Scenario sheet!", vbCritical Exit Sub End If Bug 3 ActiveWorkbook.Unprotect WorkbookPassword Err.Clear Bug 4 ActiveWorkbook.Unprotect SheetPassword If Err.Number 0 Then MsgBox "Workbook cannot be unprotected by the macro.", vbCritical Exit Sub End If Bug 5 Application.OnTime Now, "More" Bug 6 ThisWorkbook.Sheets("FastPricer").Copy Before:=ActiveWorkbook.Sheets(1) End Sub
Oto procedura błędu:
Sub Bug(num As Integer) SaveSetting "EOTB2", "EOTB2", "EOTB2", num End Sub
Ta procedura zapisuje wartość w rejestrze. Składnia SaveSetting to:

Dla pierwszych trzech parametrów powiedz, że używasz EOTB2 (dla programu Excel Outside the Box 2) - losowego wyboru. Zamiast tego możesz użyć SaveSetting „X”, „X”, „X”, num. Jeśli często tego używasz, możesz skorzystać z trzech poziomów AppName, Section i Key. W ten sposób, jeśli masz wiele sekcji w AppName, możesz wyczyścić rejestr dla wszystkich swoich ustawień za pomocą prostego DeleteSetting „EOTB2” (lub cokolwiek ustawisz dla AppName), a wszystkie sekcje i klucze również zostaną usunięte.
Teraz uruchamiasz procedurę z pełną prędkością i ulega awarii. Więc ponownie uruchamiasz Excel, przejdź do VBE, otwórz okno bezpośrednie (naciskając Ctrl + G) i wpisz:
? GetSetting(“EOTB2”,”EOTB2”,”EOTB2”)
Jeśli ta procedura zwróci na przykład 4, to uległa awarii jakiś czas po błędzie 4. Jest mało prawdopodobne, że winowajcą była sekcja If / End If; bardziej prawdopodobne, że był to ActiveWorkbook.Unprotect SheetPassword. (Pamiętaj, że to tylko przykład, a nie to, co się faktycznie wydarzyło).
Jeśli pierwsze uruchomienie Bug 1, Bug 2 itd. Pokazuje, że procedura uległa awarii w dużej sekcji kodu po Bug x, możesz wstawić więcej wywołań błędów, aby jeszcze bardziej zawęzić. W pewnym sensie wyszukujesz binarnie w długiej procedurze, aby znaleźć winowajcę.

Ten artykuł gościnny pochodzi od MVP programu Excel, Boba Umlasa. Pochodzi z książki More Excel Outside the Box. Aby zobaczyć inne tematy w książce, kliknij tutaj.