Včasih Excel preprosto pošlje sporočilo v skladu z besedilom »Excel je prenehal delovati. Opravičujemo se za morebitne nevšečnosti. "
Ko prejmete takšno sporočilo, lahko pritisnete Ctrl + alt = "" + Delete in znova odprete delovni zvezek (upajmo, da ste shranili vse opravljeno delo!), Če želite stopiti skozi kodo in poiskati žaljivo izjavo. Ko v enem koraku pregledujete kodo, lahko vse deluje v redu, ko pa jo zaženete s polno hitrostjo, se lahko znova sesuje. Kako lahko najdete žaljivo izjavo?
Med vsako vrstico kode lahko napišete preprosto vrstico kode, ki bi lahko bila krivec. Koda VBA je torej lahko prvotno videti nekako tako:
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
Ta postopek dejansko ne zruši, vendar ponazarja, kaj lahko storite, če ugotovite, da se koda zruši pri polni hitrosti, ne pa tudi, ko stopite skozinjo.
Zgornjo kodo spremenite v to z vstavljenimi stavki Bug 1, Bug 2 itd.:
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
Tu je postopek hroščev:
Sub Bug(num As Integer) SaveSetting "EOTB2", "EOTB2", "EOTB2", num End Sub
Ta postopek shrani vrednost v register. Sintaksa za SaveSetting je:

Za prve tri parametre recimo, da uporabljate EOTB2 (za Excel Outside the Box 2) - naključno izbiro. Namesto tega lahko uporabite SaveSetting "X", "X", "X", num. Če to veliko uporabljate, lahko izkoristite tri ravni AppName, Section in Key. Če imate v AppName veliko odsekov, lahko s pomočjo preprostega DeleteSetting "EOTB2" (ali kar koli že določite za AppName) počistite register za vse nastavitve, vsi razdelki in ključi pa bodo tudi izbrisani.
Zdaj postopek zaženete s polno hitrostjo in se zruši. Torej znova zaženete Excel, pridete do VBE, odprete okno Takoj (s pritiskom na Ctrl + G) in vnesete to:
? GetSetting(“EOTB2”,”EOTB2”,”EOTB2”)
Če ta postopek na primer vrne 4, potem se je zrušil nekje po hrošču 4. Malo verjetno je, da je bil krivec razdelek If / End If; bolj verjetno je bila to ActiveWorkbook.Unprotect SheetPassword. (Ne pozabite, da je to le primer in ne kaj se je dejansko zgodilo.)
Če vaš začetni zagon Bug 1, Bug 2 itd. Pokaže, da se je postopek po velikem delu kode zrušil po Bug x, lahko vstavite več klicev napak, da ga še zožite. Nekako binarno iščete v dolgem postopku, da najdete krivca.

Ta gostujoči članek je iz Excelovega MVP-ja Bob Umlas. Nahaja se v knjigi Več Excel zunaj škatle. Če si želite ogledati druge teme v knjigi, kliknite tukaj.