Отобразить сообщение и заблокировать книгу в случае ошибки

#excel #vba

#excel #vba

Вопрос:

У меня есть код VBA для выполнения нескольких операций. Он разблокирует Рабочую книгу перед запуском и защищает после завершения операции. Однако иногда код выдает ошибку из-за того, что пользователь открывает Windows или делает что-то в фоновом режиме. Я бы хотел, чтобы отображалось не какое-либо стандартное сообщение Visual Basic типа «Ошибка компиляции», а мое пользовательское сообщение всякий раз, когда код запускается с ошибкой любого типа и используется ThisWorkbook.Protect Password:="123456", Structure:=True, Windows:=False .

P.S. Из-за временного перерыва операционная система на моем компьютере не может обрабатывать процессы так быстро.

 Sub TryToDoEverything()
Application.ScreenUpdating = False
ThisWorkbook.Unprotect Password:="123456"

    ufProgress.LabelProgress.Width = 0
    ufProgress.Show

FractionComplete (0) 'Next step

Worksheets("MAIN").Activate

Call MakeMyFolder
Application.Wait (Now   TimeValue("00:00:10"))
DoEvents
FractionComplete (0.1) 'Next step

If ThisWorkbook.Sheets("Other Data").Range("J2").Value = True Then
Call opentemplateWordOL
End If
If ThisWorkbook.Sheets("Other Data").Range("J2").Value = False Then
End If

DoEvents
FractionComplete (0.2) 'Next step
Application.Wait (Now   TimeValue("00:00:10"))

If ThisWorkbook.Sheets("Other Data").Range("J2").Value = True Then
Call opentemplateWordPL
End If
If ThisWorkbook.Sheets("Other Data").Range("J2").Value = False Then
End If

DoEvents
FractionComplete (0.4) 'Next step
Application.Wait (Now   TimeValue("00:00:10"))

FractionComplete (1) 'Next step

Worksheets("MAIN").Activate

Unload ufProgress

ThisWorkbook.Protect Password:="123456", Structure:=True, Windows:=False

    TaskComplete.Show
Application.ScreenUpdating = True
End Sub
  

Ответ №1:

По моему опыту, не рекомендуется использовать эту рабочую книгу много раз, в начале вашего кода используйте следующее,

 dim thisWb as excel.workbook
set thisWb = thisworkbook
  

тогда вместо ThisWorkbook используйте thisWb, и не будет иметь значения, нажмет ли пользователь на другой wb во время выполнения.

Комментарии:

1. Спасибо за полезный совет. Однако я хотел бы добавить ошибку if в свой код.

2. Это необоснованный и бесполезный совет, который добавляет ненужный уровень косвенности, который скрывает, с какой книгой мы работаем. ThisWorkbook — это идентификатор всего проекта, который содержит ссылку на конкретную книгу, содержащую запущенный код VBA. Этот ответ содержит хороший, основательный совет о ActiveWorkbook и превращает его в плохой совет о ThisWorkbook . ActiveWorkbook может меняться в зависимости от того, что делает код (или пользователь) во время выполнения, вот почему вы сохраняете именованную ссылку на него. ThisWorkbook всегда ссылается только на один очень конкретный объект. Копирование бесполезно.