Процедуры (Sub) и функции (Function) VBA, объявление процедур и функций, макросы - специальный тип процедур VBA, типы процедур
Процедуры — это самые важные функциональные блоки языка VBA. В VBA вы можете выполнить только программный код, который содержится в какой-либо процедуре (обычной в стандартном модуле, событийной для элемента управления на форме и т.п.). Иногда начинающие пользователи пытаются записать команды прямо в область объявлений стандартного модуля и не могут понять, почему они не выполняются (сообщений о ошибке при этом не выдается — просто этот код становится "невидим" для компилятора). Причина проста — в разделе объявлений модуля (когда в верхних списках показываются значения (General) и (Declarations) могут быть только объявления переменных уровня модуля и некоторые специальные инструкции для компилятора. Весь остальной программный код должен находится внутри процедур.
В VBA предусмотрены следующие типы процедур:
Процедура типа Sub (подпрограмма) — универсальная процедура для выполнения каких-либо действий:
Sub Farewell()
MsgBox “Goodbye”
End Sub
Макрос в VBA — это просто процедура типа Sub, не имеющая параметров. Только макросы можно вызывать по имени из редактора VBA или приложения Office. Все другие процедуры нужно вызывать либо из других процедур, либо специальными способами, о которых будет рассказано ниже.
Процедура типа Function (функция) — тоже набор команд, которые должны быть выполнены. Принципиальное отличие только одно: функция возвращает вызвавшей ее программе какое-то значение, которое там будет использовано. Пример процедуры:
Function Tomorrow()
Tomorrow = DateAdd("d", 1, Date())
End Function
и пример ее вызова:
Private Sub Test1()
Dim dDate
dDate = Tomorrow
MsgBox dDate
End Sub
В тексте функции необходимо предусмотреть оператор, который присваивает ей какое-либо значение. В нашем случае это строка Tomorrow = DateAdd(" d", 1, Date()).
В принципе, процедуры типа Sub тоже могут возвращать значения — при помощи переменных (об этом — ниже). Зачем же тогда нужны функции? Все очень просто: функцию можно вставлять практически в любое место программного кода. Например, наш последний пример может выглядеть намного проще:
Private Sub Test 1()
MsgBox Tomorrow()
End Sub
В VBA предусмотрены сотни встроенных функций (и гораздо большее число предусмотрено в объектных моделях приложений Office). Даже в нашем примере используются две встроенные функции: Date(), которая возвращает текущую дату по часам компьютера и DateAdd(), которая умеет прибавлять к текущей дате определенное количество дней, недель, месяцев, лет и т.п. Про встроенные функции будет рассказано ниже.
В VBA имеются также процедуры обработки событий (event procedure) — процедуры типа Sub специального назначения, которые выполняется в случае возникновении определенного события. Пример был приведен выше (Private Sub UserForm_Click()). Про события подробнее будет рассказано в модуле про формы и события.
Есть еще процедуры типа Property (процедуры свойства). Они нужны для определения свойств создаваемого вами класса, а поскольку созданием своих классов мы заниматься не будем, то их можно не рассматривать.