Запуск макроса из надстройки XLA

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

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

Ответить
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

Сделал надстройку (.xla) со всякими функциями в excel-е, подключил её... Из ячеек рабочих книг функции доступны, но нужно не это... Никак не удаётся из VBA (из модулей других книг) использовать эти функции. Конечно, установка в нужные книги ссылок на этот XLA помогает (функции работают), но оставлять такие ссылки мне в книгах нельзя (у многих юзеров, кому не нужны доп. функции, не будет установлена эта надстройка, и при наличии в книге ссылки на отсутствующий XLA Excel начнёт ругаться). Хотелось бы как в Word - пишешь функции в Normal.dot, и они доступны любому проекту VBA... Проблема в том, что доп. функции аддина обрабатывают в книгах события типа DoubleClick, и вызываться они должны именно из другого проекта VBA... а не с панели инструментов...
Как сделать так, чтобы при отсутствии аддина Excel не ругался, а при его наличии обработчик событий книги мог обращаться к его функциям?
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

EducatedFool,
Хотелось бы как в Word - пишешь функции в Normal.dot, и они доступны любому проекту VBA.
для этого в Excel есть личная книга макросов personal.xls
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

личная книга макросов personal.xls - это, конечно, хорошо...
Кажется, несколько лет назад я ей для этих целей и пользовался... и всё работало.
Вот только тогда у меня были Win98 и OfficeXP.
Сейчас же на Office 2003 почему-то не работает...
К примеру, в модуле книги personal.xls пишу: Function fu(): fu = 88: End Function
Из другой открытой книги запускаю Msgbox fu, а в ответ - пустота :(
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

У меня Office 2003. Записал Вашу функцию себе в personal.xls.
Открыл рабочую книгу>ячейка A1>Вставка>Функцию>Определенные пользователем.
В окне вижу функцию =PERSONAL.XLS!fu() >ОК и в ячейке А1 - значение 88.
А вот Msgbox fu - действительно пустота.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Teslenko_EA
Сообщения: 526
Зарегистрирован: 04 фев 2007, 18:37
Откуда: Сургут
Контактная информация:

Здравствуйте EducatedFool.
Ругаться Excel при неверных ссылках обязан.
Я выхожу из положения тиражированием надстроек содержащих необходимые дополнения.
В пределах одной сети это делается очень просто.
Евгений.
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

Тиражировать надстройки, конечно, можно, но проблема в том, что файлы с данными должны открывать на ЛЮБОМ компьютере... Надстройка нужна лишь немногим, а доступ к данным рабочих книг нужен всем, да и с любого компа.
Ладно бы Excel просто ругался на отсутствующую Reference, но в этих файлах находятся макросы, и при открытии файла excel тут же выпадает в режим отладки (из-за отсутствующей Reference)... А юзерам сложно объяснить, почему вместо данных они видят отладчик VBA :)
Где-то в архивах форума видел, что предлагалось использовать Application.Run для использования функций из надстроек без установки Reference на эти надстройки... Но ничего о том, как это использовать, не нашел...

Уже приходят в голову дурацкие идеи прописывать всю функциональность в одном модуле, и после каждого обновления этого модуля вклеивать его в каждую из рабочих книг, заменяя старую версию...
Аватара пользователя
EducatedFool
Сообщения: 197
Зарегистрирован: 06 апр 2008, 14:03
Откуда: Россия, Урал
Контактная информация:

Решил попробовать устанавливать ссылку на надстройку при открытии книги и убирать при закрытии.

Sub RemoveReference()
For Each ref In Application.VBE.ActiveVBProject.References
If ref.Name = "MyProject" Then Application.VBE.ActiveVBProject.References.Remove ref
Next
End Sub

Sub AddReference()
found = False
For Each ref In Application.VBE.ActiveVBProject.References
If ref.Name = "MyProject" Then found = True
Next
If Not found Then Application.VBE.ActiveVBProject.References.AddFromFile "c:\Program Files\000.xla"
End Sub

Далеко не лучший вариант, но что поделать... Может, кто предложит другие идеи?
Teslenko_EA
Сообщения: 526
Зарегистрирован: 04 фев 2007, 18:37
Откуда: Сургут
Контактная информация:

Если обязательно использование специальных функций в при расчете, совершенно не обязательно сохранять эти самые функции в документе.
Надстройку тиражировать нельзя, но иожно в её коде создать процедуру, которая будет пересчитывать функцию и сохранять не листе только значения, оставляя документ "чистым" (без VBA).
Такой способ я уже использовал, удобно тем, что устанавливать AddIns или Personal приходится только у пользователей успользующих специальнуй функцию в своих расчетах.
Евгений.
Ответить