A volte Excel fornisce semplicemente un messaggio sulla falsariga di "Excel ha smesso di funzionare. Ci scusiamo per gli eventuali disagi. "
Quando ricevi un messaggio del genere, potresti premere Ctrl + alt = "" + Canc e aprire di nuovo la cartella di lavoro (si spera di aver salvato tutto il lavoro che hai fatto!), Volendo scorrere il codice per trovare l'affermazione incriminata. Quando si esegue un singolo passaggio nel codice, tutto può funzionare correttamente, ma quando lo si esegue a piena velocità, potrebbe bloccarsi nuovamente. Come puoi trovare la dichiarazione incriminata?
È possibile scrivere una semplice riga di codice tra ogni riga di codice che potrebbe essere il colpevole. Quindi il codice VBA potrebbe originariamente assomigliare a questo:
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
Questa procedura, infatti, non va in crash, ma illustra cosa si può fare se si scopre che il codice va in crash quando viene eseguito a piena velocità ma non quando lo si esegue.
Si modifica il codice sopra in questo, con le istruzioni inserite Bug 1, Bug 2, ecc .:
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
Ecco la procedura del bug:
Sub Bug(num As Integer) SaveSetting "EOTB2", "EOTB2", "EOTB2", num End Sub
Questa procedura salva un valore nel registro. La sintassi per SaveSetting è:

Per i primi tre parametri, supponi di utilizzare EOTB2 (per Excel Outside the Box 2), una selezione casuale. Puoi invece usare SaveSetting "X", "X", "X", num. Se lo usi molto, puoi sfruttare i tre livelli AppName, Section e Key. In questo modo, se hai molte sezioni in AppName, puoi ripulire il registro di tutte le tue impostazioni usando il semplice DeleteSetting "EOTB2" (o qualunque cosa tu abbia impostato per AppName), e anche tutte le sezioni e le chiavi verranno eliminate.
Ora esegui la procedura a piena velocità e si blocca. Quindi riavvia Excel, accedi a VBE, apri la finestra Immediata (premendo Ctrl + G) e digita questo:
? GetSetting(“EOTB2”,”EOTB2”,”EOTB2”)
Se questa procedura restituisce 4, per esempio, allora si è bloccata qualche tempo dopo il Bug 4. È improbabile che la sezione If / End If fosse il colpevole; più probabilmente era ActiveWorkbook.Unprotect SheetPassword. (Ricorda che questo è solo un esempio, non quello che è realmente accaduto.)
Se la tua esecuzione iniziale di Bug 1, Bug 2, ecc. Mostra che la procedura si è bloccata in un'ampia sezione di codice dopo Bug x, puoi inserire più chiamate di bug per restringerla ulteriormente. In una specie di ricerca binaria in una lunga procedura per trovare il colpevole.

Questo articolo ospite è tratto da Bob Umlas, MVP di Excel. È tratto dal libro More Excel Outside the Box. Per vedere gli altri argomenti del libro, fare clic qui.