Модуль представляет собой текстовый ASCII-файл с программным кодом, содержащим подпрограммы, переменные и константы. Проект может состоять из множества программных модулей. Для их создания необходимо выполнить команду Вставка Модуль. Рабочее окно модуля представлено на рис. 4.1.
Основу программ в VBA составляют процедуры и функции.
Процедура Sub– это обособленная совокупность операторов VBA, выполняющая определенные действия. В общем случае процедура принимает некоторые параметры (переменные, которые передаются процедуре в качестве исходных данных), выполняет программу и может возвращать результирующие значения, которые присваиваются параметрам внутри процедуры. Однако чаще используются процедуры без параметров. Например, процедуры, выполняющиеся при возникновении определенных событий. Вложенность процедур в другие процедуры не допускается. Структура процедуры следующая:
[ДОСТУП] Sub ИМЯ_ПРОЦЕДУРЫ ([СПИСОК_ПАРАМЕТРОВ])
ТЕЛО_ ПРОЦЕДУРЫ
End Sub
Ключевое слово ДОСТУП является необязательным и определяет область видимости процедуры. Public указывает, что процедура доступна для всех других процедур во всех модулях (глобальная). Private указывает, что процедура доступна для других процедур только того модуля, в котором она описана (локальная). СПИСОК_ПАРАМЕТРОВ также является необязательным элементом и позволяет передавать процедуре различные исходные данные при вызове, которые называются формальными параметрами. При этом ключевое слово Dim не указывается. ТЕЛО_ПРОЦЕДУРЫ состоит из описательной части и блока операторов, выполняющихся один за другим. Если необходимо прекратить выполнение процедуры в некотором конкретном месте, это можно сделать с помощью оператора Exit Sub. ИМЯ_ПРОЦЕДУРЫ – это любой идентификатор, определенный пользователем. Идентификатор – это последовательность букв, цифр и символа подчеркивания, начинающаяся с буквы (пробелы внутри идентификатора недопустимы). Имя процедуры всегда определяется на уровне модуля. Для использования процедуры в тексте программы (т.е. для её вызова), необходимо указать имя процедуры и список фактических параметров, которые должны по типу и порядку следования совпадать с формальными параметрами.
Функция Function во многом похожа на процедуру, но в отличие от неё при вызове всегда возвращает значение. Функция получает параметры, называемые аргументами, и выполняет с ними некоторые действия, результат которых возвращается функцией. Структура функции следующая:
[ДОСТУП] Function ИМЯ_ФУНКЦИИ(СПИСОК_АРГУМЕНТОВ) As ТИП
ТЕЛО_ ФУНКЦИИ
ИМЯ_ФУНКЦИИ = ВЫРАЖЕНИЕ
End Function
ТИП определяет тип данных возвращаемого результата. В теле функции обязательно должен присутствовать, по крайней мере, один оператор, присваивающий имени функции значение вычисляемого выражения. Досрочное завершение функции возможно с помощью оператора Exit Function. В программе вызов функции осуществляется с помощью оператора присваивания, в правой части которого указывается имя функции с перечнем фактических параметров, как и любой другой встроенной функции, например, Sqr, Cos или Chr.
Процедуры и функции, не описанные явно с помощью ключевых слов Public или Private, по умолчанию являются общими.
Для быстрого добавления в модуль подпрограмм удобно воспользоваться командой Вставка Процедура. В появившемся окне (рис. 4.2) нужно выбрать необходимые опции.
В MS Excel с функциями, созданными пользователем, можно работать с помощью Мастера функций точно так же, как и со встроенными функциями рабочего листа.
Пример. В MS Excel создать функцию пользователя, математически определенную следующим образом:
y = sin(x) ∙ e-5x
Создадим модуль, как указано выше (рис 4.2), и введем в него текст следующей программы:
Public Function Y(x As Single) As Single
Y = Sin(x) * Exp(- 5 * x )
End Function
Для использования созданной функции на рабочем листе MS Excel введем в ячейку А2 число 0.1. В ячейке В2 вычислим значение функции Y при x = 0.1. Для этого в ячейку В2 достаточно ввести формулу =Y(A2). Это можно сделать и с помощью Мастера функций, который будет содержать функцию Y наряду с другими встроенными функциями MS Excel (рис 4.3).
Общие принципы организации программ VBA в модуле следующие. Обычно текст программы начинается с опций, которые управляют описанием переменных, способом сравнения строк и т. д.
Затем следует объявление глобальных для данного модуля переменных и констант, т.е. таких, которые используются во всех процедурах модуля.
Далее располагают непосредственно текст функций и процедур, составляющих саму программу.
Разделителем операторов в одной строке при записи программы является символ “:”.
Для переноса оператора на другую строку используется символ “_” (знак подчеркивания).
Иногда внутри программы удобно помещать комментарии – пояснительный текст, который игнорируется компилятором и может быть записан в любом месте программы. Комментарии удобно также использовать при отладке программы для временного отключения операторов. Каждая строка комментариев начинается со знака апострофа.
Пример организации модуля:
Option Base 1
Option Explicit
‘ PI – глобальная константа
Const PI As Double = 3.14159
‘ x - глобальная переменная
Dim x As Double
‘ Функция Disc вычисляет площадь круга
Public Function Disc(R As Double) As Double
x = 2
Disc = PI * R ^ 2
End Function
‘ Функция Rec вычисляет площадь треугольника
Public Function Rec(a As Double, b As Double, c As Double ) As Double
‘ p – локальная переменная
Dim p As Double
p = ( a + b + c) / 2
Rec = Sqr ( p * ( p – a )* ( p – b ) * ( p – c))
End Function
‘ Процедура Result вызывает функции Disc и Rec и выводит результаты
Public Sub Result ( )
‘R_1, R_2, a, b, c - локальные переменные
Dim R_1 As Double
Dim R_2 As Double
Dim a As Double
Dim b As Double
Dim c As Double
R_1 = Disc( 2. 5 )
x = x + 2
MsgBox “ Площадь круга = “ & CStr( R_1) & “, x = “ & CStr (x)
a =1
b = 1
c = Sqr (2)
R_2 = Rec (a, b, c)
MsgBox “ Площадь треугольника = “ & CStr( R_2)
End Sub
Здесь инструкция Option Explicit указывает на необходимость описания типов переменных, используемых на данном листе модуля.
Инструкция Option Base 1 указывает, что индексация элементов массива будет начинаться с 1.
Функция Sqr вычисляет квадратный корень аргумента.
Функция CStr переводит числовой формат в строковый.