Есть несколько концепций, с которыми вам нужно разобраться в первую очередь.
Библиотечные ссылки и область применения
Ваш оригинальный код был написан в Excel. Поэтому в этом проекте VBA на него ссылается объект Excel. В вашем проекте Access VBA на него нет ссылок. Вы можете сравнить это, посмотрев на Tools
-> References
.
. Это подводит нас к понятию «раннее связывание» и «позднее связывание». Когда вы набираете что-то вроде Range.
, вы получаете IntelliSense VBA, чтобы сообщить вам, что вы можете сделать с Range
или чем-то еще. Но в Access у вас нет библиотеки объектов Excel, на которую есть ссылки по умолчанию. Следовательно, Range.
не даст intellisense и , вы не можете запустить код, потому что Access не имеет Range
в своей объектной модели, и ваш проект VBA, скорее всего, не имеет ссылки, которая имеет его .
Следовательно, ваш код должен быть настроен для запуска с поздним связыванием, если вы не хотите добавлять ссылку на объектную модель Excel, и вы, скорее всего, хотите этого в любом случае.
Неполная ссылка
Ваш исходный код Excel содержит неквалифицированные ссылки на различные глобальные объекты, доступные в объектной модели Excel.
Application.DisplayAlerts = False
...
Sheets("DATA").Delete
...
Set wb = Workbooks.Open(Ret)
...
Они не обязательно будут работать согласованно в проектах VBA, размещенных на других хостах, кроме Excel и наверняка не будет работать в позднем коде. Кроме того, если вы решите добавить ссылку на объектную модель Excel, у вас все равно останется утечка экземпляра Excel, что может привести к появлению призрачных экземпляров, поскольку неквалифицированные ссылки на глобальные объекты неявно создадут экземпляр Excel, с которым вы не сможете взаимодействовать и который также может вызвать другая ошибка времени выполнения по пути. Чтобы сделать ваш код более привязываемым позднее, вам нужно что-то вроде:
Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.DisplayAlerts = False
...
Set MyBook = ExcelApp.Workbooks("Whatever")
MyBook.Sheets("DATA").Delete
...
Set wb = ExcelApp.Workbooks.Open(Ret)
...
Обратите внимание, что все глобальные объекты, к которым вы могли получить доступ в контексте, размещенном в Excel, теперь должны быть самостоятельными переменными. Кроме того, у вас не будет доступа к ThisWorkbook
или даже Sheet1
в других проектах VBA, поскольку Excel больше не является хостом. Вы должны соответственно отрегулировать.
Переключение между ранним и поздним связыванием
Код с ранним связыванием упрощает разработку, поскольку вы получаете полноценный браузер intelisense и объектов, помогающий вам написать код. Однако при обращении к другим объектным моделям вы можете распространять свой код VBA с использованием позднего связывания, чтобы избежать проблем с версиями и неработающих ссылок. Но вы можете получить лучшее из обоих миров:
#Const EarlyBind = 1
#If EarlyBind Then
Dim ExcelApp As Excel.Application
#Else
Dim ExcelApp As Object
#End If
Set ExcelApp = CreateObject("Excel.Application")
Это иллюстрирует использование аргумента условной компиляции , чтобы позволить вам иметь ExcelApp
переменную, которая может быть либо Excel.Application
(иначе ранний предел) против Object
(он же поздний предел). Для изменения просто измените строку Const LateBind
между 0
или 1
.