Excel. Трюки и эффекты | страница 42



Class1:

Sub TestClass()

' Создание объекта

Dim obj As New Class1

' Установка свойств

Set obj.ObjectRef = New Collection

obj.strTag = "В этом объекте хранится ссылка на объект

Collection"

' Вызов метода

obj.ShowInfo

End Sub

В результате работы данной процедуры на экран будет выведено окно сообщения, показанное на рис. 1.4.

Рис. 1.4. Окно с информацией о свойствах объекта


Как можно заметить, в процедуре TestClass не происходит явного уничтожения ссылки на объект класса Class1. Дело в том, что ссылка obj – локальная переменная процедуры. А при выходе из процедуры данные всех локальных (не статических) переменных уничтожаются, в том числе удаляются и локальные ссылки на объекты.

Использование API-функций в VBA

Иногда даже при программировании на таком языке, как VBA, возникает необходимость использовать API-функции Windows. Эти стандартные функции действительно предоставляют программисту поистине огромные возможности – от управления отображением окон и кнопок до организации сетевого взаимодействия. Всего Windows API (Application Programming Interface) насчитывает около 1000 различных функций.

Объявление API-функций

Чтобы API-функцию можно было вызывать из программы на VBA, ее нужно объявить с использованием инструкции Declare:

[Public | Private] Declare Function Имя Lib «Библиотека» _

[Alias «Псевдоним»] [([Аргументы])] [As Имя_типа]

или, если API-функция не возвращает значения:

[Public | Private] Declare Sub Имя Lib «Библиотека» [Alias «Псевдоним»] _

[([Аргументы])]

Данная инструкция помещается в блоке объявлений модуля. Ключевые слова Public и Private задают область видимости объявляемой API-функции аналогично обычной процедуре или функции. Единственной особенностью является то, что при объявлении API-функции в модуле класса нужно использовать Private. Назначение остальных элементов инструкции Declare поясняется в табл. 1.14.

Таблица 1.14. Элементы инструкции Declare

Ниже приведен пример объявления API-функции получения имени текущего пользователя без использования псевдонима:

Declare Function GetUserNameA Lib «advapi32.dll» _

(ByVal lpBuffer As String, nSize As Long) As Long

а также с использованием псевдонима:

Declare Function GetUserName Lib «advapi32.dll» Alias

«GetUserNameA» _

(ByVal lpBuffer As String, nSize As Long) As Long

При использовании первой из приведенных инструкций для вызова функции нужно использовать имя GetUserNameA. При использовании второй – имя GetUserName.

Вызов API-функций