#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
всегда ссылается только на один очень конкретный объект. Копирование бесполезно.