Excel VBA автоматически запускает макрос всякий раз, когда изменяется ячейка

Есть ли простой способ заставить Excel автоматически выполнять макрос при изменении ячейки?

Соответствующая ячейка будет находиться в Worksheet("BigBoard").Range("D2")

То, что я считал простым запросом Google, оказалось более сложным - каждый образец, который пересекает (независимо от того, что есть), или форматирование цвета, или любое другое количество вещей, которые кажутся несущественными.

Ответ 1

Да, это возможно с помощью событий листа:

В редакторе Visual Basic откройте интересующий вас лист (например, "BigBoard"), дважды щелкнув по названию листа в дереве вверху слева. Поместите следующий код в модуль:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Me.Range("D2")) Is Nothing Then Exit Sub
        Application.EnableEvents = False 'to prevent endless loop
        On Error Goto Finalize 'to re-enable the events      
        MsgBox "You changed THE CELL!"
    End If
Finalize:        
    Application.EnableEvents = True
End Sub

Ответ 2

Другой вариант:

Private Sub Worksheet_Change(ByVal Target As Range)
    IF Target.Address = "$D$2" Then
        MsgBox("Cell D2 Has Changed.")
    End If
End Sub

Я считаю, что это использует меньше ресурсов, чем Intersect, что будет полезно, если ваш рабочий лист сильно изменится.

Ответ 3

В попытке найти способ сделать ячейку-мишень для метода intersect массивом таблиц имен, я наткнулся на простой способ запустить что-то, когда изменится ЛЮБАЯ ячейка или набор ячеек на конкретном листе. Этот код также помещается в рабочий лист:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 0 Then
'mycode here
end if
end sub

Ответ 4

В попытке обнаружить изменение где-то в определенном столбце (здесь, в "W", то есть "23"), я изменил ответ Питера Альбертса на:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Target.Column = 23 Then Exit Sub
    Application.EnableEvents = False             'to prevent endless loop
    On Error GoTo Finalize                       'to re-enable the events
    MsgBox "You changed a cell in column W, row " & Target.Row
    MsgBox "You changed it to: " & Target.Value
Finalize:
    Application.EnableEvents = True
End Sub

Ответ 5

Я создавал форму, в которой пользователь вводит адрес электронной почты, используемый другим макросом для отправки определенной группы ячеек по указанному адресу. Я собрал воедино этот простой код с нескольких сайтов и мои ограниченные знания VBA. Это просто следит за обновлением одной ячейки (в моем случае K22) и затем убивает любую гиперссылку в этой ячейке.

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim KeyCells As Range

    ' The variable KeyCells contains the cells that will
    ' cause an alert when they are changed.
    Set KeyCells = Range("K22")

    If Not Application.Intersect(KeyCells, Range(Target.Address)) _
           Is Nothing Then

        Range("K22").Select
        Selection.Hyperlinks.Delete

    End If 
End Sub