Предположим, у меня есть несколько кодов макросов в моей книге, и теперь я хочу запускать эти коды на основе значения ячейки. В этой статье я расскажу о нескольких ситуациях, с которыми вы можете столкнуться в повседневной работе при использовании Excel.
Запустить или запустить макрос, если значение ячейки больше или меньше определенного значения с кодом VBA
Запустить или запустить макрос, если значение ячейки равно определенному тексту с кодом VBA
Запустить или запустить макрос, если значение ячейки больше или меньше определенного значения с кодом VBA
Например, если значение в ячейке A1 находится в диапазоне от 10 до 50, запустите macro1, а если значение больше 50, запустите macro2. Чтобы решить эту задачу в Excel, примените следующий код VBA.
1. Щелкните правой кнопкой мыши вкладку листа, на которой вы хотите выполнить макрос на основе значения ячейки, а затем выберите Просмотреть код из контекстного меню, а в открывшемся Microsoft Visual Basic для приложений окна, скопируйте и вставьте следующий код в пустой модуль:
Код VBA: запуск макроса, если значение ячейки больше или меньше:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Target.Cells.Count > 1 Then Exit Sub
If IsNumeric(Target) And Target.Address = "$A$1" Then
Select Case Target.Value
Case 10 To 50: Macro1
Case Is > 50: Macro2
End Select
End If
End Sub
Внимание: В приведенном выше коде:
A1 это ячейка, которая содержит конкретное значение, на основе которого вы хотите запустить макрос;
Случай с 10 по 50: Macro1: это означает, что если значение находится между 10 и 50, запустить Macro1;
Случай> 50: Macro2: это означает, что если значение больше 50, запустить Macro2.
Пожалуйста, измените названия макросов и критерии по своему усмотрению, и вы также можете добавить дополнительные критерии после Коробка скрипты.
2. Затем сохраните и закройте это окно кода, теперь, когда значение, которое вы вводите в ячейке A10, составляет от 50 до 1, будет запущен макрос Macro1, если введенное значение больше 50, выполняется макрос Macro2.
Запустить или запустить макрос, если значение ячейки равно определенному тексту с кодом VBA
Если вы хотите запускать макрос на основе определенного текста в ячейке, например, для запуска макроса 1, если введен текст «Удалить», и запуска макроса 2, если введен текст «Вставить». Следующий код может оказать вам услугу.
1. Щелкните правой кнопкой мыши лист, на котором вы хотите выполнить макрос на основе значения ячейки, а затем выберите Просмотреть код из контекстного меню, а в открывшемся Microsoft Visual Basic для приложений окна, скопируйте и вставьте следующий код в пустой модуль:
Код VBA: запустить макрос, если значением ячейки является определенный текст
Sub worksheet_change(ByVal target As Range)
Set target = Range("A1")
If target.Value = "Delete" Then
Call Macro1
End If
If target.Value = "Insert" Then
Call Macro2
End If
End Sub
Внимание: В приведенном выше коде «Удалить(Основной ключ) и Вставить»- это тексты ячеек, на основе которых вы хотите запускать макросы, и Macro1 и Macro2 макросы, которые вы хотите выполнить на основе текста. Пожалуйста, измените их по своему усмотрению.
2. Затем сохраните этот код и закройте окно, теперь при вводе текста «Удалить» в ячейку A1 срабатывает макрос 1, если вводится текст «Вставить», выполняется макрос 2.
Статьи по теме:
Как запустить макрос при изменении значения ячейки в Excel?
Как запустить макрос автоматически перед печатью в Excel?
Как запустить макрос на основе значения, выбранного из раскрывающегося списка в Excel?
Как запустить макрос, щелкнув гиперссылки в Excel?
Как запустить макрос, когда лист выбран из книги?
Лучшие инструменты для работы в офисе
Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%
- Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
- Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон…
- Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны…
- Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
- Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
- Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии…
- Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
- Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF…
- Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.
Вкладка Office: интерфейс с вкладками в Office и упрощение работы
- Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
- Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
- Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!
|
Polisimus Пользователь Сообщений: 15 |
Пусть ячейка A1 принимает только два значения: 1 или 0. Как только значение в этой ячейке принимает 1, тут же должен автоматически запускаться макрос (под именем Put-record; он вставляет строку в таблице). Если ячейка принимает значение 0 (или, допустим, какое-либо иное значение, отличное от 1), то ничего не требуется специально запускать, пока ячейка вновь не станет равной единице. Нужен VBA-код этого макроса, который бы сам мониторил ячейку A1 и запускал бы другой макрос Put-record каждый раз, как только значение ячейки A1 сменится с нуля (или с какой-л. другой цифры или значения) на единицу. |
|
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Вставьте этот код в модуль нужного листа. |
|
Polisimus Пользователь Сообщений: 15 |
Private Sub Worksheet_Change(ByVal Target As Range) Но этот код требует дополнительного подтверждения запуска макроса Put_record |
|
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
Как все запущено… Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
|
Polisimus Пользователь Сообщений: 15 |
Хорошо, но можно, я попробовал, и так: Private Sub Worksheet_Change(ByVal Target As Range) Этот код работает без вопросов, но сейчас попробую и ваш. Здесь auto-put-record.xls — имя файла. |
|
Polisimus Пользователь Сообщений: 15 |
И ваш код работает. Спасибо вам и Юрий М ! |
|
Polisimus Пользователь Сообщений: 15 |
Если A1 является формулой, т.е. ссылается на другие ячейки, то все эти выше указанные коды — не работаю. Что делать? |
|
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
использовать не Private Sub Worksheet_Change(ByVal Target As Range) Либо так(одно и то же, но меньше строк) Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
|
Polisimus Пользователь Сообщений: 15 |
Макрос автоматически вставляет строки не один раз, как требуется, а бесконечное число раз — пока не выдаст ошибку ( |
|
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
При вставке строк событие Calculate Или Change происходит? Вот макрос и будет срабатывать. Нужно отключить событие. |
|
ytk5kyky Пользователь Сообщений: 2410 |
Отключайте события в событиях: |
|
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
Значит надо завести глобальную переменную и на неё ориентироваться. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
|
Polisimus Пользователь Сообщений: 15 |
{quote}{login=Лузер™}{date=05.08.2009 01:51}{thema=}{post}Отключайте события в событиях: T.е. так: Private Sub Worksheet_Calculate() Этот код приводит к следующему дефекту: при нажатии клавиши «Enter», на любом месте, на любой ячейке Листа1, если ячейка A1 все еще остается = 1, запускается макрос Put_record. Можно ли устранить этот дефект. |
|
The_Prist Пользователь Сообщений: 14181 Профессиональная разработка приложений для MS Office |
{quote}{login=Polisimus}{date=05.08.2009 02:24}{thema=Re: }{post}при нажатии клавиши «Enter», на любом месте, на любой ячейке Листа1, если ячейка A1 все еще остается = 1, запускается макрос Put_record. Можно ли устранить этот дефект.{/post}{/quote} Я Вам написал код, который будет вставлять строку только один раз — при изменении значения в ячейке А1. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
|
Polisimus Пользователь Сообщений: 15 |
{quote}{login=The_Prist}{date=05.08.2009 01:53}{thema=}{post}Значит надо завести глобальную переменную и на неё ориентироваться. А этот код привел к очередному зацикливанию (код находится в модуле Листа1) |
|
ytk5kyky Пользователь Сообщений: 2410 |
Polisimus, Я Вам дал пример для одного события. Отключать надо везде, что Вам и посоветовал Юрий М. |
|
Polisimus Пользователь Сообщений: 15 |
{quote}{login=Юрий М}{date=05.08.2009 01:51}{thema=}{post}При вставке строк событие Calculate Или Change происходит? Вот макрос и будет срабатывать. Нужно отключить событие.{/post}{/quote} Вот макрос вставки: Rows(«7:7»).Select А вот формула в ячейке A7 =A$4+A$5 |
|
Polisimus Пользователь Сообщений: 15 |
С вашей помощью и с помощью своей интуиции. Ваши коды + плюс интуиция — вот что вышло: Public bInsert As Boolean Спасибо всем вам, господа программисты, и моей интуиции. |
|
Кажется нашел что нужно. Подскажите каким образом изменить код что бы второй макрос удалял действия первого макроса |
|
|
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Запишите макрорекордером все действия, которые требуются для «восстановления» после работы первого макроса. Может Вы про «откат» до момента работы первого макроса? |
|
При выборе «1» у меня вставляется таблица (макрос1), если я выберу «2» то эта таблица должна удалиться (макрос2). Я понимаю что тот же самый код только с другими значениями может использоваться. Вот только как их связать, эти коды, я не знаю. |
|
|
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Ну так и запишите удаление этой таблицы. |
|
{quote}{login=Юрий М}{date=09.09.2010 03:42}{thema=}{post}Ну так и запишите удаление этой таблицы.{/post}{/quote} |
|
|
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
А я знаю где у Вас выбирается «1»? |
|
Извините, на примере выше указанного кода A1 |
|
|
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
If [A1] = 1 Then |
|
{quote}{login=Юрий М}{date=09.09.2010 03:53}{thema=}{post}If [A1] = 1 Then |
|
|
Юрий М Модератор Сообщений: 60570 Контакты см. в профиле |
Удалите всё из модуля листа и вставьте туда этот код: |
|
Заработало, ура. Спасибо! |
|
|
or_evgen Пользователь Сообщений: 6 |
#30 30.10.2011 13:34:07 Public bInsert As Boolean А как изменить этот код, чтобы он запускал второй макрос (Put_record2) при значении А1 = 2, 3, 5? |
В 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.
Лично я рекомендую добавить больше условий, при каких действиях будет выполняться ваше действие, чтобы макрос не запускался при любом изменении. Вообще надо быть аккуратным с этой функцией. Бывает и такое — вы забываете, что есть макрос с условиями, а информация изменяется, можно даже не заметить этого
Запуск макроса (процедуры) из кода 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 при активации рабочего листа и, затем, перезаписывается при каждой перезаписи значения в ячейке.
Код этого примера размещен в модуле рабочего листа, но код вызываемой процедуры может быть вынесен из него в другой модуль.
|
Запуск макроса по условию |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |







