Application.EnableEvents = False не работает - PullRequest
2 голосов
/ 02 марта 2011

Кажется, я не понимаю странного поведения Excel 2007, и после десятка решений я пришел к вам с просьбой о помощи.

У меня есть офис 2007.

Воткод моего класса:

Public WithEvents App As Application
Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  MsgBox "event din app"
End Sub

Вот мой модуль InitializeAppObject:

Dim X As New EventClassModule
Sub InitializeApp()
    Set X.App = Application

    MsgBox "am facut setarea"

End Sub

Вот мой код Листа 1:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Not Application.Intersect(Target, Me.Range("a1:c10")) Is Nothing _
    Then
        Application.EnableEvents = False
        MsgBox "suntem in range"
        Application.EnableEvents = True
    Else
        MsgBox "nu suntem in range"
    End If
End Sub

Перед изменением любых значений вВ сетке я выполняю процедуру InitializeApp ().

Насколько я понимаю, сначала должно быть инициировано событие листа, затем одно из рабочей книги, а затем одно из приложений.Однако, это не так.Сначала запускается рабочая тетрадь, прикладная и, наконец, листовая.

  1. Работает ли Excel неправильно или я ошибся?
  2. Как выполнить только листсобытие?потому что очевидно, что Application.EnableEvents = false не помогает остановить событие от запуска вверх по течению.

Заранее большое спасибо за вашу помощь!

С уважением,Раду

1 Ответ

2 голосов
/ 02 марта 2011

Я думаю, что проблема может быть в том, что вы используете событие SelectionChange в модуле листа. Вы правы в отношении порядка событий. Вот как это происходит - у вас есть события *

Worksheet_Change
Workbook_SheetChange*
Application_SheetChange*

, тогда предположим, что выбор перемещается после ввода чего-либо

Worksheet_SelectionChange*
Workbook_SheetSelectionChange
Application_SheetSelectionChange

Ничто в вашем коде не вызывает события, поэтому размещение окон сообщений между EnableEvents не приводит к желаемому результату. Все события уже поставлены в очередь к моменту запуска первого кода события. Если вместо этого у вас было

Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Application.EnableEvents = False
        Sh.Range("a1").Value = 1
    Application.EnableEvents = True
End Sub

Тогда код, который изменил значение A1, не вызовет никаких событий. Если вы хотите запустить только событие Worksheet_Change, вам следует удалить другой код события. Хорошо, это, вероятно, есть веская причина. Но какой бы ни была логика, когда вы запускаете, какой код события должен быть в процедуре. Например, если вы хотите запустить событие Worksheet_Change только для определенного имени рабочего листа «Master», вы должны настроить его так:

Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Sh.Name <> "Master" Then
        MsgBox "event din app"
    End If
End Sub

И код события Worksheet_Change будет находиться в модуле класса мастер-листа, поэтому он будет реагировать только на события на этой странице.

...