Вызов макроса с вычисляемым именем

Типы данных.

Набор встроенных типов данных обычный: Integer, Long, String, Byte и т.д.

Программист может создавать свои типы данных. Если тип данных состоит только из набора свойств, то следует воспользоваться описателем структур – Type. Пользовательские типы (структуры) можно задавать только на уровне модуля, то есть в общей области модуля (не внутри процедур, не внутри обработчиков событий!). Очевидно, что при описании пользовательского типа память под переменные не выделяется. Для того чтобы создать переменную пользовательского типа следует ее описать с помощью описателя dim в процедуре или с помощью описателя public или private в общей области.

Пример:

Type rabotnic

ID As Integer

Name As String * 20

Address As String * 30

Phone As Long

HireDate As Date

End Type

 

Sub CreateRecord()

Dim r As rabotnic

r.ID = 12003

End Sub

Программист может описывать и объектные типы, то есть классы. Об этом – далее.

Для того чтобы вызвать макрос по известному имени, находящийся в одном из модулей проекта достаточно указать имя модуля, а затем (после точки, т.к. модуль тоже считается объектом, а макросы – его методами) имя макроса. Из программы на VBA можно вызвать макрос и по заранее не известному имени (имя вычисляется). Для этого используйте команду RUN выражение, где выражение – строковое выражение, возвращающее имя макроса.

Рассмотрим пример. Задача состоит в том, чтобы сформировать запрос следующего вида: «фигура Х-координата1, Y-координата1, … , Размер1, …». Пусть на форме объект ListBox1 содержит названия геометрических фигур. Для выбранной фигуры необходимо ввести от пользователя ее координаты и параметры, характеризующие размер. Но для разных фигур это – совершенно разные наборы параметров. Можно поступить следующим образом: для каждой фигуры создать макрос с именем фигуры. Содержимое макроса – вызов формы с вводом всего необходимого. Тогда при инициализации формы можно некоторым образом составить список фигур:

Private Sub UserForm_Initialize()

ListBox1.AddItem "круг"

ListBox1.AddItem "прямоугольник"

End Sub

Подготовить формы для ввода данных: UF_circle для параметров круга и UF_rectangle для параметров прямоугольника.

В модуле1 приготовить процедуры вызова нужных форм ввода:

Public Sub круг()

UF_circle.Show

End Sub

 

Public Sub квадрат()

UF_rectangle.Show

End Sub

И устроить вызов этих макросов по щелчку пользователя на элемент списка с именами фигур:

Private Sub ListBox1_Click()

Application.Run "Module1." & ListBox1.List(ListBox1.ListIndex)

End Sub

Вызываемому макросу можно передать до 30 параметров (через запятую).

Вызвать макрос из другого документа невозможно. Вызов методов объекта при помощи Run невозможен.