Запуск макроса из надстройки XLA
Модератор: Naeel Maqsudov
- EducatedFool
- Сообщения: 197
- Зарегистрирован: 06 апр 2008, 14:03
- Откуда: Россия, Урал
- Контактная информация:
Сделал надстройку (.xla) со всякими функциями в excel-е, подключил её... Из ячеек рабочих книг функции доступны, но нужно не это... Никак не удаётся из VBA (из модулей других книг) использовать эти функции. Конечно, установка в нужные книги ссылок на этот XLA помогает (функции работают), но оставлять такие ссылки мне в книгах нельзя (у многих юзеров, кому не нужны доп. функции, не будет установлена эта надстройка, и при наличии в книге ссылки на отсутствующий XLA Excel начнёт ругаться). Хотелось бы как в Word - пишешь функции в Normal.dot, и они доступны любому проекту VBA... Проблема в том, что доп. функции аддина обрабатывают в книгах события типа DoubleClick, и вызываться они должны именно из другого проекта VBA... а не с панели инструментов...
Как сделать так, чтобы при отсутствии аддина Excel не ругался, а при его наличии обработчик событий книги мог обращаться к его функциям?
Как сделать так, чтобы при отсутствии аддина Excel не ругался, а при его наличии обработчик событий книги мог обращаться к его функциям?
- VictorM
- Сообщения: 794
- Зарегистрирован: 23 окт 2006, 01:44
- Откуда: Lugansk, Ukraine
- Контактная информация:
EducatedFool,
для этого в Excel есть личная книга макросов personal.xlsХотелось бы как в Word - пишешь функции в Normal.dot, и они доступны любому проекту VBA.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
научите их ловить рыбу - и вы накормите их на всю жизнь".
- EducatedFool
- Сообщения: 197
- Зарегистрирован: 06 апр 2008, 14:03
- Откуда: Россия, Урал
- Контактная информация:
личная книга макросов personal.xls - это, конечно, хорошо...
Кажется, несколько лет назад я ей для этих целей и пользовался... и всё работало.
Вот только тогда у меня были Win98 и OfficeXP.
Сейчас же на Office 2003 почему-то не работает...
К примеру, в модуле книги personal.xls пишу: Function fu(): fu = 88: End Function
Из другой открытой книги запускаю Msgbox fu, а в ответ - пустота
Кажется, несколько лет назад я ей для этих целей и пользовался... и всё работало.
Вот только тогда у меня были 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 - действительно пустота.
Открыл рабочую книгу>ячейка A1>Вставка>Функцию>Определенные пользователем.
В окне вижу функцию =PERSONAL.XLS!fu() >ОК и в ячейке А1 - значение 88.
А вот Msgbox fu - действительно пустота.
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
научите их ловить рыбу - и вы накормите их на всю жизнь".
-
- Сообщения: 526
- Зарегистрирован: 04 фев 2007, 18:37
- Откуда: Сургут
- Контактная информация:
Здравствуйте EducatedFool.
Ругаться Excel при неверных ссылках обязан.
Я выхожу из положения тиражированием надстроек содержащих необходимые дополнения.
В пределах одной сети это делается очень просто.
Евгений.
Ругаться Excel при неверных ссылках обязан.
Я выхожу из положения тиражированием надстроек содержащих необходимые дополнения.
В пределах одной сети это делается очень просто.
Евгений.
- EducatedFool
- Сообщения: 197
- Зарегистрирован: 06 апр 2008, 14:03
- Откуда: Россия, Урал
- Контактная информация:
Тиражировать надстройки, конечно, можно, но проблема в том, что файлы с данными должны открывать на ЛЮБОМ компьютере... Надстройка нужна лишь немногим, а доступ к данным рабочих книг нужен всем, да и с любого компа.
Ладно бы Excel просто ругался на отсутствующую Reference, но в этих файлах находятся макросы, и при открытии файла excel тут же выпадает в режим отладки (из-за отсутствующей Reference)... А юзерам сложно объяснить, почему вместо данных они видят отладчик VBA
Где-то в архивах форума видел, что предлагалось использовать Application.Run для использования функций из надстроек без установки Reference на эти надстройки... Но ничего о том, как это использовать, не нашел...
Уже приходят в голову дурацкие идеи прописывать всю функциональность в одном модуле, и после каждого обновления этого модуля вклеивать его в каждую из рабочих книг, заменяя старую версию...
Ладно бы 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
Далеко не лучший вариант, но что поделать... Может, кто предложит другие идеи?
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
Далеко не лучший вариант, но что поделать... Может, кто предложит другие идеи?
-
- Сообщения: 526
- Зарегистрирован: 04 фев 2007, 18:37
- Откуда: Сургут
- Контактная информация:
Если обязательно использование специальных функций в при расчете, совершенно не обязательно сохранять эти самые функции в документе.
Надстройку тиражировать нельзя, но иожно в её коде создать процедуру, которая будет пересчитывать функцию и сохранять не листе только значения, оставляя документ "чистым" (без VBA).
Такой способ я уже использовал, удобно тем, что устанавливать AddIns или Personal приходится только у пользователей успользующих специальнуй функцию в своих расчетах.
Евгений.
Надстройку тиражировать нельзя, но иожно в её коде создать процедуру, которая будет пересчитывать функцию и сохранять не листе только значения, оставляя документ "чистым" (без VBA).
Такой способ я уже использовал, удобно тем, что устанавливать AddIns или Personal приходится только у пользователей успользующих специальнуй функцию в своих расчетах.
Евгений.