Событие изменения листа 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