Nogle gange giver Excel simpelthen en besked i retning af ”Excel er stoppet med at virke. Vi beklager ulejligheden. ”
Når du får en sådan besked, kan du trykke på Ctrl + alt = "" + Slet og åbne projektmappen igen (forhåbentlig har du gemt det arbejde, du havde udført!), Og ønsker at gå igennem koden for at finde den krænkende erklæring. Når du går igennem koden enkeltvis, fungerer alt muligvis fint, men når du kører det i fuld hastighed, kan det igen gå ned. Hvordan kan du finde den krænkende erklæring?
Du kan skrive en simpel kodelinje mellem hver kodelinje, der kan være synderen. Så VBA-koden kan oprindeligt se sådan ud:
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 procedure går faktisk ikke ned, men den illustrerer, hvad du kan gøre, hvis du finder ud af, at koden går ned, når den køres i fuld hastighed, men ikke når du går igennem den.
Du ændrer ovenstående kode til dette med indsatte udsagn Bug 1, Bug 2 osv .:
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 fejlproceduren:
Sub Bug(num As Integer) SaveSetting "EOTB2", "EOTB2", "EOTB2", num End Sub
Denne procedure gemmer en værdi i registreringsdatabasen. Syntaksen for SaveSetting er:

For de første tre parametre skal du sige, at du bruger EOTB2 (til Excel uden for boks 2) - et tilfældigt valg. Du kan i stedet bruge SaveSetting "X", "X", "X", num. Hvis du bruger dette meget, kan du drage fordel af de tre niveauer AppName, sektion og nøgle. På den måde, hvis du har mange sektioner i AppName, kan du rydde op i registreringsdatabasen for alle dine indstillinger ved hjælp af den enkle DeleteSetting "EOTB2" (eller hvad du end angiver til AppName), og alle sektioner og nøgler slettes også.
Nu kører du proceduren i fuld hastighed, og den går ned. Så du genstarter Excel, kommer til VBE, åbner vinduet Umiddelbart (ved at trykke på Ctrl + G) og skriver dette:
? GetSetting(“EOTB2”,”EOTB2”,”EOTB2”)
Hvis denne procedure f.eks. Returnerer 4, styrtede den ned engang efter Bug 4. Det er usandsynligt, at sektionen If / End If var skyldige; mere sandsynligt var det ActiveWorkbook.Unprotect SheetPassword. (Husk at dette kun er et eksempel, ikke hvad der faktisk er sket.)
Hvis din oprindelige kørsel af Bug 1, Bug 2 osv. Viser, at proceduren styrtede ned i et stort afsnit af kode efter Bug x, kan du indsætte flere bug-opkald for at indsnævre den yderligere. Du slags foretager en binær søgning i en lang procedure for at finde synderen.

Denne gæsteartikel er fra Excel MVP Bob Umlas. Det er fra bogen, Mere Excel uden for boksen. Klik her for at se de andre emner i bogen.