После небольшой проб и ошибок у меня следующий код работает по вашему желанию.
Обратите внимание, что, скорее всего, есть более эффективные способы обработки кода во время ожидания закрытия диалога find and replace
- у меня не было точного решения для начала, но я подумал, что это может сработать - и это сработало.
Per Обнаружение открытого диалогового окна из wordribbon.tips. net Я позаимствовал код, чтобы найти открытое окно для диалога Find and replace
. За статью;
Диалоговое окно - это не что иное, как открытое окно, и у каждого диалогового окна есть имя.
Подтвердив, что это работает, как я ожидал, я сделал несколько изменений, которые Я объясню ниже код
Создание нового модуля в VBE (или добавление следующего к существующему модулю)
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal wClassName As Any, ByVal wWindowName As String) As Long
Обратите внимание, что это не будет работать в Sheet
или модуль Workbook
, вам нужно будет добавить его к тому, который вы создали - Вставить> Модуль
Создать функцию, возвращающую логическое значение, которое определяет, будет ли ваш диалог открыт или нет.
Function testDialogOpen() As Boolean
Dim wHandle As Long
Dim wName As String
wName = "Find and Replace"
wHandle = FindWindow(0&, wName)
If wHandle = 0 Then
testDialogOpen = False
Else
testDialogOpen = True
End If
End Function
Незначительные изменения в вашем коде, чтобы проверить, открыто ли диалоговое окно или нет перед защитой листа.
Sub unprotect_findandreplace_protect()
Sheet1.Unprotect "abc123"
Application.CommandBars("Edit").Controls("Find...").Execute
While testDialogOpen()
DoEvents
Wend
Sheet1.Protect "abc123"
End Sub
While...Wend
l oop оценивает, открыто ли окно Find and Replace
на каждой итерации. Это делается путем вызова функции testDialogOpen()
, которая возвращает результат True
или False
. L oop будет продолжать работать до тех пор, пока не будет закрыто диалоговое окно Find and Replace
, когда он выйдет из l oop и go на следующую строку, повторно защитив лист.