Событие изменения листа Excel не работает
Я пытаюсь написать макрос, где меняется любой столбец должен автоматически сохранять рабочий лист.
мой лист Excel расширяется до G25
.
Я пробовал это, но его не работает:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Target.Worksheet.Range("G25")) Is Nothing Then
ActiveWorkbook.Save
End Sub
у меня есть сохранить его под ThisWorkBook
.
любая помощь приветствуется.
2 ответов
под ThisWorkbook этот обработчик называется Workbook_SheetChange
и он принимает два аргумента,Ш (типа Object
) и цель (a Range
). Таким образом, ваш код не будет работать там.
Если вы поместите свой код в лист, который хотите (Лист1, например) вместо ThisWorkbook, поставил End If
и измените диапазон на "А1:Не G25" (представляющий квадрат из строки 1 столбца A в строку 25 столбца 25), он должен работа.
Это сделало:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Target.Worksheet.Range("A1:G25")) Is Nothing Then
MsgBox "changed"
End If
End Sub
для полноты, под ThisWorkbook, это будет работать:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Not Intersect(Target, Target.Worksheet.Range("A1:G25")) Is Nothing Then
MsgBox "changed"
End If
End Sub
другая распространенная причина, почему событие не работает, заключается в том, что EnableEvents было установлено в False
Я бы закодировал вашу проблему следующим образом:
- обычно вам нужно работать с диапазоном интересов, который тестируется. Итак, создание переменной
rng1
ниже служит как ранней точкой выхода, так и объектом диапазона для работы. На листе событиеTarget.Worksheet.Range("A1:G25")
будет работать, но он длинный для его фактического использования -
Если у вас есть диапазон манипулирование затем внесение любых дальнейших изменений в лист вызовет отзыв события изменения и так далее, что может привести к сбою Excel. Поэтому лучше всего отключить дальнейшие события, запустить код, а затем повторно включить события при выходе
Private Sub Worksheet_Change(ByVal Target As Range) Dim rng1 As Range Set rng1 = Intersect(Target, Range("A1:G25")) If rng1 Is Nothing Then Exit Sub Application.EnableEvents = False 'work with rng1 Application.EnableEvents = True End Sub