Страница 1 из 1
Пересчет пользовательских функций при нажатии F9
Добавлено: 23 сен 2008, 00:06
a.p.
Здравствуйте.
Бьюсь с одной распространненой проблемой - пересчет пользовательских функций (VBA UDF) по нажатию на F9 или Ctrl+F9. Как известно, UDF пересчитывается только при изменении какого-нибудь входного параметра. А как организовать пересчет UDF при каждом нажатии F9 или Ctrl+F9 (даже если параметры остались прежними)? Метод volatile абсолютно не подходит, т.к на листе содержится достаточно много данный (по этой же причине отпадает вариант Ctrl+Alt+F9). Я пытался что-то организовать с использованием Application event SheetCalculate, но безуспешно
Буду рад любым советам.
Спасибо.
Re: Пересчет пользовательских функций при нажатии F9
Добавлено: 23 сен 2008, 10:26
Serge_Bliznykov
а можно пример конкретного файла, где это нужно и не работает?
Re: Пересчет пользовательских функций при нажатии F9
Добавлено: 23 сен 2008, 11:41
a.p.
Serge_Bliznykov писал(а):а можно пример конкретного файла, где это нужно и не работает?
согласен с Вами - информации, конечно, недостаточно.
Дело в том, что проблема изначально связана с использованием C++ функции, созданной в C++ XLL. В качестве параметра, ей передается строка - название некоторого объекта, также созданного в C++. С течением времени содержимое данного объекта меняется, но Excel не может об этом знать, т.к параметр-строка остается неизменной (если пользователь нажмет Ctrl+Alt+F9 функция естественно пересчитается, однако этот вариант не устраивает). Я пытался схитрить и поместить вызов данной функции в специально созданную VBA-функцию, используя для этого Application.Run("xllFunction", objectId), где objectId имеет тип string. Далее я пытался заставить Excel пересчитывать данную VBA-функцию по каждому нажатию F9, но ничего не получилось

Re: Пересчет пользовательских функций при нажатии F9
Добавлено: 23 сен 2008, 20:40
Aent
a.p.,постановка специфическая ... IMHO надо при модификации вашего объекта менять
какую то ячейку в EXCEL а в функции добавить значение этой ячейки аргументом. Или включить её значение в выражение, использующее вашу UDF
Re: Пересчет пользовательских функций при нажатии F9
Добавлено: 23 сен 2008, 23:36
a.p.
Aent, совершенно правильное предложение. Опять моя ошибка, что не объяснил и этот момент. Действительно можно сделать аргумент trigger, который будет ссылаться на ячейку, изменяющуюся при модификации объекта (более того, такая возможность существует). Однако данный вариант тоже не устраивает - аналогичных функций достаточно много на рабочей книги, как и объектов, к которым они обращаются, т.ч пользователю просто не удобно дополнительно каждый раз еще и ссылаться на какие-то ячейки. Именно поэтому возникла идея создания промежуточных VBA-функций, т.к была надежда, что их пересчет можно вызвать
Re: Пересчет пользовательских функций при нажатии F9
Добавлено: 24 сен 2008, 14:42
Aent
a.p.,определите в EXCEL имя ИМЯ_ОБЪЕКТА вида =СЦЕПИТЬ("ИМЯ_ОБЪЕКТА";ТДАТА())
и обращайтесь к вашей функции с этим ИМЕНЕМ в качестве аргумента
=YourUDF(ИМЯ_ОБЪЕКТА)
Единственно что нужно будет проинструктировать пользователя что бы он не указывал при вызове кавычек вокруг имени объекта
И всё по F9 будет пересчитываться...
Более того, если вы всё таки будете изменять при изменении вашего объекта Worksheet, то перехватывая Worksheet_Change для нужной ячейки и выдавая
Worsheet(...).Calculate,
вы полностью автоматизируете процесс
Re: Пересчет пользовательских функций при нажатии F9
Добавлено: 29 сен 2008, 13:56
Vlanib
...Как известно, UDF пересчитывается только при изменении какого-нибудь входного параметра. А как организовать пересчет UDF при каждом нажатии F9 или Ctrl+F9 (даже если параметры остались прежними)?...
Конечно не буду оригинален, но cntr+shift+alt+F9 - безусловный пересчет листа, независимо от изменения аргументов. Т.е. ивент Worksheet_Calculate вызывается по любому!