В дополнение к этому ответу , который является пуленепробиваемым решением для решения такого рода проблем, но который довольно сложен в реализации, вы также можете написать некоторый код, который будет выполняться, когда ваше приложение VBA запускается, проверяя коллекцию 'links' объекта 'application'. Затем вы можете проверить (1), доступны ли запрошенные файлы (dll, ocx, tlb) на компьютере, и (2), если ссылка может быть создана (application.references.addFromFile ...).
Будьте осторожны: объявления объектов, которые могут быть «зависимыми от ссылок», такие как:
Dim cat as ADOX.catalog
вызовет ошибку компиляции, если ссылка не активна, когда соответствующий модуль «скомпилирован». Затем я советую вам изолировать вашу «процедуру проверки ссылок» в модуле запуска (эквивалентном «autoexec»), который работает только с VBA и базовыми объектами приложения. Проверьте это с помощью файлов справки (пример: в Access по умолчанию ссылки, которые можно использовать без внешних ссылок, это VBA, Access и DAO).
EDIT:
в случае, если внешние ссылки зависят от другого программного пакета и (1) не могут распространяться вместе с файлом MSI или (2) могут иметь несколько версий, я думаю, что «reference.addFromFile» - единственное решение, которое может применяться Пример:
- У вас есть клиент времени выполнения VBA / Access
приложение, которое должно ссылаться на Word
(файл msword.olb).
- По вопросам лицензирования вы не можете свободно распространять этот файл вместе с пакетом msi
- файл olb может быть либо 'XP-версией, либо более новой *
Наше решение состоит в том, чтобы иметь 2 таблицы в файле клиентского доступа. Один перечисляет все ссылки, которые должны быть проверены или добавлены во время запуска (Word будет одним из них), а другой перечисляет все возможные местоположения файла (в зависимости от того, есть ли у пользователя версия office11 или более новая). один), с отношениями один ко многим между двумя таблицами.
Итак, лучшей стратегией может быть сочетание MSI-пакетов и управления через код:
- msi отлично подходит для распространения независимых DLL или других файлов, которые полностью «встроены» в ваше приложение, таких как элементы управления ActiveX (например, элементы управления сканерами, средства просмотра отчетов или просмотра файлов и т. Д.)
- - лучшее решение, когда вашему приложению придется взаимодействовать с другими приложениями (word, excel, outlook и т. Д.), Которые могут существовать в разных версиях на компьютерах вашего пользователя.