2015-10-26 8 views
3

Есть ли способ глобально установить событие изменения, которое запускается на каждом отдельном листе?Событие изменения рабочего листа для каждого листа в книге

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

Есть ли способ сделать это? Реализация его в модуле рабочей книги ничего не запускала.

+4

Вы должны использовать 'Private Sub Workbook_SheetChange (ByVal Sh As Object, ByVal Target As Range)', он работает как событие Sheet_Change, за исключением того, что вместо 'Me.' вы будете использовать' Sh.' для описания листа которые запускают событие! ;) – R3uK

+0

Это похоже на работу, вы хотите сказать это как ответ? – Spurious

ответ

3

Используйте макрос события Workbook_SheetChange. Sh передается Worksheet Object, а Цель - это ячейка или ячейки, которые получили изменение. Простой With ... End With statement должен быть достаточным для локализации рабочей таблицы, получающей изменение.

Простой случай времени может выглядеть так.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
    With Sh 
     If Not Intersect(Target, .Columns(1)) Is Nothing Then 
      On Error GoTo bm_Safe_Exit 
      Application.EnableEvents = False 
      Dim rng As Range 
      For Each rng In Intersect(Target, .Columns(1)) 
       rng.Offset(0, 4) = Now 
      Next rng 
     End If 
    End With 
bm_Safe_Exit: 
    Application.EnableEvents = True 
End Sub 

Любые изменения, внесенные в ячейку в столбце А любого листа приведет к текущей DateTime ввода в колонке Е одного и того же листа и строки. Заново созданный рабочий лист будет немедленно затронут. Вы можете проанализировать рабочие листы, затронутые их Рабочим листом .CodeName property или Рабочий лист .Name property. Worksheet.Index property не рекомендуется, если вы не заблокируете структуру рабочей книги, чтобы рабочие листы не могли быть переупорядочены.

2

Вы должны использовать:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 

Он работает как Sheet_Change событие, за исключением, что вместо Me., вы будете использовать Sh. ссылаться на листе, который вызвал событие.

Смежные вопросы