Иногда 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
На самом деле эта процедура не вызывает сбоев, но показывает, что вы можете сделать, если обнаружите, что код дает сбой при запуске на полной скорости, но не при переходе через него.
Вы меняете приведенный выше код на этот со вставленными операторами Ошибка 1, Ошибка 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. (Помните, что это всего лишь пример, а не то, что произошло на самом деле.)
Если ваш первоначальный запуск Ошибки 1, Ошибки 2 и т. Д. Показывает, что процедура завершилась сбоем в большом разделе кода после Ошибки x, вы можете вставить больше вызовов ошибок, чтобы еще больше сузить ее. Вы как бы выполняете двоичный поиск в длинной процедуре, чтобы найти виновника.

Это гостевая статья от Боба Умласа, MVP по Excel. Это из книги «Больше Excel вне коробки». Чтобы увидеть другие темы в книге, щелкните здесь.