Использование класса (объекта) за пределами проекта VBA, в котором он объявлен

Введение

Одним из преимуществ использования объектно-ориентированного программирования (OOP) является повторное использование кода. Типичный способ сделать это — создать экземпляр объекта уже определенного класса с помощью синтаксиса Set variable = New ClassName . Программисты VBA используют такие объекты каждый раз, когда они используют любой объект на платформе приложения. Примеры включают объект Workbook в Excel, объект Presentation в PowerPoint или объект Document в Word. Кроме того, программисты VBA используют пользовательские формы, которые являются объектами, принадлежащими к определенному типу класса. Все эти объекты определяются в библиотеках, которые находятся за пределами проекта разработчика VBA. Щелкните "Сервис" | Ссылки... пункт меню для просмотра списка внешних библиотек, которые редактор Visual Basic (VBE) автоматически устанавливает от имени разработчика.

В этом совете мы рассмотрим, как получить доступ к пользовательскому классу во внешней библиотеке, созданной нами. Хотя приведенный ниже пример основан на Excel 2003, советы применяются к другим продуктам MS Office, поддерживающих VBA и применимых к версиям 2000 или более поздних версий.

Это совет промежуточного или расширенного уровня, который предполагает определенный уровень удобства при программировании на VB(A).

Прежде чем один проект VBA сможет получить доступ к объекту, объявленного в модуле класса другого проекта VBA, необходимо выполнить два отдельных шага настройки. Первый набор делает модуль класса применимым за пределами проекта, в котором он объявлен, и предоставляет средства, с помощью которых можно создать экземпляр объекта. Во втором наборе рассматривается использование этого класса клиентским проектом.

Настройка проекта, содержащего определение класса

По умолчанию для модуля класса свойство Instancing имеет значение Private. Это означает, что только проект, содержащий определение класса, может создать экземпляр объекта этого класса. Единственным вариантом, который поддерживает VBA, является общедоступный, а не создаваемый. Это означает, что внешний проект может использовать объект этого класса, но не может создать его экземпляр. Может показаться странным, но это так. Чтобы изменить свойство со значения по умолчанию, выберите модуль класса в обозревателе проектов VBE, выберите нужный модуль класса, откройте окно свойств (при необходимости используйте клавишу F4, чтобы сделать его видимым) и измените свойство Instancing на 2-PublicNotCreatable.

Чтобы следовать примеру в этом совете, создайте модуль класса, приведите имя clsEmployee, измените его свойство Instancing и добавьте в него следующий код.

Option Explicit
Dim sName As String
Property Get Name() As String
    Name = sName
    End Property
Property Let Name(uName As String)
    sName = uName
    End Property

Далее, так как свойство Instancing класса PublicNotCreatable, проект должен предоставить клиенту способ создания экземпляра объекта. Добавьте новую функцию в стандартный модуль:

Option Explicit
Public Function New_clsEmployee() As clsEmployee
    Set New_clsEmployee = New clsEmployee
    End Function

где clsEmployee — это имя интересующих классов. Кроме того, это не должен быть закрытый модуль.

Последнее изменение немного упростит жизнь. Переименуйте проект из VBAProject по умолчанию в ClassProvider. Для этого выберите проект в обозревателе проектов VBE, а затем выберите "| Свойства VBAProject... | Вкладка "Общие" | и в поле "Имя проекта " введите ClassProvider.

Сохраните этот файл, например, как класс Provider.xls.

Затем перейдите к проекту клиента.

Настройка проекта, который будет использовать экспортированный класс

Клиентский проект использует класс так же, как и класс, определенный в любой другой внешней библиотеке (например, в пользовательской формате) с одним ключевым отличием. Так как он не может создать экземпляр объекта этого класса, он должен использовать функцию New_clsEmployee(), объявленную выше. Как и в любой другой внешней библиотеке, решите, следует ли использовать раннюю привязку или позднее связывание. В приведенном ниже коде показаны оба кода. Помните, что для использования кода ранней привязки клиентский проект должен содержать ссылку (инструменты | Ссылки...) в файл Provider.xls класса.

Option Explicit
Sub UseExportedClass_EarlyBinding()
    Dim anEmployee As ClassProvider.clsEmployee
    Set anEmployee = ClassProvider.New_clsEmployee
    anEmployee.Name = "Tushar Mehta"
    MsgBox anEmployee.Name
    End Sub
Sub UseExportedClass_LateBinding()
    Dim anEmployee As Object
    Set anEmployee = Application.Run("'g:\temp\class provider.xls'!new_clsEmployee")
    anEmployee.Name = "Tushar Mehta"
    MsgBox anEmployee.Name
    End Sub

Итоговая заметка

Внешняя библиотека не обязательно должна быть обычно сохраненным файлом. Он может быть в надстройке для конкретного приложения (например, файл, сохраненный с суффиксом XLA или PPA). Просто помните, что такая надстройка открывается не через обычный файл | Открыть... Метод , но загруженный с помощью | Надстройки... Команды.