Att begränsa vad som orsakade ett krasch - Excel Tips

Ibland ger Excel helt enkelt ett meddelande i stil med ”Excel har slutat fungera. Vi är ledsna för eventuella besvär. ”

När du får ett sådant meddelande kan du trycka på Ctrl + alt = "" + Radera och öppna arbetsboken igen (förhoppningsvis efter att ha sparat vad du har gjort!), Vill du gå igenom koden för att hitta det kränkande uttalandet. När du går igenom koden kan allt fungera bra, men när du kör den i full hastighet kan det återigen krascha. Hur kan du hitta det kränkande uttalandet?

Du kan skriva en enkel kodrad mellan varje kodrad som kan vara den skyldige. Så VBA-koden kan ursprungligen se ut så här:

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

Den här proceduren kraschar faktiskt inte, men den illustrerar vad du kan göra om du upptäcker att koden kraschar när den körs i full hastighet men inte när du går igenom den.

Du ändrar ovanstående kod till detta, med infogade uttalanden 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

Här är felproceduren:

Sub Bug(num As Integer) SaveSetting "EOTB2", "EOTB2", "EOTB2", num End Sub

Den här proceduren sparar ett värde i registret. Syntaxen för SaveSetting är:

SaveSetting Syntax

För de tre första parametrarna, säg att du använder EOTB2 (för Excel utanför rutan 2) - ett slumpmässigt val. Du kan istället använda SaveSetting "X", "X", "X", num. Om du använder detta mycket kan du dra nytta av de tre nivåerna AppName, Avsnitt och Nyckel. På det sättet, om du har många sektioner i AppName, kan du rensa registret för alla dina inställningar genom att använda den enkla DeleteSetting "EOTB2" (eller vad du än ställer in för AppName), och alla sektioner och nycklar kommer också att raderas.

Nu kör du proceduren i full fart och den kraschar. Så du startar om Excel, kommer till VBE, öppnar Omedelbart fönster (genom att trycka på Ctrl + G) och skriver detta:

? GetSetting(“EOTB2”,”EOTB2”,”EOTB2”)

Om den här proceduren till exempel returnerar 4 kraschade den någon gång efter Bug 4. Det är osannolikt att avsnittet If / End If var den skyldige; mer sannolikt var det ActiveWorkbook.Unprotect SheetPassword. (Kom ihåg att detta bara är ett exempel, inte vad som faktiskt har hänt.)

Om din första körning av Bug 1, Bug 2, etc. visar att proceduren kraschade i ett stort avsnitt av kod efter Bug x, kan du infoga fler bug-anrop för att begränsa det ytterligare. Du gör typ av en binär sökning i en lång procedur för att hitta den skyldige.

Den här gästartikeln kommer från Excel MVP Bob Umlas. Det är från boken, Mer Excel utanför lådan. Klicka här för att se de andra ämnena i boken.

Intressanta artiklar...