Іноді 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 такий:

Для перших трьох параметрів скажіть, що ви використовуєте EOTB2 (для Excel Outside the 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 нестандартно". Щоб переглянути інші теми книги, натисніть тут.