Niekedy program Excel jednoducho pošle správu v tvare „Program Excel prestal fungovať. Ospravedlňujeme sa za prípadné nepríjemnosti. “
Keď dostanete takúto správu, môžete stlačiť Ctrl + alt = "" + Odstrániť a znova otvoriť zošit (dúfajme, že ste si uložili všetku prácu, ktorú ste vykonali!) A chceli by ste v kóde nájsť hľadanie nevhodného výroku. Pri jednokrokovom prepracovaní kódu môže všetko fungovať dobre, ale pri spustení pri plnej rýchlosti sa môže znova zrútiť. Ako môžete nájsť priestupkové vyhlásenie?
Medzi každý riadok kódu, ktorý môže byť vinníkom, môžete napísať jednoduchý riadok kódu. Kód VBA teda môže pôvodne vyzerať asi takto:
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
Tento postup v skutočnosti nezráža, ale ilustruje, čo môžete urobiť, ak zistíte, že kód zlyhá pri spustení plnou rýchlosťou, ale nie pri jeho prechádzaní.
Vyššie uvedený kód zmeníte na tento s vloženými príkazmi Bug 1, Bug 2 atď .:
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 postup pri chybe:
Sub Bug(num As Integer) SaveSetting "EOTB2", "EOTB2", "EOTB2", num End Sub
Tento postup uloží hodnotu do registra. Syntax pre SaveSetting je:

Pri prvých troch parametroch povedzme, že používate EOTB2 (pre Excel mimo rámca 2) - náhodný výber. Namiesto toho môžete použiť SaveSetting "X", "X", "X", num. Ak ich používate veľa, môžete využiť tri úrovne AppName, Section a Key. Týmto spôsobom, ak máte v AppName viac sekcií, môžete vyčistiť register všetkých vašich nastavení pomocou jednoduchého príkazu DeleteSetting „EOTB2“ (alebo čohokoľvek, čo ste nastavili pre AppName) a všetky sekcie a kľúče sa tiež odstránia.
Teraz spustíte postup pri plnej rýchlosti a zlyhá. Takže reštartujete program Excel, dostanete sa k VBE, otvoríte okno Immediate (stlačením Ctrl + G) a napíšete toto:
? GetSetting(“EOTB2”,”EOTB2”,”EOTB2”)
Ak napríklad tento postup vráti hodnotu 4, došlo k jeho zlyhaniu niekedy po chybe 4. Je nepravdepodobné, že by bola vinou sekcia If / End If; pravdepodobnejšie to bol ActiveWorkbook.Unprotect SheetPassword. (Pamätajte, že toto je iba príklad, nie to, čo sa skutočne stalo.)
Ak vaše počiatočné spustenie chyby 1, chyby 2 atď. Ukazuje, že postup zlyhal vo veľkej časti kódu po chybe x, môžete vložiť ďalšie hovory s chybou, aby ste ju ešte viac zúžili. Nejakým spôsobom urobíte binárne hľadanie v dlhom postupe, aby ste našli vinníka.

Tento článok je hosťom programu Excel MVP Boba Umlasa. Je to z knihy More Excel Outside the Box. Ak si chcete pozrieť ďalšie témy v knihe, kliknite sem.