Если вы не добавляете ссылку на библиотеку типов, вы не можете использовать ранние типы, определенные в этой библиотеке типов.
Dim wkbkXLBook As Excel.Workbook
Dim wkSheet As Excel.worksheet
Excel
является программным именем библиотеки типов Excel, а Workbook
является именем класса, определенного в этой библиотеке.То же самое для Worksheet
.Поскольку на Excel нет ссылок, VBA не может разрешить эти типы, и вы получаете ошибку компиляции.
Вам необходимо работать с кодом с поздней привязкой, т. Е. В темноте, без IntelliSense , автозаполнение или быстрая информация о параметрах и без каких-либо опечаток - иначе вы столкнетесь с ошибками 438 и 1004 во время выполнения.
«Позднее» означает «разрешено во время выполнения».Всякий раз, когда вы объявляете что-то As Object
, именно это и происходит:
Dim wkbkXLBook As Object
Dim wkSheet As Object
Вы не можете использовать любой из типов Excel, если не ссылаетесь на библиотеку типов Excel.Это включает в себя также любую xl*
константу.
Dim Excel As Object
Я настоятельно рекомендую переименовать ее, например, в xlApp
.
Следите за неявными ссылками на объекты:
Dim someRange As Object
Set someRange = xlApp.ActiveWorkbook.Worksheets("Sheet1").Range("A1")
Вышеописанное будет работать, но также будет пропускать объект ActiveWorkbook
, его коллекцию Worksheets
и извлеченный объект Worksheet
;эти просочившиеся объекты могут (и часто do ) препятствуют корректному завершению процесса EXCEL.EXE
, даже после выполнения xlApp.Quit
и Set xlApp = Nothing
: избегайте двойных точек, ссылающихся на подобные объекты.Сделайте это вместо этого:
Dim books As Object
Set books = xlApp.Workbooks
Dim wb As Object
Set wb = books("workbook name")
Dim wbSheets As Object
Set wbSheets = wb.Worksheets
Dim ws As Object
Set ws = wbSheets("sheet name")
Dim rng As Object
Set rng = ws.Range("A1")
С каждым объектом, включенным в явную область действия локальной процедуры, все должно быть в порядке.