Стесняване на причините за срив - Съвети на Excel

Понякога Excel просто изпраща съобщение по линия на „Excel е спрял да работи. Съжаляваме за евентуалните неудобства. "

Когато получите такова съобщение, можете да натиснете Ctrl + alt = "" + Delete и да отворите работната книга отново (надяваме се, че сте запазили каквато и да е работа, която сте свършили!), Желаейки да преминете през кода, за да намерите нарушаващото твърдение. Когато преминавате през една стъпка през кода, всичко може да работи добре, но когато го стартирате с пълна скорост, отново може да се срине. Как можете да намерите обидното твърдение?

Можете да напишете прост ред код между всеки ред код, който може да бъде виновникът. Така че кодът на VBA може първоначално да изглежда по следния начин:

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

Тази процедура всъщност не се срива, но илюстрира какво можете да направите, ако откриете, че кодът се срива, когато се изпълнява с пълна скорост, но не и когато го преминете.

Променяте горния код на този, с вмъкнати изрази Bug 1, Bug 2 и т.н .:

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

Ето процедурата за грешки:

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

Тази процедура записва стойност в системния регистър. Синтаксисът за SaveSetting е:

Синтаксис на SaveSetting

За първите три параметъра кажете, че използвате EOTB2 (за Excel Outside Box 2) - произволен избор. Вместо това можете да използвате SaveSetting "X", "X", "X", num. Ако използвате това много, можете да се възползвате от трите нива AppName, Section и Key. По този начин, ако имате много раздели в AppName, можете да изчистите регистъра за всичките си настройки, като използвате простото DeleteSetting "EOTB2" (или каквото и да сте задали за AppName) и всички раздели и ключове също ще бъдат изтрити.

Сега изпълнявате процедурата с пълна скорост и тя се срива. Така че рестартирайте Excel, стигнете до VBE, отворете незабавния прозорец (чрез натискане на Ctrl + G) и въведете това:

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

Ако тази процедура връща 4, например, тогава тя се е сринала някъде след грешка 4. Малко вероятно е раздела If / End If да е виновникът; по-вероятно беше ActiveWorkbook.Unprotect SheetPassword. (Не забравяйте, че това е само пример, а не какво всъщност се е случило.)

Ако първоначалното ви изпълнение на Bug 1, Bug 2 и т.н. покаже, че процедурата се е сринала в голяма част от кода след Bug x, можете да вмъкнете още повиквания за грешки, за да стесните допълнително. Извършвате двоично търсене в дълга процедура, за да намерите виновника.

Тази статия за гости е от Excel MVP Боб Умлас. Това е от книгата „Още Excel извън кутията“. За да видите останалите теми в книгата, щракнете тук.

Интересни статии...