VBA пытается заставить WorkSheet_Change работать на нескольких листах, но не на всех

Мне нужно сделать Worksheet_Change, который проверяет изменение значений в 2 разных ячейках на 2 разных листах. Однако у меня более 2 листов, и я не хочу использовать Workbook_Change, чтобы эти другие листы не пострадали.

Мой код работает, но проверяет только ячейки на одном листе, но не на другом листе. Мне нужно проверить оба листа.

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("M9")) Is Nothing Then
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Call Macro5
    Application.EnableEvents = True
    Application.ScreenUpdating = True

    End If

If Not Intersect(Target, Range("I88")) Is Nothing Then
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Call Macro6
    Application.EnableEvents = True
    Application.ScreenUpdating = True

    End If

  End Sub

Спасибо.


person Artak    schedule 13.06.2016    source источник
comment
Вы также должны поместить код в другой модуль рабочего листа, а затем   -  person Stupid_Intern    schedule 14.06.2016
comment
Вау, я некоторое время работал с Excel и никогда не осознавал, что могу поместить разный код для разных листов. Большое спасибо за твою помощь :).   -  person Artak    schedule 14.06.2016
comment
Также есть уровень рабочей книги Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range), который вы можете использовать, чтобы избежать дублирования кода (и выйти, если Sh.Name не является одним из ваших отслеживаемых листов)   -  person Tim Williams    schedule 14.06.2016
comment
Я пытался сделать это раньше, но не мог понять, как включить Sh в объявление оператора IF. Я имею в виду, что я не знал, что добавить перед целью в If Not Intersect(,Target, Range(M9)) Is Nothing Then, чтобы позволить мне различать листы.   -  person Artak    schedule 14.06.2016


Ответы (2)


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

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
      Application.EnableEvents = False
    Application.ScreenUpdating = False

    If (Not Intersect(Target, Range("M9")) Is Nothing) Then
        Call Macro5
    ElseIf (Not Intersect(Target, Range("M9")) Is Nothing) Then
        Call Macro6
    End If

    Application.EnableEvents = True
    Application.ScreenUpdating = True

End Sub

Если вам нужно знать, на каком листе возникло событие, вы можете использовать параметр ByVal Sh As Object.

Если Sh.Name = "Лист1", то

Если вы хотите получить доступ к свойствам объекта Sh с помощью IntelliSense, верните Sh из объекта обратно в объект WorkSheet.

Dim ws as WorkSheet
Set ws = Sh
person Community    schedule 14.06.2016

Команда Private ограничивает вашу подпрограмму текущим рабочим листом, поэтому вы правильно используете эту команду, чтобы подпрограмма не изменяла все ваши листы.

Как сказал newguy, самое простое решение — поместить код в каждый из модулей рабочего листа, который вы хотите изменить, используя команду Private.

person cameronroytaylor    schedule 14.06.2016