Я новичок в VBA и создаю небольшое макрос-приложение для Office. У нас около 80 пользователей на практически идентичных настройках ПК, и доступ к нему будут иметь все, кроме нескольких пользователей.
Я экспериментировал с некоторой автоматизацией доступа к веб-страницам с помощью ссылок на веб-службы, а также загрузил в проект ссылки Microsoft Scripting Runtime. Я попытался запустить его на тестовом ПК, и он пожаловался на отсутствие ссылок.
Я не особо хочу обходить 80 ПК и вручную загружать ссылки.
Мой вопрос, в основном, заключается в том, как мне управлять распространением этого макрос-приложения среди 80 нечетных пользователей, чтобы гарантировать, что ссылки будут загружаться каждый раз для каждого пользователя.
Спасибо!





Вместо того, чтобы раскрывать функциональность в документах, сделайте его надстройкой для Office (пакет или отдельные приложения на ваш выбор). Таким образом, вам не придется иметь дело со ссылками.
Затем просто распространите установочный пакет с надстройкой, который регистрирует компоненты и регистрирует надстройки с соответствующими приложениями Office.
VB6 может быть здесь хорошей идеей, учитывая его сходство с VBA.
Если у вас есть ссылки, от которых зависит ваше приложение и которые, как вы знаете, не будут на целевых компьютерах, я настоятельно рекомендую вам изучить некоторые технологии установщика.
Используя установщик, вы сможете установить свой макрос, а также установить и зарегистрировать все соответствующие ссылки / библиотеки.
Как правило, в Windows есть два варианта: технология на основе установщика Windows и технология на основе сценария.
Мы используем InstallShield для всего нашего развертывания, хотя есть несколько вариантов, которые вы можете использовать (есть несколько обсуждений по переполнению стека).
Используя технологию установщика Windows, вы можете создавать установочные файлы MSI, которые затем можно автоматически развернуть с помощью групповой политики.
Технология установщика не позволяет управлять ссылками на «внешнее программное обеспечение», такими как ссылки на библиотеки объектов Office, Excel или Outlook. Другая проблема будет тогда, когда разные машины будут использовать разные версии Excel ... Я добавил несколько слов об этих конкретных проблемах в своем ответе.
В дополнение к этот ответ, которое является пуленепробиваемым решением для решения этой проблемы, но которое довольно сложно реализовать, вы также можете написать некоторый код, который будет выполняться при запуске вашего приложения VBA, проверяя коллекцию ссылок объект "приложение". Затем вы можете проверить (1) наличие запрошенных файлов (dll, ocx, tlb) на компьютере и (2) возможность создания ссылки (application.references.addFromFile ...).
Будьте осторожны: объявления объектов, которые могут быть «зависимыми от ссылки», например:
Dim cat as ADOX.catalog
вызовет ошибку компиляции, если ссылка неактивна, когда соответствующий модуль «скомпилирован». Затем я советую вам изолировать вашу «процедуру проверки ссылок» в стартовом модуле (эквивалентном «autoexec»), который имеет дело только с VBA и базовыми объектами приложения. Проверьте это с помощью файлов справки (пример: в Access ссылки по умолчанию, которые можно использовать без внешних ссылок, - это VBA, Access и DAO).
Обновлено:
в случае, если внешние ссылки зависят от другого программного пакета и (1) не могут распространяться с файлом MSI или (2) могут иметь несколько версий, я думаю, что «links.addFromFile» - единственное решение, которое может применяться. Пример:
Наше решение состоит в том, чтобы иметь 2 таблицы в файле клиентского доступа. В одном перечислены все ссылки, которые необходимо проверить или добавить во время запуска (Word будет одним из них), а в другом перечислены все возможные местоположения файла (в зависимости от того, установлена ли у пользователя версия office11 или более новая. one), с отношениями "один ко многим" между двумя таблицами.
Итак, лучшей стратегией может быть сочетание пакетов msi и управления через код:
По большей части позднее связывание решит проблемы со ссылками в VBA, если у вас нет необычных ссылок. Большинство проблем вызвано различиями в версиях библиотек, которые можно решить с помощью позднего связывания. С VBA часто рекомендуется разрабатывать с ранним связыванием, но выпускать с поздним связыванием. Основным недостатком позднего связывания является изменение встроенных констант на значения (скорость больше не является проблемой, которой она была раньше).
Так:
Dim fs As Object 'Instead of FileSystemObject '
Dim xl As Object 'Instead of Excel.Application '
Set fs=CreateObject("Scripting.FileSystemObject")
Set xl=CreateObject("Excel.Application")
'Value instead of built-in constant '
ForReading=2
Set f = fs.OpenTextFile("c:\testfile.txt", ForReading)
Если ваши ссылки связаны с другим программным обеспечением, которое может существовать в разных версиях (например, Excel 2003 или Excel 2007), решение установщика не даст ожидаемых результатов.