Раннее и позднее связывание переменных с экземплярами внешних и внутренних объектов в VBA Excel. Преимущества ранней привязки объектов. Примеры кода.
Внутренними называются объекты, которые принадлежат объектной модели Excel (Range, Sheet, Workbook, Chart). Внешние объекты не принадлежат объектной модели Excel. А также новый экземпляр Excel.Application является внешним объектом по отношению к тому экземпляру приложения Excel, из которого он создается.
Раннее связывание
Определение типа объекта при ранней привязке выполняется еще до запуска приложения.
Объявление переменной определенного типа
Объявление переменной с определенным типом объекта:
1 2 3 4 5 6 7 8 |
'Внутренние объекты Dim myRange As Range Dim mySheet As Sheets Dim myWorkbook As Workbook 'Внешние объекты Dim myDictionary As Dictionary Dim myExcel As Excel.Application Dim myWord As Word.Application |
При объявлении переменной с определенным типом объекта ранняя привязка уже осуществилась, но чтобы начать работу с переменной, ей необходимо присвоить конкретный (для внутренних объектов) или новый (для внешних объектов) экземпляр объекта с помощью ключевого слова Set:
1 2 3 4 5 6 7 8 |
'Внутренние объекты Set myRange = Range("A1:D10") Set mySheet = Sheets(1) Set myWorkbook = Workbooks.Open("C:\Книга1.xlsm") 'Внешние объекты Set myDictionary = New Dictionary Set myExcel = New Excel.Application Set myWord = New Word.Application |
Присвоение переменной объекта при объявлении
Присвоение переменной, при ее объявлении, нового экземпляра внешнего объекта:
1 2 3 |
Dim myDictionary As New Dictionary Dim myExcel As New Excel.Application Dim myWord As New Word.Application |
Ссылка на библиотеку внешнего объекта
Чтобы использовать раннее связывание для внешнего объекта, необходимо подключить в редакторе VBA Excel ссылку на библиотеку этого объекта, если она еще не подключена. Подключается ссылка на библиотеку в окне «References VBAproject», перейти в которое можно через главное меню редактора: Tools–>References…
Ссылка на библиотеку Microsoft Scripting Runtime, которая необходима для ранней привязки объекта Dictionary:
Ссылка на библиотеку Microsoft Word Object Library, которая необходима для ранней привязки объекта Word.Application:
После выбора библиотеки следует нажать кнопку «OK».
Преимущества ранней привязки
Главное преимущество раннего связывания заключается в возможности использовать при написании кода VBA Excel лист выбора и вставки свойств-методов привязанных объектов (Auto List Members). Лист подсказок отображается автоматически или вызывается сочетанием клавиш «Ctrl+Пробел» или «Ctrl+J».
Кроме того, применение ранней привязки для создания объекта с помощью ссылки на библиотеку объектов обеспечивает более высокую производительность приложения.
В том, что раннее и позднее связывание работает не только с внешними, но и с внутренними объектами, вы можете убедиться на следующих примерах.
Скопируйте процедуру Primer1 с ранней привязкой объекта Sheet в любой программный модуль:
1 2 3 4 |
Sub Primer1() Dim mySheet As Sheet mySheet End Sub |
Поставьте точку после mySheet в 3 строке и вы увидите лист выбора и вставки свойств-методов:
Если вдруг лист подсказок не отобразился автоматически, его можно вызвать сочетанием клавиш «Ctrl+Пробел» или «Ctrl+J».
Теперь скопируйте процедуру Primer2 с поздней привязкой объекта Sheet в любой программный модуль:
1 2 3 4 5 |
Sub Primer2() Dim mySheet As Object Set mySheet = Sheets(1) mySheet End Sub |
Поставьте точку после mySheet в 4 строке – лист подсказок не отобразится:
Сочетания клавиш «Ctrl+Пробел» и «Ctrl+J» тоже не помогут. В данном случае тип объекта, присвоенного переменной, определяется только в процессе выполнения программы.
Позднее связывание
Тип объекта при поздней привязке определяется только в процессе выполнения программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
'Внутренние объекты 'Диапазон ячеек Dim myRange As Object Set myRange = Range("A1:D10") 'Рабочий лист Dim mySheet As Object Set mySheet = Sheets(1) 'Рабочая книга Excel Dim myWorkbook As Object Set myWorkbook = Workbooks.Open("C:\Книга1.xlsm") 'Внешние объекты 'Словарь Dim myDictionary As Object Set myDictionary = CreateObject("Scripting.Dictionary") 'Приложение Excel Dim myExcel As Object Set myExcel = CreateObject("Excel.Application") 'Приложение Word Dim myWord As Object Set myWord = CreateObject("Word.Application") |
Функция CreateObject используется для создания нового экземпляра объекта, а функция GetObject – для получения сохраненного объекта.
сижу и никак не могу понять,
почему у меня в коде
никак не вылезает окошечко,
как на картинке
после mySheet.
уже и кнопки нажимаю и библиотеки подключил,
и файл сохранил.
смотрю внимательно:
не Dim mySheet As Sheet
а Dim mySheet As Sheets
проверка революционной бдительности, однако)
—
не очень понял разницу:
раннее использует более конкретизированный объект и для него нужна подключённая библиотека
а позднее более универсальное; при этом присвоение значений внутренним объектам не отличается — так?
При ранней привязке уже при написании кода редактор VBA знает, ссылка на представителя какого класса объектов будет присвоена этой переменной. Информация о свойствах и методах этого класса объектов, в том числе отображаемая в подсказках, извлекается из заранее подключенной библиотеки. Код с ранним связыванием не будет работать, если на компьютере пользователя нет нужной библиотеки, или она есть, но ссылка на нее не подключена в редакторе VBA.
При поздней привязке выполняемая процедура самостоятельно подключается к нужной библиотеке во время компиляции строки с присвоением переменной, объявленной как Object, ссылки на существующий или новый экземпляр конкретного объекта. Код с поздним связыванием не будет работать только в том случае, если на компьютере пользователя нет нужной библиотеки.
Обсуждение закрыто.