Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2010, 21:57   #1
Олег*
Пользователь
 
Регистрация: 07.01.2010
Сообщений: 30
По умолчанию Событие Worksheet_Change не "ловится" на неактивном листе...

Здравствуйте, Уважаемые!

У меня такой вопрос (проблема) возник по ходу разработки макроса под Excel.

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

Разумеется, я решил воспользоваться событием Worksheet_Change в коде изменяемого листа. Но не тут-то было! Оказалось, что если этот лист не активен, то макрос никак не реагирует на это событие. Реакцию вызывает только НЕПОСРЕДСТВЕННОЕ изменение значения ячейки на АКТИВНОМ листе!

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

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

Итак, имеются два листа: Лист1 и Лист2.
На Лист2 в ячейку А1 вписана формула "=Лист1!A1". Таким образом, когда мы изменяем значение в ячейке А1 первого листа, автоматически изменяется и значение в ячейке А1 второго листа.

Теперь в коде второго листа вписываем вот такую процедуру:

Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox (Target)
End Sub

После этого при НЕПОСРЕДСТВЕННОМ изменении любой ячейки на Лист2, выскакивает сообщение с тем значением, которое мы вводим.

Но когда мы изменяем ячейку А1 на первом листе, то сообщение не выскакивает (реакции на событие нет!), хотя значение в ячейке А1 второго листа тоже изменилось...

Как заставить макрос реагировать на изменение ячеек на НЕАКТИВНОМ в данный момент листе?
Олег* вне форума Ответить с цитированием
Старый 07.01.2010, 22:02   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
Но когда мы изменяем ячейку А1 на первом листе, то сообщение не выскакивает (реакции на событие нет!), хотя значение в ячейке А1 второго листа тоже изменилось...
В данном случае событие Worksheet_Change для второго листа и не генерируется...

На втором листе используйте событие
Код:
Private Sub Worksheet_Calculate()
' сработал пересчёт формул на листе
End Sub
вместо
Код:
Private Sub Worksheet_Change(ByVal Target As Range)

End Sub
Цитата:
Как заставить макрос реагировать на изменение ячеек на НЕАКТИВНОМ в данный момент листе?
Можно ещё использовать событие КНИГИ:
Код:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

End Sub

Последний раз редактировалось EducatedFool; 07.01.2010 в 22:06.
EducatedFool вне форума Ответить с цитированием
Старый 07.01.2010, 22:39   #3
Олег*
Пользователь
 
Регистрация: 07.01.2010
Сообщений: 30
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
В данном случае событие Worksheet_Change для второго листа и не генерируется...

На втором листе используйте событие
Код:
Private Sub Worksheet_Calculate()
' сработал пересчёт формул на листе
End Sub
вместо
Код:
Private Sub Worksheet_Change(ByVal Target As Range)

End Sub
Спасибо Вам огромное! Я вопрос ещё задать не успел, а уже ответ получил!!! Супер!!! У темы всего два просмотра и сразу же оптимальное решение Вы мне предложили! Я сейчас проверил на простом примере, всё прекрасно работает! Как раз то, что мне нужно!!!

На самом деле, я этот вопрос задаю уже на ЧЕТВЁРТОМ форуме!!! На одном (не тематическом форуме, но в тематическом разделе) мне не ответили вообще... На форуме, посвящённом "Профессиональной работе в Excel", мне замутили какую-то лажу, а потом попросили сообщить им самим, если я узнаю ответ на этот вопрос. На форуме, посвящённом программированию на всех диалектах Бэйсика, включая и VBA, мне предложили именно этот вариант решения проблемы:


Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Можно ещё использовать событие КНИГИ:
Код:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

End Sub
Но так всё равно не "ловится" событие на НЕАКТИВНОМ листе, я пробовал много раз!

Самое интересное, что на всех тех форумах, за исключением нетематического, просмотров моей темы было больше сотни и ответов на каждом из обоих этих форумов около 10 штук, но НИКТО не додумался до такого простого и ГЕНИАЛЬНОГО (!!!) решения проблемы! Я имею в виду метод Worksheet_Calculate !!!

Ещё раз огромное спасибо!
Олег* вне форума Ответить с цитированием
Старый 07.01.2010, 23:37   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
На самом деле, я этот вопрос задаю уже на ЧЕТВЁРТОМ форуме!!! На одном (не тематическом форуме, но в тематическом разделе) мне не ответили вообще...
Не знаю, на каких форумах Вы задавали свой вопрос, но я просмотрел ещё 3 форума по excel - и не увидел Ваших вопросов
Видимо, какие-то далёкие от Excel форумы Вы выбирали...

Цитата:
Но так всё равно не "ловится" событие на НЕАКТИВНОМ листе, я пробовал много раз!
Конечно, не ловится на НЕАКТИВНОМ - поскольку там формула, но, поскольку отслеживаются ВСЕ листы, а на каком-то из них какая-нибудь ячейка всё-таки изменяется, - поэтому Workbook_SheetChange должно сработать в любом случае.

Но этот вариант касается только случая РУЧНОГО изменения ячеек - если данные в Excel попадают через DDE из другой программы, то тут подойдёт только событие Worksheet_Calculate
EducatedFool вне форума Ответить с цитированием
Старый 08.01.2010, 00:43   #5
Олег*
Пользователь
 
Регистрация: 07.01.2010
Сообщений: 30
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Не знаю, на каких форумах Вы задавали свой вопрос, но я просмотрел ещё 3 форума по excel - и не увидел Ваших вопросов
Видимо, какие-то далёкие от Excel форумы Вы выбирали...
Да нет, форумы самые "продвинутые" Один форум по профессиональным приёмам работы в Excel, другой - форум программистов на всех диалектах Бэйсика, включая VBA. Давать прямые ссылки неэтично, поэтому не даю, но все желающие узнать историю моих мытарств, связанных с попыткой решить эту проблему, могут отправить запрос в поисковик Гугл вот такого содержания:

Цитата:
Здравствуйте, Уважаемые!

У меня такой вопрос (проблема) возник по ходу разработки макроса под Excel.

Дело в следующем... На одном из листов моей рабочей книги имеется ячейка, в которую транслируется значение из ячейки с другого листа. Когда значение в этой ячейке изменяется, программа должна проанализировать изменение и выполнить определённые действия.
Первые два результата поиска как раз-то и будут адресами тех самых форумов. Заодно, можете посмотреть, как там "коллективный разум" целую неделю безуспешно пытался одолеть проблему, которую EducatedFool решил за несколько минут!

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Конечно, не ловится на НЕАКТИВНОМ - поскольку там формула, но, поскольку отслеживаются ВСЕ листы, а на каком-то из них какая-нибудь ячейка всё-таки изменяется, - поэтому Workbook_SheetChange должно сработать в любом случае.

Но этот вариант касается только случая РУЧНОГО изменения ячеек - если данные в Excel попадают через DDE из другой программы, то тут подойдёт только событие Worksheet_Calculate
Честно говоря, мне это сейчас уже не актуально. Сейчас, когда найдено, с Вашей помощью, оптимальное решение, я могу без задержек продолжить дальнейшую разработку задуманного макроса... Сейчас мне уже совсем не хочется вдаваться в чисто теоретические изыскания

А "историю" попыток использовать в моём макросе метод Workbook_SheetChange , и почему он мне не подошёл, все желающие могут прочитать как раз в тех самых темах (на тех двух форумах), которые "выдаст" поисковик Гугл в первых двух результатах поиска...
Олег* вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
"Поймать" событие нажатия на кнопку Lisi4ka Общие вопросы Delphi 12 27.04.2009 18:14
TRichViewEdit - как отловить событие "курсор над таблицей" chandrasecar Компоненты Delphi 0 05.04.2009 20:04
C++ StringGrid событие "правый клик" FW-TOT Помощь студентам 2 03.03.2009 19:17