Я думаю, что проблема может быть в том, что вы используете событие 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 будет находиться в модуле класса мастер-листа, поэтому он будет реагировать только на события на этой странице.