Для начала рассмотрим, как можно получить доступ к функциям и про-
цедурам из стандартной динамической библиотеки и какие ограничения
накладываются на них и на их аргументы и возвращаемые значения. В та-
ких функциях можно использовать не все типы переменных — только неко-
торые типы данных в Excel и Delphi имеют общую структуру. Подходят сле-
дующие типы данных: String — строка длиной до нескольких гигабайт,
ограниченная символом CHR(O); Longint (Integer) — целое число от
-2 147 483 648 до 2 147 483 647; Byte — целое число от 0 до 255; Boolean -
логическая переменная (True / False); Variant — тип данных, к которому
относятся все переменные, не описанные явно. Чтобы подробней ознако-
миться с данным вопросом и получить список всех возможных типов дан-
ных, используйте справку по Excel, раздел "Справочник по Visual Basic".
Определив, какими типами данных будем оперировать, попробуем описать
и вызвать какую-либо функцию или процедуру из стандартной библиотеки
Windows. В качестве примера можем поработать с функцией Messagebox из
стандартной динамической библиотеки. Функция Messagebox использует в
качестве входных и возвращаемых значений типы PChar и Integer. В макро-
се Excel тип PChar можно заменить типом String. Прежде чем обращаться
к внешней процедуре, опишем ее.
Описание внешних процедур и функций, используемых в макросах, имеет
следующий синтаксис.
Описание процедуры
Declare Sub "имя процедуры" Lib "имя библиотеки" [alias "псевданим"]
[{[ "список аргументов "]}]
Описание функции
Declare Function "имя функции" Lib "имя библиотеки" [Alias "псевдоним"]
[(["список аргументов"])] [As "тип"]
Ключевые слова: Sub — указывает, что процедура не возвращает значение;
Function — указывает, что процедура возвращает значение, которое может
быть использовано в выражении; Lib — указывает, что описываемая про-
цедура содержится в динамической библиотеке, "имя библиотеки"— имя
динамической библиотеки; Alias — указывает, что вызываемая процедура
имеет другое имя в библиотеке, "псевдоним"— имя процедуры в библиотеке;
"список аргументов"— список переменных, представляющий аргументы,
которые передаются в процедуру при ее вызове; "тип" — тип данных значе-
ния, возвращаемого процедурой типа Function.
В нашем примере из рабочей книги Excel вызовем функцию Messagebox.
Ссылку на эту функцию можно найти в файле WINDOWS.PAS, входящем в
состав Delphi. Используем полученную информацию. Из описания, пред-
ставленного в файле WINDOWS.PAS, видно, что эта функция входит в со-
став библиотеки USER32.DLL.
Описание ссылки на функцию Messagebox
Interface
function MessageBoxA(hWnd:HWND;lpText,lpCaption:PAnsiChar;
uType:UINT):Integer; stdcall;
implementation
function MessageBoxA; external user32 name 'MessageBoxA';
В макросе в объявлении функции мы напишем строку, определяемую сле-
дующим синтаксисом.
Описание функции Messagebox в макросе Excel
Declare Function MessageBoxA Lib "user32.dll" (ByVal hwnd As Integer,
ByVal lpText As String, ByVal lpCaption As String,
ByVal uType As Integer) As Integer
Представленное описание указывает на то, что мы используем функцию,
возвращающую целое значение. Функция импортируется из библиотеки
USER32.DLL. Имена функции в библиотеке и в макросе совпадают, но для
макроса можно было бы задать и другое имя. Аргументы импортируемой
функции не возвращают значения, а только передают. Для аргументов, воз-
вращающих значения, необходимо опустить зарезервированное слово ByVal.
В теле макроса напишем следующую процедуру для вызова функции
MessageBox динамической библиотеки user32.dll.
Вызов функции Messagebox из макроса
Public Sub Message()
Call MessageBoxA(0, "Тип объекта = " + TypeName(Selection),
"Вызов функции MessageBox из библиотеки user32.dll", 0)
Call MessageBoxA(0, "Значение ячейки = " + Range("Al").Text,
"Вызов функции MessageBox из библиотеки user32.dll", 0)
End Sub
Данная процедура дважды вызывает функцию MessageBox. Первый вызов
процедуры отображает значение типа выделенного объекта. Второй вызов
выводит в диалоговом окне значение, записанное в ячейке А1. Выполним
этот макрос и получим результат в виде диалогового окна (рис. 18.1).
Рис. 18.1. Открытие диалогового окна из макроса Excel |