Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
29.03.2024, 01:56:21

Войти
Интересные и полезные статьи по работе с Excel и VBA можно найти в разделе ХИТРОСТИ
33 233 Сообщений в 5 454 Тем от 6 750 Пользователей
Последний пользователь: Alex1210
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Excel и VBA
| | |-+  Запуск макроса при изменении в ячейке
Страниц: [1]   Вниз
Печать
Автор Тема: Запуск макроса при изменении в ячейке  (Прочитано 7166 раз)
0 Пользователей и 1 Гость смотрят эту тему.
k.
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 6


Просмотр профиля
« : 09.05.2018, 10:33:20 »

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

Описание желаемого результата:
Мне необходимо, чтобы при изменении значения в ячейке "A17" на листе "qa" срабатывал макрос на листе "st", включая автофильтр, выбирая из него значение, находящееся в ячейке "A17" и, в конечном итоге, копируя его на лист "pa".

В чём возникла проблема? Макрос не работает с процедурой подсчета изменений. Если я макрос запускаю как обычную процедуру, то все выполняется как надо. Но мне необходимо его срабатывание при изменении ячейки "A17" на листе "qa".

Во вложении прилагаю файл.
Спасибо.
« Последнее редактирование: 09.05.2018, 10:38:40 от k. » Записан
vikttur
Глобальный модератор
Ветеран
*****

Репутация: +124/-0
Офлайн Офлайн

Сообщений: 1 816



Просмотр профиля
« Ответ #1 : 09.05.2018, 12:45:52 »

добавьте в процедуру обработки события листа определение диапазона реагирования:
Код: (vb)
If Not Application.Intersect(Range("A17"), Target) Is Nothing Then
....
End If

О процедуре подсчета не понял...

Примечание:
Set st - занимаете часть памяти, по окончании процедуры область памяти не очищается. при каждом изменении на листе операция повторяется...
Set st = Nothing - для всех Set
« Последнее редактирование: 09.05.2018, 12:51:54 от vikttur » Записан
k.
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 6


Просмотр профиля
« Ответ #2 : 10.05.2018, 23:00:25 »

Комментарий глобального модератора кнопка цитироваия не для бездумного копирования всего сообщения
Я добавил Вашу строку кода, но у меня все также ничего не происходит, когда я выбираю значение в ячейке "A17" из выпадающего списка.
Сразу вопрос возник: в чём отличие от написанного мною
Код: (vb)
If Target.Address = "À17" Then
и вашего
Код: (vb)
If Not Application.Intersect(Range("A17"), Target) Is Nothing Then
....
End If
?
« Последнее редактирование: 10.05.2018, 23:27:37 от vikttur » Записан
vikttur
Глобальный модератор
Ветеран
*****

Репутация: +124/-0
Офлайн Офлайн

Сообщений: 1 816



Просмотр профиля
« Ответ #3 : 10.05.2018, 23:38:55 »

Не заметил Вашей строки... Обычно определение диапазона пишут в начале процедуры. Зачем определять объекты, если изменения происходят не в диапазоне реагирования? Вы же выделяете память под объекты, а потом думаете - а надо было? Улыбка

Отличие: работать будет и так, и эдак. но заче определять адрес, если можно обратиться сразу к target?
И Вы не ответили на вопрос о процедуре подсчета.
« Последнее редактирование: 10.05.2018, 23:41:50 от vikttur » Записан
alex77755
Постоялец
***

Репутация: +17/-0
Офлайн Офлайн

Сообщений: 160


Просмотр профиля E-mail
« Ответ #4 : 11.05.2018, 04:34:00 »

Код: (vb)
If target.Address = "$AIf target.Address = "$A$17" Then7" Then

ИМХО: для одной ячейки так предпочтительней.
С Intersect для диапазона
Что за ерунда?! теги кода портят выражение
If target.Address = "$A$17" Then
« Последнее редактирование: 11.05.2018, 04:39:47 от alex77755 » Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 828



Просмотр профиля WWW
« Ответ #5 : 11.05.2018, 11:56:14 »

теги кода портят выражение
только если встречается знак $ и цифра после него(как правило 1). Это связано с особенностью кода по подсветке синтаксиса языков программирования.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
k.
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 6


Просмотр профиля
« Ответ #6 : 19.05.2018, 21:32:11 »

Я немного разобрался.
Ничего не работало, потому что:
1) Application.EnableEvents = False было
2) "$A$17" = "А" была на кириллице написана.

И Вы не ответили на вопрос о процедуре подсчета.
Это я так своеобразно перевёл процедуру "Private Sub Worksheet_Change(ByVal target As Range)"

Но на этом проблема была частично разрешена.
Когда автофильтр срабатывает на листе "st", то условие отбора он берёт с листа "qa", как раз из ячейки "A17".
Мне необходимо, чтобы полученный результат отбора (на листе "st", который находится в столбце "В") был скопирован и вставлен на лист "pa"
Но почему-то копирование происходило с листа "qa". Решил проблему, когда прочитал статью https://www.excel-vba.ru/chto-umeet-excel/kak-obratitsya-k-diapazonu-iz-vba/
Итоговый рабочий код на скриншоте, тут почему-то строки дублируются..


Спасибо всем за участие.
« Последнее редактирование: 19.05.2018, 21:43:41 от k. » Записан
vikttur
Глобальный модератор
Ветеран
*****

Репутация: +124/-0
Офлайн Офлайн

Сообщений: 1 816



Просмотр профиля
« Ответ #7 : 19.05.2018, 22:22:27 »

Цитировать
"$A$17" = "А" была на кириллице написана.
Вот для подобных случаев и нужно ставить наверху модуля
Код: (vb)
Option Explicit
Записан
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru