Vba excel макрос по изменению в ячейке

Запуск макроса (процедуры) из кода VBA Excel при изменении значения ячейки вручную или программным способом, а также при нажатии клавиши Delete.

Запуск макроса при изменении ячейки

Пример кода

Код VBA Excel для запуска макроса (процедуры) при изменении значения ячейки на рабочем листе:

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Application.Intersect(Range(«A1:D8»), Range(Target.Address)) Is Nothing Then

        MsgBox «Значение ячейки « & Target.Address & » изменено.»

    End If

End Sub

Range("A1:D8") — это диапазон, при изменении значения любой ячейки которого, произойдет выполнение функции MsgBox. Диапазон может состоять из одной ячейки.

Код размещается в модуле рабочего листа, при изменении значения ячейки на котором следует запустить макрос (процедуру).

Вместо функции MsgBox в приведенном коде следует разместить ссылку на исполняемую процедуру (макрос) VBA Excel.

Примечания

  • Макрос будет запущен при изменении значения ячейки вручную или программным способом, а также при нажатии клавиши Delete.
  • Вызываемая процедура будет запущена и в том случае, если в ячейку будет записано то же самое значение, которое в ней и было. Например, в ячейке было число 28, и в нее записали вручную или программно число 28; или нажали клавишу Delete на пустой ячейке.
  • Макрос не будет запущен при изменении значения ячейки с формулой в результате ее пересчета.

Исключение ложного срабатывания

Если в качестве диапазона указать только одну ячейку, можно исключить срабатывание кода VBA Excel при записи в ячейку того же значения. Для этого необходимо использовать переменную уровня модуля, чтобы с ее помощью контролировать факт изменения или неизменения значения в указанной ячейке.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

Option Explicit

Dim x

Private Sub Worksheet_Activate()

x = Range(«C4»)

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Application.Intersect(Range(«A1:D8»), Range(Target.Address)) Is Nothing _

    And x <> Range(«C4») Then

        MyMsgBox

        x = Range(«C4»)

    End If

End Sub

Private Sub MyMsgBox()

    MsgBox «Значение ячейки « & «C4» & » изменено на « & Chr(34) & Range(«C4») & Chr(34)

End Sub

В это примере функция MsgBox вынесена в отдельную процедуру, которая вызывается при изменении значения в ячейке C4.

Значение ячейки C4 присваивается переменной x при активации рабочего листа и, затем, перезаписывается при каждой перезаписи значения в ячейке.

Код этого примера размещен в модуле рабочего листа, но код вызываемой процедуры может быть вынесен из него в другой модуль.


Обычно в Excel мы можем нажать клавишу F5 или кнопку «Выполнить», чтобы выполнить код VBA. Но пробовали ли вы когда-нибудь запустить конкретный код макроса при изменении значения ячейки? В этой статье я расскажу о некоторых быстрых приемах, которые помогут справиться с этой задачей в Excel.

Запуск или вызов макроса при изменении значения определенной ячейки с кодом VBA

Запуск или вызов макроса при изменении любого значения ячейки в диапазоне с кодом VBA


стрелка синий правый пузырь Запуск или вызов макроса при изменении значения определенной ячейки с кодом VBA

Чтобы запустить код макроса, изменив значение ячейки, следующий код VBA может оказать вам услугу, сделайте следующее:

1. Щелкните правой кнопкой мыши вкладку листа, на которой вы хотите выполнить макрос, если значение ячейки изменится, а затем выберите Просмотреть код из контекстного меню, а в открывшемся Microsoft Visual Basic для приложений окна, скопируйте и вставьте следующий код в пустой модуль:

Код VBA: запускать макрос при изменении значения ячейки:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" Then
        Call Mymacro
    End If
End Sub

doc запускает макрос, если ячейка изменяется 1

Внимание: В приведенном выше коде A1 это конкретная ячейка, на основе которой вы хотите запустить код, Mymacro это имя макроса, который вы хотите запустить. Пожалуйста, измените их по своему усмотрению.

2. А затем сохраните и закройте окно кода, теперь, когда вы вводите или изменяете значение в ячейке A1, определенный код будет запускаться сразу.


стрелка синий правый пузырь Запуск или вызов макроса при изменении любого значения ячейки в диапазоне с кодом VBA

Если вы хотите запускать или запускать макрос, когда значение какой-либо ячейки изменяется в диапазоне ячеек, следующий код может вам помочь.

1. Щелкните правой кнопкой мыши вкладку листа, на которой вы хотите выполнить макрос, если значение ячейки изменится, а затем выберите Просмотреть код из контекстного меню, а в открывшемся Microsoft Visual Basic для приложений окна, скопируйте и вставьте следующий код в пустой модуль:

Код VBA: запускать макрос при изменении любого значения ячейки в диапазоне:

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:B100")) Is Nothing Then
Call Mymacro
End If
End Sub

doc запускает макрос, если ячейка изменяется 2

Внимание: В приведенном выше коде A1: B100 это конкретные ячейки, на основе которых вы хотите запустить код, Mymacro это имя макроса, который вы хотите запустить. Пожалуйста, измените их по своему усмотрению.

2. А затем сохраните и закройте окно кода, теперь, когда вы вводите или изменяете значение в любой ячейке A1: B100, конкретный код будет выполнен сразу.



Статьи по теме:

Как запустить макрос автоматически перед печатью в Excel?

Как запустить макрос на основе значения ячейки в Excel?

Как запустить макрос на основе значения, выбранного из раскрывающегося списка в Excel?

Как запустить макрос, щелкнув гиперссылки в Excel?

Как запустить макрос, когда лист выбран из книги?


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

В Excel множество функций, но некоторые возможности не видны на первый взгляд. Неудивительно, ведь неизвестно, что может пригодиться пользователю, поэтому нет смысла выносить все на основную панель. Часто нужно выполнить какое-то действие при определенном условии, решаемое формулой. Но что, если вам необходимо выполнять действие/макрос при изменении ячейки листа Excel. Это тоже можно сделать при помощи макроса VBA. А как запустить макрос при изменении ячейки?

Чтобы запустить макрос (действие) при изменении данных в ячейке, существует несколько возможностей. Мне больше всего нравится эта конструкция:

Содержание

  • Макрос, выполняемый при изменении ячейки
  • Как запустить макрос при изменении ячейки?
  • Похожие статьи

Макрос, выполняемый при изменении ячейки

Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Range("A1")) Is Nothing Then
   If Target = 0 Then
     MsgBox "Запустите Ваше действие"
   End If
 End If
End Sub

Вставьте вместо MsgBox «Запустите Ваше действие» ваш код. Полезные макросы можно посмотреть в этой статье. Для этого макроса если, ячейка А1 становится нулевой, то появляется сообщение (MsgBox) «Запустите Ваше действие».

Как запустить макрос при изменении ячейки?

Сперва включите вкладку Разработчик. Затем пройдите в меню Visual Basic, первый значок слева на картинке (или нажмите Alt+f11):

изменение ячейки

Важно! Чтобы запустить код типа Worksheet_Change, необходимо записать код не в модуль макроса, а в саму книгу! Подробнее здесь:

макрос при изменении ячейки

Выберите нужную книгу и нужный лист (в примере Лист1), кликнув два раза по листу и в правом окне вставьте код, указанный выше. Если вам нужно, чтобы ваше действие выполнялось, когда ячейка изменяет значение на заполненную, то нужно изменить текст Target = 0 на Target <> 0.

Лично я рекомендую добавить больше условий, при каких действиях будет выполняться ваше действие, чтобы макрос не запускался при любом изменении. Вообще надо быть аккуратным с этой функцией. Бывает и такое — вы забываете, что есть макрос с условиями, а информация изменяется, можно даже не заметить этого

 

OSA913

Пользователь

Сообщений: 248
Регистрация: 03.01.2016

#1

25.07.2017 08:31:02

Доброе утро! Помогите заставить правильно работать макрос.

Скрытый текст

Он рабочий, но только любые изменения в любых ячейках на этом листе другими макросами, они(другие макросы) всегда обращаются к этой процедуре, что замедляет работу макроса. Нужно чтобы к этой процедуре было обращение только когда происходит изменение в ячейке указанной в этой процедуре но ни как не в каждой ячейке. Я пытался подставить код как рекомендует Юрий М

тут

но не известно почему не вышло.

Изменено: OSA91325.07.2017 08:34:47

 

webley

Пользователь

Сообщений: 1995
Регистрация: 01.01.1970

#2

25.07.2017 09:21:16

что-то в этом роде:

Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = Range("A1").Address Then
        '<код>
    ElseIf Target.Address = Range("B1").Address Then
        '<код>
    End If
End Sub
 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#3

25.07.2017 09:47:49

Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("D3,F3,X3,Z3,AR3,AT3,AR5,AT5")) Is Nothing And Target.Count = 1 Then
    On Error Resume Next
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Select Case Target.Address
        Case "$D$3"
            Set KeyCells = Range("M3")
        Case "$F$3"
            Set KeyCells = Range("N3")
        Case "$X$3"
            Set KeyCells = Range("AE3")
        Case "$Z$3"
            Set KeyCells = Range("AG3")
        Case "$AR$3"
            Set KeyCells = Range("AX3")
        Case "$AT$3"
            Set KeyCells = Range("AY3")
        Case "$AR$5"
            Set KeyCells = Range("BA3")
        Case "$AT$5"
            Set KeyCells = Range("BC3")
    End Select
    KeyCells = Target
    CopyData1
End If
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

Изменено: Sanja25.07.2017 15:55:58

Согласие есть продукт при полном непротивлении сторон.

 

OSA913

Пользователь

Сообщений: 248
Регистрация: 03.01.2016

Спасибо, но пока не работает макрос(

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

Покажите файл-пример

Согласие есть продукт при полном непротивлении сторон.

 

OSA913

Пользователь

Сообщений: 248
Регистрация: 03.01.2016

Когда в vba клавишей F8 проверяю ход выполнения макроса «QQ», он заходит в процедуру «Private Sub Worksheet_Change» после  изменения значения в каждой ячейке. Нужно чтобы в «Private Sub Worksheet_Change»  желтая стрелка не попадала.

Изменено: OSA91325.07.2017 11:43:38

 

OSA913

Пользователь

Сообщений: 248
Регистрация: 03.01.2016

Вариант webley так же работает как мой. Может так должно быть ..?

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#8

25.07.2017 15:36:20

Цитата
OSA913 написал: заходит в процедуру «Private Sub Worksheet_Change» после  изменения значения в каждой ячейке

Правильно. Потому что возникает событие Изменения ячейки

Согласие есть продукт при полном непротивлении сторон.

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#9

25.07.2017 15:51:42

Цитата
OSA913 написал: но пока не работает макрос

Что значит не работает? Вы поймите, что Событие изменения ячейки возникает при изменении ЛЮБОЙ ячейки на листе, и обработчик этого события (Private Sub Worksheet_Change) будет выполняться в ЛЮБОМ случае. Другое дело КАК он будет выполняться. Проверьте мой макрос (чуть подкорректировал его в сообщении #3) и сравните время выполнения со своим. У Вас же проблема в том что работа макроса замедляется. Но это именно из-за того, что Ваш код написан не оптимально

Согласие есть продукт при полном непротивлении сторон.

 

OSA913

Пользователь

Сообщений: 248
Регистрация: 03.01.2016

Доброе утро! Sanja, сам макрос не работает именно Ваш вариант. Посмотрите пожалуйста в примере. Сверху  два варианта за комментированные они работают.

 

Александр

Пользователь

Сообщений: 1147
Регистрация: 16.03.2016

#11

26.07.2017 06:35:03

OSA913, У вас

Код
Case "A1"

У Sanja

Код
Case "$D$3"

Разницу улавливаете ?)
Target.Address возвращает «$A$1» а не «A1»

 

OSA913

Пользователь

Сообщений: 248
Регистрация: 03.01.2016

 

OSA913,А я собственно не понимаю, как оно должно работать ?)  Так нужно ?

 

OSA913

Пользователь

Сообщений: 248
Регистрация: 03.01.2016

Точно. Спасибо! Действительно оптимальней такой вариант. Только теперь макрос «CopyData1» не всегда срабатывает. Как его поставить в коде чтобы он срабатывал всегда при изменении значения в любой ячейке листа?

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#15

26.07.2017 13:53:27

Цитата
OSA913 написал:
теперь макрос «CopyData1» не всегда срабатывает

Перенесите CopyData1 после End If

Согласие есть продукт при полном непротивлении сторон.

 

OSA913

Пользователь

Сообщений: 248
Регистрация: 03.01.2016

#16

26.07.2017 18:35:36

Цитата
Sanja написал:
Перенесите CopyData1 после End If

Будет непрерывный цикл т.к. CopyData1 меняя значения в ячейках снова возвращается в «Private Sub Worksheet_Change».

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#17

26.07.2017 18:43:26

Логично. Тогда отключайте обработку событий сразу после начала процедуры

Код
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Application.EnableEvents = False
If Not Intersect(Target, Range("A1,A2,A3,A4,A5,A6,A7,A8")) Is Nothing And Target.Count = 1 Then
    On Error Resume Next
    Select Case Target.Address
    .......

Согласие есть продукт при полном непротивлении сторон.

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#18

26.07.2017 18:46:19

Цитата
Sanja написал: Логично…

Хотя не совсем. Мы же не знаем что Ваш макрос CopyData1 делает. Может он не изменяет ячейки на текущем листе

Согласие есть продукт при полном непротивлении сторон.

 

OSA913

Пользователь

Сообщений: 248
Регистрация: 03.01.2016

Работает! Спасибо друзья!

 

OSA913

Пользователь

Сообщений: 248
Регистрация: 03.01.2016

#20

05.08.2017 09:08:02

Некоторые макросы слегка притормаживают, проверил, оказалось все из-за процедуры «CopyData», которая выглядит таким образом:

Скрытый текст

Решил от нее избавиться и перенести ее тело в процедуру события листа «Worksheet_Change» написал код в варианте предложенном Sanja. Макросы стали работать быстрее, но некоторые значения из ячеек не хотят копироваться.

Скрытый текст

Я думаю что из-за этого например из D3 должно копироваться в M3 и также на др лист в R3. Как раз не копируются значения там где нужно их  копировать сразу в два места. Помогите сделать чтобы можно было копировать значение с одной ячейки в два места. Сейчас составлю простой пример и приложу в следующем посте.

Изменено: OSA91305.08.2017 09:11:49

 

OSA913

Пользователь

Сообщений: 248
Регистрация: 03.01.2016

Вот простой пример. Значения не копируются на лист2.

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

Напишите пожалуйста обычными словами -ЧТО, КУДА, ПРИ КАКИХ УСЛОВИЯХ должно копироваться. Потому что Ваш код неправилен и из него не понятно что Вы хотите получить на выходе

Согласие есть продукт при полном непротивлении сторон.

 

OSA913

Пользователь

Сообщений: 248
Регистрация: 03.01.2016

Доброе утро) Хочу чтобы при изменении значения в любой из ячеек в A1:A4 в первом листе, значение из ячейки A1 копировалось в B1, A2 в B2, A3 в B3, A4 в B4 и так же из A1 и A2 в первом листе копировалось в A1 и A2 на втором листе.

Изменено: OSA91305.08.2017 10:09:52

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#24

05.08.2017 10:08:27

Код
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Application.EnableEvents = False
If Not Intersect(Target, Range("A1,A2,A3,A4")) Is Nothing And Target.Count = 1 Then
    On Error Resume Next
        Select Case Target.Address
        Case "$A$1"
          Set KeyCells = Range("B1")
          Set KeyCells2 = Sheets(2).Range("A1")
        Case "$A$2"
          Set KeyCells = Range("B2")
          Set KeyCells2 = Sheets(2).Range("A2")
        Case "$A$3"
            Set KeyCells = Range("B3")
        Case "$A$4"
            Set KeyCells = Range("B4")
    End Select
    KeyCells.Value = Target
    If Not KeyCells2 Is Nothing Then
        KeyCells2.Value = Target
    End If
End If
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

Согласие есть продукт при полном непротивлении сторон.

 

OSA913

Пользователь

Сообщений: 248
Регистрация: 03.01.2016

Некоторые ячейки не копируют значения в другой лист когда значение в них определяется формулой, копируются только при ручном вводе значения. Сделал такую же ситуацию на своем файле-примере копирует нормально. Не пойму почему так. Проверил код несколько раз-все написал правильно.

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#26

05.08.2017 12:17:45

Цитата
OSA913 написал: Не пойму почему так

Потому что

Цитата
OSA913 написал: значение в них определяется формулой

Ручной ввод и изменение значения формулой это разные вещи. ‘Повешайте’ код на событие Private Sub Worksheet_Calculate()

Согласие есть продукт при полном непротивлении сторон.

 

OSA913

Пользователь

Сообщений: 248
Регистрация: 03.01.2016

Не помогло. Но в файле-примере работает.

 

OSA913

Пользователь

Сообщений: 248
Регистрация: 03.01.2016

Хотя нет. В примере тоже перестало копировать когда в A1 ввел значение вручную.

 

Sanja

Пользователь

Сообщений: 14838
Регистрация: 10.01.2013

#29

05.08.2017 15:33:42

Вы в реальном файле формулу тоже кодом вставляете? Покажите уже пример в РЕАЛЬНОЙ СТРУКТУРЕ и что Вы в нем пытаетесь получить. Я уже просил

Цитата
Sanja написал: ЧТО, КУДА, ПРИ КАКИХ УСЛОВИЯХ должно копироваться

Что и Куда Вы объяснили, а вот про условия не хотите. Где данные изменяются вручную? Где формулой? Где формула вставляется кодом?

Согласие есть продукт при полном непротивлении сторон.

 

OSA913

Пользователь

Сообщений: 248
Регистрация: 03.01.2016

#30

06.08.2017 15:09:40

В реальном файле проблема точно такая же как и в файле-примере выше. Событием «Worksheet_Change» выполняется перенос значения из ячейки A1(лист1) в ячейку B1(лист1) и в ячейку A1(лист2) когда ввожу значение в A1 в ручную — с этим проблем уже нет. Когда жму на ячейку A5(лист1), макрос задает ячейке A1(лист1) формулу =A2*A3(лист1) — с этим проблем тоже нет. Проблема — когда меняю значение в A2(лист1), в A1 меняется значение (т.к. формула), но оно не копируется в ячейку B1(лист1) и в ячейку A1(лист2). Как это поправить?

I spent a lot of time researching this and learning how it all works, after really messing up the event triggers. Since there was so much scattered info I decided to share what I have found to work all in one place, step by step as follows:

1) Open VBA Editor, under VBA Project (YourWorkBookName.xlsm) open Microsoft Excel Object and select the Sheet to which the change event will pertain.

2) The default code view is «General.» From the drop-down list at the top middle, select «Worksheet.»

3) Private Sub Worksheet_SelectionChange is already there as it should be, leave it alone. Copy/Paste Mike Rosenblum’s code from above and change the .Range reference to the cell for which you are watching for a change (B3, in my case). Do not place your Macro yet, however (I removed the word «Macro» after «Then»):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
End Sub

or from the drop-down list at the top left, select «Change» and in the space between Private Sub and End Sub, paste If Not Intersect(Target, Me.Range("H5")) Is Nothing Then

4) On the line after «Then» turn off events so that when you call your macro, it does not trigger events and try to run this Worksheet_Change again in a never ending cycle that crashes Excel and/or otherwise messes everything up:

Application.EnableEvents = False

5) Call your macro

Call YourMacroName

6) Turn events back on so the next change (and any/all other events) trigger:

Application.EnableEvents = True

7) End the If block and the Sub:

    End If
End Sub

The entire code:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("B3")) Is Nothing Then
        Application.EnableEvents = False
        Call UpdateAndViewOnly
        Application.EnableEvents = True
    End If
End Sub

This takes turning events on/off out of the Modules which creates problems and simply lets the change trigger, turns off events, runs your macro and turns events back on.

Запуск макроса изменением значения в ячейке.

Ранее в статье

Как сделать связанный выпадающий список в «Эксель», зависящий от значения в соседней ячейке.

рассказывалось о том, как реализовать в программе Excel связанные между собой выпадающие списки. Недавно создавая файл со связанными списками столкнулся с проблемкой — при обновлении записи в первой ячейке, от которой зависит список во второй, вторая ячейка остается неизменной, не обнуляет значения.

Связанный списокРешил исправить ситуацию и сделать так чтобы при клике по первой ячейке вторая ячейка принимала значение «пусто».

Для этого потребовалось написать 2 коротеньких алгоритма (макроса):

Первый макрос —  производит удаление данных из ячейки и выглядит следующим образом:

Sub noll()
On Error Resume Next
ActiveSheet.Cells(2, 2).Value = «»
End Sub

Этот макрос следует записать в поле раздела «module» — в «контейнер» модуля.

Второй макрос — активирует первый при клике по ячейке.

Выглядит код вызывающий (запускающий ) макрос по клику на ячейку, следующим образом:

Private Sub Worksheet_SelectionChange (ByVal Target As Range)
Dim u As String
On Error Resume Next
If Not Intersect(Target, Range(«B1»)) Is Nothing Then
Call noll
End If
End Sub

Этот код нужно записывать не в контейнер «module», а непосредтвенно в лист. Для этого следует в меню разработчика в просмотре кода:Двойной клик

  • Кликнуть двойным щелчком по названию листа.
  • После двойного клика будет открыто поле для внесения кода аналогичное полю модуля (module).

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

Код стал выглядеть следующим образом:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim u As String
On Error Resume Next
If Not Intersect(Target, Range(«B1»)) Is Nothing Then
Call noll
End If
End Sub

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

Вопросы и пожелания можете оставлять в комментариях или на форуме нашего сайта.
Видео о работе в excel можно найти на нашем youtube канале по ссылке:

Канал «RuExcel»

Удачи в изучении программы Ecxel.

Run a macro in Excel when a specific cell is changed; this also covers when a cell within a range of cells is changed or updated.

Sections:

Run Macro When a Cell Changes (Method 1)

Run Macro When a Cell Changes (Method 2)

Run Macro when a Cell in a Range of Cells is Changed

Notes

Run Macro When a Cell Changes (Method 1)

This works on a specific cell and is the easiest method to use.

Go to the VBA Editor (Alt + F11) and double-click the name of the spreadsheet that contains the cell that will change or just right-click the worksheet tab and click View Code. In the window that opens, select Worksheet from the left drop-down menu and Change from the right drop-down menu.
You should now see this:

For more info on creating macros, view our tutorial on installing a macro in Excel.

Excel will actually run the code that we input here each time a cell within the worksheet is changed, regardless of which cell is changed. As such, we need to make sure that the cell that we want to check is the one that the user is changing. To do this, we use an IF statement and, in this example, Target.Address.

Sample code:

This checks if cell A1 was the cell that was changed and, if it was, a message box appears.

This is a very simple and easy-to-use template. Just change $A$1 to whichever cell you want to check and then put the code that you want to run inside the IF statement.

$A$1 refers to cell A1 and the dollar signs are just another way to reference a cell using what’s called an absolute reference. You will always need to include the dollar signs in the cell reference when you use this method.

Target.address is what gets the address of the cell that was just changed.

Get the value of the Cell

You will probably want to reference the new value of the cell that was changed and you do that like this:

Target.Value

To output the new value of the cell in the message box, I can do this:

If Target.Address = "$A$1" Then

    MsgBox Target.Value

End If

Target is the object that contains all of the information about the cell that was changed, including its location and value.

In the below examples you can also use Target to get the value of a cell the same way as here, though it may not be covered in those sections.

Run Macro When a Cell Changes (Method 2)

(Read the Method 1 example for a full explanation of the setup for the macro. This section covers only the code for the second method.)

The second way to check if the desired cell was changed is a little bit more complicated, but it’s not difficult.

If Not Intersect(Target, Range("A1")) Is Nothing Then

    MsgBox "Hi!"

End If

This method uses Intersect(Target, Range(«A1»)) to find out if the desired cell is being changed.

Just change A1 to the cell that you want to check. For this method, you do not need to include dollar signs around the range reference like you did for method 1.

This method uses the Intersect() function in VBA which determines if the cell that was edited «intersects» with the cell that we are checking.

Reference the value of the cell the same way as the first example.

Run Macro when a Cell in a Range of Cells is Changed

This uses the same syntax as the previous example but with a slight modification.

Here, we want to check if a cell that is within a range of cells has been changed; it could be one of many cells.

If Not Intersect(Target, Range("A1:A5")) Is Nothing Then

    MsgBox "Hi!"

End If

This uses Intersect() just like the previous example to find out if one of the desired cells has been changed.

In this example, the message box appears if any cell in the range A1:A5 is changed. All you have to do is change A1:A5 to the desired range.

Notice that you also don’t need dollar signs in the range reference here like you did in the very first example.

Reference the value of the cell the same way as the first example.

Notes

Knowing which cell was edited and what the new value is for that cell is, as you can see, quite simple. Though simple, this will allow you to make interactive worksheets and workbooks that update and do things automatically without the user having to click a button or use keyboard shortcuts to get a macro to run.

Download the workbook attached to this tutorial and play around with the examples and you will understand them in no time!

Similar Content on TeachExcel

Run a Macro when a User Does Something in the Worksheet in Excel

Tutorial: How to run a macro when a user does something in the worksheet, everything from selecting …

Run a Macro when a User Does Something in the Workbook in Excel

Tutorial:
How to run a macro when a user does something within the Workbook in Excel, such as openi…

Automatically Run a Macro When a Workbook is Opened

Tutorial:
How to make a macro run automatically after a workbook is opened and before anything els…

Stop Excel Events from Triggering when Running a Macro

Tutorial: Create a macro that will run without triggering events, such as the Change event, or Activ…

Automatically Run a Macro at a Certain Time — i.e. Run a Macro at 4:30PM every day

Macro: Automatically run an Excel macro at a certain time. This allows you to not have to worry a…

Subscribe for Weekly Tutorials

BONUS: subscribe now to download our Top Tutorials Ebook!

Понравилась статья? Поделить с друзьями:
  • Vba excel массивы добавление элемента
  • Vba excel макрос по времени
  • Vba excel массивы добавить
  • Vba excel макрос паузы
  • Vba excel массивы диапазоны