Excel works!

В 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.
Лично я рекомендую добавить больше условий, при каких действиях будет выполняться ваше действие, чтобы макрос не запускался при любом изменении. Вообще надо быть аккуратным с этой функцией. Бывает и такое — вы забываете, что есть макрос с условиями, а информация изменяется, можно даже не заметить этого
Похожие статьи
- 14.12.2015Как сделать кнопку в Excel?Posted in Макросы
- 18.08.2017Запуск макроса в Excel. Как запустить макрос при открытии файла?Posted in Макросы
- 01.06.2018Полезные макросы Excel. Простые возможности VBA, которые я часто используюPosted in Макросы
- 07.04.2015Как написать макрос в Excel?Posted in Макросы
- 09.02.2019Определить тип данных в ячейке. Функция ТИП в ExcelPosted in Формулы, Работа с ячейками
- 25.10.2015Автофильтр в Excel. Расширенный фильтрPosted in Excel, Работа с текстом, Работа с ячейками
- 08.07.2016Как менять размер ячейки в Excel?Posted in Работа с ячейками
- 06.02.2016Функция ЯЧЕЙКА в ExcelPosted in Формулы, Работа с ячейками
VBA Excel. Запуск макроса при изменении ячейки
Код 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 & » изменено.»
Range(«A1:D8») — это диапазон, при изменении значения любой ячейки которого, произойдет выполнение функции MsgBox. Диапазон может состоять из одной ячейки. Код размещается в модуле рабочего листа, при изменении значения ячейки на котором следует запустить макрос (процедуру). Вместо функции MsgBox в приведенном коде следует разместить ссылку на исполняемую процедуру (макрос) VBA Excel.
Примечания
- Макрос будет запущен при изменении значения ячейки вручную или программным способом, а также при нажатии клавиши Delete.
- Вызываемая процедура будет запущена и в том случае, если в ячейку будет записано то же самое значение, которое в ней и было. Например, в ячейке было число 28, и в нее записали вручную или программно число 28; или нажали клавишу Delete на пустой ячейке.
- Макрос не будет запущен при изменении значения ячейки с формулой в результате ее пересчета.
Исключение ложного срабатывания
Если в качестве диапазона указать только одну ячейку, можно исключить срабатывание кода VBA Excel при записи в ячейку того же значения. Для этого необходимо использовать переменную уровня модуля, чтобы с ее помощью контролировать факт изменения или неизменения значения в указанной ячейке.
Developing.ru
Автоматический запуск макроса при изменении значений в ячейке
Весь MS Office, программирование на Visual Basic for Applications и MS VB
6 сообщений • Страница 1 из 1
ipcp Сообщения: 5 Зарегистрирован: 14 ноя 2009, 12:20
Здравствуйте.
Помогите с проблемой, плиз.
Есть макрос который сравнивает и форматирует ячейки таблицы.
Необходимо автоматический запуск данного макроса при изменении любой ячейки в таблице.
SAS888 Сообщения: 156 Зарегистрирован: 16 янв 2008, 08:28
В модуль требуемого листа поместите код:
Private Sub Worksheet_Change(ByVal Target As Range) Dim rng As Range: Set rng = [A1:F10] 'диапазон Вашей таблицы If Not Intersect(rng, Target) Is Nothing Then MyMacro End Sub
Теперь, при изменении значения любой из ячеек диапазона «A1:F10» будет запущен макрос «MyMacro».
Будьте внимательны! Если Ваш макрос будет работать с ячейками таблицы, то в начале процедуры необходимо отключить обработчик событий командой Application.EnableEvents = False. По окончании процедуры, естественно, включить его Application.EnableEvents = True.
svat Сообщения: 3 Зарегистрирован: 13 фев 2010, 10:59
SAS888 писал(а): В модуль требуемого листа поместите код:
Private Sub Worksheet_Change(ByVal Target As Range) Dim rng As Range: Set rng = [A1:F10] 'диапазон Вашей таблицы If Not Intersect(rng, Target) Is Nothing Then MyMacro End Sub
Теперь, при изменении значения любой из ячеек диапазона «A1:F10» будет запущен макрос «MyMacro».
Будьте внимательны! Если Ваш макрос будет работать с ячейками таблицы, то в начале процедуры необходимо отключить обработчик событий командой Application.EnableEvents = False. По окончании процедуры, естественно, включить его Application.EnableEvents = True.
я что-то так и не понял как делать, я уж и так и эдак вставлял не получается. Может кто-нибудь сможет видоизменить мой макрос, чтобы он запускался при внесении числа в ячейку, то есть если в одном листе excel-евского файла в какой-то ячейке ввести число например 543 то макрос переходит не визуально, а в памяти, на другой лист файла, а там таблица из нескольких столбцов с числами, так вот макрос находит в определенном солбце это (543) число, далее сравнивает рядом с ним стоящее в одной строке число с нулем, если оно меньше нуля то макрос возвращает в ту ячейку куда вводили число 543 значение того отрицательного числа которое стоит рядом в одной строке с числом 543. Ну а если число которое стоит в таблице рядом с 543 больше нуля то макрос ни чего не делает, а оператор вводит данные в другую ячейку. Ну в общем-то как сравнивать числа и выводить число в какую-то ячейку с этим я сам справлюсь, а вот как написать чтобы макрос начинал работу после введения данных в ячейку — вот это я не знаю. Кто знает подскажите пожалуйста?
Sub сравнение()
‘
‘ сравнение Макрос
‘ Макрос записан 13.02.2010 (ккк)
‘
‘ Сочетание клавиш: Ctrl+s
‘
Dim a As Integer ‘ — это номер строки в таблице где происходит сравнение
Dim n As Integer ‘ — это переменная которой присваивается значение числа после того как его ввели
Dim x As Integer ‘ — это номер строки на которой находиться ячейка в которую вводиться число
Dim y As Integer ‘ — это номер столбца в котором находиться ячейка в которую вводиться число
a = 1 ‘задается номер строки с которой начинаем
‘ ВОТ ТУТ КАК РАЗ В МЕСТО ЭТИХ ТРЕХ СТРОЧЕК И ДОЛЖНА ПО ИДЕЕ БЫТЬ КОМАНДА
‘ КОТОРАЯ ЗАПУСКАЕТ МАКРОС ПОСЛЕ ВВОДА ЧИСЛА В ЯЧЕЙКУ
‘ Range(«B2»).Select
‘ ActiveCell.FormulaR1C1 = «543»
‘ n = введенному в ячейку числу
x = 2 ‘ для того чтобы макрос хоть как то работал задаем умышленно фиксированное значение
y = 2 ‘ для того чтобы макрос хоть как то работал задаем умышленно фиксированное значение
n = Sheets(«лист-данные»).Cells(x, y) ‘присваиваем переменной n значение введенного в ячейку числа
2 If n = Sheets(«лист-таблица»).Cells(a, 1) Then GoTo 1 ‘ находим такое же число как оператор вводил но уже в эталонной таблице
a = a + 1
If a 1 If Sheets(«лист-таблица»).Cells(a, 2) > 0 Then GoTo 3 ‘ Число найдено, а сдесь выясняем отрицательное ли число которое стоит рядом в эталонной таблице
Sheets(«лист-данные»).Cells(x, y) = Sheets(«лист-таблица»).Cells(a, 2) ‘присваивается здачение отрицательного числа ячейке в которую изначально был ввод
Sheets(«лист-данные»).Select ‘ну тут ниже меняетс цвет шриф для яркости
Cells(x, y).Select
Selection.Font.ColorIndex = 3
Selection.Font.Bold = True
With Selection.Font
.Name = «Arial Cyr»
.Size = 12
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = 3
End With
pause (20 = cek) ‘ то же не знаю как писать паузу в работе, а она нужна чтобы оператор увидел результат
4 r = r + 1
If r < 50000000 Then GoTo 4 ' пришлось вместо паузы вот такой ерундой заниматься
Selection.ClearContents ‘очистка ячейки куда был ввод
Selection.Font.ColorIndex = 1
Естественно макрос до коца не проработан, да это не главное сейча для меня, проработаю, мне важно начало его написать.
Как сделать чтобы макрос в excel выполнялся автоматически при изменении значений ячеек
28.01.2010 12:53:27
Здравствуйте.
У меня есть максрос:
Sub Zashita()
ActiveSheet.Unprotect
Z = Range(«I2»).Value
Range(Z).Select
Selection.Locked = False
Selection.FormulaHidden = False
x = Range(«I1»).Value
Range(x).Select
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
Я бы хотел, чтобы он запускался при заизменении значения нужной мне ячейки.
Помогите пожалуйста.
Спасибо.
Я соображаю, но не всегда. 🙂
Сообщений: 60940 Регистрация: 14.09.2012
Контакты см. в профиле
28.01.2010 13:20:46
Вставьте этот код в модуль листа, в котором происходит изменение значение ячейки:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
If Not Intersect(Target, Range(«A1»)) Is Nothing Then
Call Zashita
End If
End Sub
Контролируется ячейка А1
Пользователь
Сообщений: 129 Регистрация: 01.01.1970