Worksheet_change или calculate?

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
Eskra
Сообщения: 9
Зарегистрирован: 07 ноя 2006, 09:30

Столкнулся с проблемой.

По DDE периодически в Эксель поступают данные. Необходимо, чтобы макрос срабатывал при поступлении новых данных. В данном случае разумно использовать Calculate, но удобнее использовать Change, т.к. здесь есть Target. Но проблема в том, что Change не срабатывает :( Видимо из-за того, что он срабатывает после выхода из ячейки.
Как это можно обойти?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Странно, что по изменению по DDE-запросу не пороисходит Change...

Впрочем, если это так - то у нас нет другой альтернативы, как использовать Calculate. При использовании Calculate надо учесть, что если макрос-обработчик этого события будет сам записывать что-то на лист, то это приведет к рекурсивному вызову этого события и, соответственно, к зацикливанию макроса. Т.е. надо либо на писать ничего в этот же лист, либо предусмотреть предотвращение рекурсивного вызова (если будет нужно спрашивайте)
Найти ячейку, подлежащую обработке, скорее всего не составит труда. Либо это всегда одна и та же ячейка (если DDE-запрос складывает данные в одно и то же место), либо последняя строка в таблице.
Для надежности можно "научить" макрос как-нибудь помечать уже обработанные строки, или в какую-нибуть определенную ячейку записывать номер обработанной строки. Пусть следующий запуск макроса продолжает работу как бы с того, где предыдущий закончил.
Eskra
Сообщения: 9
Зарегистрирован: 07 ноя 2006, 09:30

Мне как раз и надо понадежней :) Я, в принципе, все так и реализовал, но хотел все-таки выяснить до конца с Change. Уж очень удобно. Благодарю за ответ!
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Eskra, Событие Worksheet_Change не вызывается при пересчёте и изменении значений формул, а DDE-запросы MS Excel воспринимает именно так, поэтому, Вы конечно же можете использовать Worksheet_Calculate, но можете и посмотреть справку касательно метода SetLinkOnData об'екта Workbook, возможно он окажется Вам полезен ...
Eskra
Сообщения: 9
Зарегистрирован: 07 ноя 2006, 09:30

Спасибо... буду пробовать :)
Ответить