Excel зависает при выполнении макроса

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range
    Dim i As Integer

    Set KeyCells = Range("H4:H100")

    If Not Application.Intersect(KeyCells, Range(Target.Address)) _
        Is Nothing Then
        i = Range(Target.Address).Row
        If Cells(i, "L") = "" Then
            Cells(i, "H") = "In Progress"
        End If
    End If
End Sub

мой excel продолжает замораживание после запуска сценария. Кто-нибудь может мне в этом помочь?

30
задан iHateBugs
20.01.2023 18:42 Количество просмотров материала 3642
Распечатать страницу

2 ответа

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

приложение.EnableEvents = False

обязательно включите события до завершения процедуры, иначе они останутся отключенными до перезапуска Excel.

ваш код с отключенными и включенными событиями:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Dim i As Integer

    Set KeyCells = Range("H4:H100")

    If Not Application.Intersect(KeyCells, Range(Target.Address)) _
        Is Nothing Then
        i = Range(Target.Address).Row
        Application.EnableEvents = False
        If Cells(i, "L") = "" Then
            Cells(i, "H") = "In Progress"
        End If
        Application.EnableEvents = True
    End If
End Sub
0
отвечен Mark Fitzgerald 2023-01-22 02:30

проблема проста. Вы проверяете некоторый диапазон для изменения. Если она изменена, вы выполняете некоторое действие, которое изменяет ячейки в проверяемом диапазоне. Это приводит к изменению события данного диапазона И... вызывать метод. И снова и снова...

чтобы избежать этой проблемы, вы должны создать глобальный или статический флаг и игнорировать все вторичные вызовы:

Dim IsWorking As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
If IsWorking Then Exit Sub         ' Exit if it is a 'slave' call
IsWorking = True                   ' Set 'main call is processed' flag
' perform actions you need
IsWorking = False                  ' Drop the flag, main call is finished
Exit Sub

дополнительно:Target может быть многоклеточным диапазоном, а не одной ячейкой. Вы можете проверить пересечение для каждого по крайней мере, строка в ней - может быть, более одной ячейки должно быть изменено на значение "в процессе"...

Дополнительно-2: Add Application.DoEvents оператор(ы) в коде - позволяет прерывать выполнение кода Ctrl-C, если макрос 'freeses'.

1
отвечен Akina 2023-01-22 04:47

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх