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