excel VBA автоматически запускает макрос всякий раз, когда изменяется ячейка
Есть ли простой способ заставить Excel автоматически выполнять макрос всякий раз, когда изменяется ячейка?
Ячейка, о которой идет речь, будет в Worksheet("BigBoard").Range("D2")
То, что я считал бы простым поиском Google, оказалось более сложным – каждый образец, который пересекается (независимо от того, что есть), или форматирование цвета, или любое другое количество вещей, которые кажутся несущественными.
- Каковы правила, регулирующие использование скобок в вызовах функций VBA?
- Можно ли программным образом передавать параметры в запросе на обновление Microsoft Access?
- Преобразование строкового представления константы в константу?
- Как я могу получить HTTP GET из Excel VBA для Mac 2011
- Назначение обработчиков событий для элементов управления в пользовательской форме, созданных динамически в VBA
- При создании слайдов перейдите к определенному слайду в powerpoint
- Как можно выделить две отдельные ячейки с разделенными запятыми данными и соединить их?
- Vba Excel делает vlookup из закрытого файла
- Почему MS Excel выходит из строя и закрывается в течение процедуры Worksheet_Change Sub?
- Как вы получаете Range для возвращения своего имени?
- Анализ содержимого HTML в VBA
- Получение ScriptControl для работы с Excel 2010 x64
- VBA: преобразовать текст в число
Да, это возможно, используя события рабочего листа:
В редакторе 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!" Finalize: Application.EnableEvents = True End Sub
Другим вариантом является
Private Sub Worksheet_Change(ByVal Target As Range) IF Target.Address = "$D$2" Then MsgBox("Cell D2 Has Changed.") End If End Sub
Я считаю, что это использует меньше ресурсов, чем Intersect
, что будет полезно, если ваш рабочий лист сильно изменится.
В попытке найти способ сделать целевую ячейку для метода intersect массивом таблиц имен, я наткнулся на простой способ запустить что-то, когда изменится ЛЮБАЯ ячейка или набор ячеек на конкретном листе. Этот код также помещается в рабочий лист:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Cells.Count > 0 Then 'mycode here end if end sub
В попытке обнаружить изменение где-то в определенном столбце (здесь в «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