Uneori, Excel oferă pur și simplu un mesaj pe linia „Excel a încetat să funcționeze. Ne pare rău pentru orice inconvenient. ”
Când primiți un astfel de mesaj, este posibil să apăsați Ctrl + alt = "" + Ștergeți și să deschideți din nou registrul de lucru (sperăm că ați salvat orice lucru ați făcut!), Dorind să treceți prin cod pentru a găsi declarația contravențională. Când faceți un singur pas prin cod, toate pot funcționa bine, dar când îl rulați la viteză maximă, încă o dată se poate bloca. Cum puteți găsi declarația jignitoare?
Puteți scrie o linie simplă de cod între fiecare linie de cod care ar putea fi vinovatul. Deci, codul VBA poate arăta inițial așa:
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
De fapt, această procedură nu se blochează, dar ilustrează ce puteți face dacă găsiți că codul se blochează atunci când este rulat la viteză maximă, dar nu când îl parcurgeți.
Schimbați codul de mai sus cu acesta, cu instrucțiunile inserate Bug 1, Bug 2 etc.:
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
Iată procedura de eroare:
Sub Bug(num As Integer) SaveSetting "EOTB2", "EOTB2", "EOTB2", num End Sub
Această procedură salvează o valoare în registru. Sintaxa pentru SaveSetting este:

Pentru primii trei parametri, spuneți că utilizați EOTB2 (pentru Excel Outside the Box 2) - o selecție aleatorie. Puteți utiliza în schimb SaveSetting "X", "X", "X", num. Dacă folosești mult acest lucru, poți profita de cele trei niveluri AppName, Section și Key. În acest fel, dacă aveți multe secțiuni în AppName, puteți curăța registrul pentru toate setările dvs. utilizând DeleteSetting simplu "EOTB2" (sau orice ați setat pentru AppName) și toate secțiunile și cheile vor fi, de asemenea, șterse.
Acum rulați procedura la viteză maximă și se blochează. Deci reporniți Excel, ajungeți la VBE, deschideți fereastra Imediat (apăsând Ctrl + G) și tastați acest lucru:
? GetSetting(“EOTB2”,”EOTB2”,”EOTB2”)
Dacă această procedură returnează 4, de exemplu, atunci s-a prăbușit cândva după Bug 4. Este puțin probabil ca secțiunea If / End If să fie vinovată; mai probabil era ActiveWorkbook.Unprotect SheetPassword. (Amintiți-vă că acesta este doar un exemplu, nu ceea ce sa întâmplat de fapt.)
Dacă lansarea inițială a Bug-ului 1, Bug-ului 2 etc. arată că procedura s-a blocat într-o secțiune mare de cod după Bug-ul x, puteți insera mai multe apeluri de bug-uri pentru a-l restrânge în continuare. Faceți un fel de căutare binară într-o procedură lungă pentru a găsi vinovatul.

Acest articol invitat este de la Excel MVP Bob Umlas. Este din cartea, Mai mult Excel în afara cutiei. Pentru a vedea celelalte subiecte din carte, faceți clic aici.