Пересчет пользовательских функций при нажатии F9

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

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

Ответить
a.p.
Сообщения: 3
Зарегистрирован: 01 сен 2008, 19:28

Здравствуйте.
Бьюсь с одной распространненой проблемой - пересчет пользовательских функций (VBA UDF) по нажатию на F9 или Ctrl+F9. Как известно, UDF пересчитывается только при изменении какого-нибудь входного параметра. А как организовать пересчет UDF при каждом нажатии F9 или Ctrl+F9 (даже если параметры остались прежними)? Метод volatile абсолютно не подходит, т.к на листе содержится достаточно много данный (по этой же причине отпадает вариант Ctrl+Alt+F9). Я пытался что-то организовать с использованием Application event SheetCalculate, но безуспешно :(
Буду рад любым советам.
Спасибо.
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

а можно пример конкретного файла, где это нужно и не работает?
a.p.
Сообщения: 3
Зарегистрирован: 01 сен 2008, 19:28

Serge_Bliznykov писал(а):а можно пример конкретного файла, где это нужно и не работает?

согласен с Вами - информации, конечно, недостаточно.
Дело в том, что проблема изначально связана с использованием C++ функции, созданной в C++ XLL. В качестве параметра, ей передается строка - название некоторого объекта, также созданного в C++. С течением времени содержимое данного объекта меняется, но Excel не может об этом знать, т.к параметр-строка остается неизменной (если пользователь нажмет Ctrl+Alt+F9 функция естественно пересчитается, однако этот вариант не устраивает). Я пытался схитрить и поместить вызов данной функции в специально созданную VBA-функцию, используя для этого Application.Run("xllFunction", objectId), где objectId имеет тип string. Далее я пытался заставить Excel пересчитывать данную VBA-функцию по каждому нажатию F9, но ничего не получилось :(
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

a.p.,постановка специфическая ... IMHO надо при модификации вашего объекта менять
какую то ячейку в EXCEL а в функции добавить значение этой ячейки аргументом. Или включить её значение в выражение, использующее вашу UDF
Андрей Энтелис,
aentelis.livejournal.com
a.p.
Сообщения: 3
Зарегистрирован: 01 сен 2008, 19:28

Aent, совершенно правильное предложение. Опять моя ошибка, что не объяснил и этот момент. Действительно можно сделать аргумент trigger, который будет ссылаться на ячейку, изменяющуюся при модификации объекта (более того, такая возможность существует). Однако данный вариант тоже не устраивает - аналогичных функций достаточно много на рабочей книги, как и объектов, к которым они обращаются, т.ч пользователю просто не удобно дополнительно каждый раз еще и ссылаться на какие-то ячейки. Именно поэтому возникла идея создания промежуточных VBA-функций, т.к была надежда, что их пересчет можно вызвать
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

a.p.,определите в EXCEL имя ИМЯ_ОБЪЕКТА вида =СЦЕПИТЬ("ИМЯ_ОБЪЕКТА";ТДАТА())
и обращайтесь к вашей функции с этим ИМЕНЕМ в качестве аргумента
=YourUDF(ИМЯ_ОБЪЕКТА)
Единственно что нужно будет проинструктировать пользователя что бы он не указывал при вызове кавычек вокруг имени объекта
И всё по F9 будет пересчитываться...
Более того, если вы всё таки будете изменять при изменении вашего объекта Worksheet, то перехватывая Worksheet_Change для нужной ячейки и выдавая
Worsheet(...).Calculate,
вы полностью автоматизируете процесс
Андрей Энтелис,
aentelis.livejournal.com
Vlanib
Сообщения: 2
Зарегистрирован: 18 сен 2008, 14:03

...Как известно, UDF пересчитывается только при изменении какого-нибудь входного параметра. А как организовать пересчет UDF при каждом нажатии F9 или Ctrl+F9 (даже если параметры остались прежними)?...
Конечно не буду оригинален, но cntr+shift+alt+F9 - безусловный пересчет листа, независимо от изменения аргументов. Т.е. ивент Worksheet_Calculate вызывается по любому!
Ответить