Noen ganger gir Excel bare en melding i retning av “Excel har sluttet å fungere. Vi beklager eventuelle ulemper. ”
Når du får en slik melding, kan du trykke Ctrl + alt = "" + Slett og åpne arbeidsboken igjen (forhåpentligvis etter å ha lagret det arbeidet du hadde gjort!), Og ønsker å gå gjennom koden for å finne den fornærmende uttalelsen. Når du går trinnvis gjennom koden, kan alt fungere bra, men når du kjører den i full hastighet, kan den igjen krasje. Hvordan kan du finne den fornærmende uttalelsen?
Du kan skrive en enkel kodelinje mellom hver kodelinje som kan være den skyldige. Så VBA-koden kan opprinnelig se ut slik:
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
Denne prosedyren krasjer faktisk ikke, men den illustrerer hva du kan gjøre hvis du oppdager at koden krasjer når den kjøres i full hastighet, men ikke når du går gjennom den.
Du endrer ovennevnte kode til dette, med innsatte utsagn 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
Her er feilprosedyren:
Sub Bug(num As Integer) SaveSetting "EOTB2", "EOTB2", "EOTB2", num End Sub
Denne prosedyren lagrer en verdi i registeret. Syntaksen for SaveSetting er:

For de tre første parameterne, si at du bruker EOTB2 (for Excel utenfor boksen 2) - et tilfeldig utvalg. Du kan i stedet bruke SaveSetting "X", "X", "X", num. Hvis du bruker dette mye, kan du dra nytte av de tre nivåene AppName, Section og Key. På den måten, hvis du har mange seksjoner i AppName, kan du rydde opp i registeret for alle innstillingene dine ved å bruke den enkle DeleteSetting "EOTB2" (eller hva du enn angir for AppName), og alle seksjoner og nøkler vil også bli slettet.
Nå kjører du prosedyren i full fart, og den krasjer. Så du starter Excel på nytt, kommer til VBE, åpner Umiddelbart-vinduet (ved å trykke Ctrl + G), og skriver dette:
? GetSetting(“EOTB2”,”EOTB2”,”EOTB2”)
Hvis denne prosedyren, for eksempel, returnerer 4, krasjet den en gang etter Feil 4. Det er lite sannsynlig at If / End If-delen var skyldige; mer sannsynlig var det ActiveWorkbook.Unprotect SheetPassword. (Husk at dette bare er et eksempel, ikke hva som faktisk har skjedd.)
Hvis den første kjøringen av Feil 1, Feil 2 osv. Viser at prosedyren krasjet i en stor del av koden etter Feil x, kan du sette inn flere feilanrop for å begrense den ytterligere. Du gjør liksom et binært søk i en lang prosedyre for å finne synderen.

Denne gjesteartikkelen er fra Excel MVP Bob Umlas. Det er fra boken, Mer Excel utenfor boksen. For å se de andre emnene i boka, klikk her.