При изменении значения в ячейке 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% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Было три ComboBox, в первых двух выводились значения начала и окончания производства партии, в третьем при выборе времени окончания появлялись характеристики производства партии. Все значения забирались из базы данных. Так вот нужно сделать то же самое, но время начала и окончания должны быть записаны вручную в ячейки и после этого на основе этих данных формируется список в третьем ComboBox.
Код на комбобоксы выглядел так:

Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Private Sub Workbook_Open()
    Dim cnt As ADODB.Connection, NewLine As Variant
    Dim rcs As ADODB.Recordset
    Set cnt = CreateObject("ADODB.Connection")
        cnt.ConnectionString = "Provider = SQLOLEDB.1; Persist Security Info = False; Data Source = '" + ActiveSheet.Range("B4").Value + "'; User ID = '" + ActiveSheet.Range("B6").Value + "'; Password = '" + ActiveSheet.Range("B7").Value + "'; Initial Catalog = '" + ActiveSheet.Range("B5").Value + "'"
        cnt.Open
    Set rcs = cnt.Execute("SELECT Start_Time FROM Batch_Information")
    Do Until rcs.EOF = True
        ActiveSheet.ComboBox1.AddItem Format(rcs.Fields.Item(0).Value, "YYYY.MM.DD hh:mm:ss")
        rcs.MoveNext
    Loop
        rcs.Close: cnt.Close
    Set cnt = Nothing
End Sub
 
Private Sub ComboBox1_Change()
    ActiveSheet.ComboBox2.Clear
    ActiveSheet.ComboBox3.Clear
    Dim cnt As ADODB.Connection, NewLine As Variant
    Dim rcs As ADODB.Recordset
    Set cnt = CreateObject("ADODB.Connection")
        cnt.ConnectionString = "Provider = SQLOLEDB.1; Persist Security Info = False; Data Source = '" + ActiveSheet.Range("B4").Value + "'; User ID = '" + ActiveSheet.Range("B6").Value + "'; Password = '" + ActiveSheet.Range("B7").Value + "'; Initial Catalog = '" + ActiveSheet.Range("B5").Value + "'"
        cnt.Open
    Set rcs = cnt.Execute("SELECT End_Time FROM Batch_Information")
    Do Until rcs.EOF = True
        Me.ComboBox2.AddItem Format(rcs.Fields.Item(0).Value, "YYYY.MM.DD hh:mm:ss")
        rcs.MoveNext
    Loop
        rcs.Close: cnt.Close
    Set cnt = Nothing
End Sub
 
Private Sub ComboBox2_Change()
    ActiveSheet.ComboBox3.Clear
    Dim cnt As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim a As Variant
    Dim b As String, c As String
        a = TextBox1.Value
        b = Format(CDate(ComboBox1.Value), "YYYY-MM-DD hh:mm:ss")
        c = Format(CDate(ComboBox2.Value), "YYYY-MM-DD hh:mm:ss")
    Set cnt = CreateObject("ADODB.Connection")
        cnt.ConnectionString = "Provider = SQLOLEDB.1; Persist Security Info = False; Data Source = '" + ActiveSheet.Range("B4").Value + "'; User ID = '" + ActiveSheet.Range("B6").Value + "'; Password = '" + ActiveSheet.Range("B7").Value + "'; Initial Catalog = '" + ActiveSheet.Range("B5").Value + "'"
        cnt.Open
    Set rst = cnt.Execute("DECLARE @Start_Time datetime = convert(smalldatetime,'" + b + "',120), @End_Time   datetime = convert(smalldatetime,'" + c + "',120) SELECT DISTINCT Features FROM Features f JOIN Process_Information pi ON f.Features_id = pi.Features_id JOIN Batch_Information bi ON pi.Batch_id = bi.Batch_id WHERE pi.Value > '" + a + "' AND bi.Start_Time >= @Start_Time AND bi.End_Time <= @End_Time")
    Do Until rst.EOF = True
        Worksheets(1).ComboBox3.AddItem rst.Fields.Item(0).Value
        rst.MoveNext
    Loop
        rst.Close: cnt.Close
    Set cnt = Nothing
End Sub

Добавлено через 35 минут
Сделал проще:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> [F7].Address Then Exit Sub
    ActiveSheet.ComboBox3.Clear
    Dim cnt As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim a As Variant
    Dim b As String, c As String
        a = ActiveSheet.TextBox1.Value
        b = Format(CDate(ActiveSheet.Range("F5").Value), "YYYY-MM-DD hh:mm:ss")
        c = Format(CDate(ActiveSheet.Range("F7").Value), "YYYY-MM-DD hh:mm:ss")
    Set cnt = CreateObject("ADODB.Connection")
        cnt.ConnectionString = "Provider = SQLOLEDB.1; Persist Security Info = False; Data Source = '" + ActiveSheet.Range("B4").Value + "'; User ID = '" + ActiveSheet.Range("B6").Value + "'; Password = '" + ActiveSheet.Range("B7").Value + "'; Initial Catalog = '" + ActiveSheet.Range("B5").Value + "'"
        cnt.Open
    Set rst = cnt.Execute("SELECT DISTINCT Features FROM Features")
    Do Until rst.EOF = True
        Worksheets(1).ComboBox3.AddItem rst.Fields.Item(0).Value
        rst.MoveNext
    Loop
        rst.Close: cnt.Close
    Set cnt = Nothing
End Sub

При изменении ячейки F7 происходит заполнение третьего комбобокса, теперь мне нужно тоже сделать и при изменении ячейки F5. Пробовал условие писать через OR — не получается.

В 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.

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

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

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

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

рассказывалось о том, как реализовать в программе 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.

Like this post? Please share to your friends:
  • При изменении данных в каких либо ячейках ms excel происходит пересчета
  • При запуске excel 2010 начинается установка
  • При изменении данных в ms excel формулы
  • При запуске excel 2007 stdole32
  • При изменении в ячейке excel числового формата на процентный изменяется ются