2014-12-08 3 views
1

Я бы хотел сделать некоторый аудит программ VBA в Access 2010 и Excel 2010. Одна из основных проблем - ссылки библиотек, которые требуются для определенных программ. Есть ли способ программно определить, какие ссылки необходимы для конкретной программы?VBA для получения списка требуемых библиографических ссылок

Я сделал тест в Access. Я написал код, требующий ссылки на библиотеку Excel. Я убедился, что у меня нет ссылки и скомпилирован код. Я не получил никаких ошибок. Я надеюсь, что у меня появятся ошибки, и я смогу скомпилировать программно и сохранить связанную с этим ошибку, в которой упоминается отсутствие ссылки Excel.

Еще одна мысль, которую я должен был достичь, состоит в том, чтобы анализировать VBA в каждом модуле. Кажется, это была бы довольно большая задача.

+0

Я догадываюсь, что для доступа трудно узнать, в какой библиотеке это отсутствует, только из кода. –

+0

Можно запрограммировать ссылки в проекте с помощью VBA. – Rory

ответ

1

В вашей ситуации я удаляю ссылки по одному, компилируя после каждого удаления. Если это не работает для вас, есть несколько причин, почему:

Важно, чтобы в верхней части каждого модуля было всего Option Explicit, включая код за формами, отчетами, пользовательскими формами, листами и т. Д. Без Option Explicit многие неопределенные символы не будут пойманы во время компиляции.

Также важно объявить переменные объекта с фактическим типом объекта, а не как Variant или Object. Например, этот код компилируется нормально, но он не будет работать:

Dim RS 
    Set RS = CurrentDb.OpenRecordset("MyTable") 
    If RS.EndOfFile Then MsgBox "No data" 

Изменение Dim RS к Dim RS As Recordset затем вызывает несуществующий .EndOfFile свойство быть обнаружены во время компиляции.

2

«Есть ли способ программно определить, какие ссылки необходимы для конкретной программы?»

Нет. Доступ может вызывать ошибку компиляции, когда находит что-то, что он не понимает в коде VBA. Но он не может определить, доступно ли это что-либо в неопубликованном объекте или библиотеке типов.

Рассмотрим следующий пример:

Dim xlApp As Excel.Application 

Это утверждение не будет бросать ошибку компиляции, если ваш проект включает в себя ссылку на библиотеку объектов Microsoft Excel. Но, без ссылки, Access будет жаловаться «Определенный пользователем тип не определен», когда он встречает Excel.Application. Он не может указать вам «Включите ссылку на библиотеку объектов Excel, чтобы решить эту проблему».

То же самое происходит, когда ваш код содержит константу Excel с константой, такую ​​как xlEdgeTop. Все в порядке со ссылкой. Без ссылки Access не имеет понятия об этом имени.

Кстати, результат, о котором вы сообщали для своего теста, был возможен только потому, что ваш код не включал Option Explicit в свои объявления. Вы должны всегда включать Option Explicit во все ваши модули кода, чтобы Access мог предупредить вас, когда он ничего не узнает.

+0

Вот код, который я тестировал: – user2901516

+0

Вот код, который я тестировал: mySum = Excel.WorksheetFunction.Sum (100, 200) MsgBox mySum. Я также пробовал следующее: mySum = Excel.Application.WorksheetFunction.Sum (100, 200) Я не получил ошибок компиляции. – user2901516

+0

См. Ответ Тома относительно «Option Explicit». Ваш код будет жаловаться, если бы вы включили это объявление, но не ссылались на Excel. – HansUp

Смежные вопросы