Функции VBA (ч.1). Понятие функции.
Функция - это встроенная формула, выполняющая действия над выражениями и генерирующая какое-то значение, которое VBA вставляет в программу в том месте, где появляется имя этой функции.
Не следует путать термины функция и процедура. Процедура, как правило, выполняет какую-то определенную задачу (задачи). Функция оперирует определенными данными и всегда возвращает некоторое результирующее значение.

В приведенном выше листинге функция CStr преобразует значение другой функции Now (получение системной даты) в строку и результирующее значение присваивается переменной DT. Обратите внимание, что переменная ТМ автоматически преобразуется VBA к строковому типу в операторе вывода текстового сообщения на экран. Подобные "вольности" в программировании доступны далеко не во всех языках, поэтому, не стоит ими злоупотреблять, дабы не выработать вредную привычку в написании "неряшливых" программных кодов.
Вы, наверное, уже обратили внимание, что некоторые функции не требуют аргументов. В вышеприведенном листинге функции Time, Now не требуют никаких аргументов, они просто возвращают текущие системное время и дату. В то же время функция CStr требует наличия аргумента.
Функции, не требующие аргументов, просто вводятся в код программы.
Функции, требующие ввода одного или нескольких аргументов, вводятся в код программы следующим образом: пишется название функции, а затем, в круглых скобках через запятую перечисляются значения аргументов.
Тип данных значения, возвращаемого функцией, зависит от этой конкретной функции. Большинство функций возвращают значения типа Variant, String, Double, Integer. VBA может автоматически преобразовывать результат какой-либо функции в тип данных, совместимый с другими значениями в выражении, содержащем эту функцию. Все правила совместимости типов данных, рассмотренные для констант и переменных, применимы также к значениям, возвращаемым функциям.
Игнорирование результата функции
Возвращаемое значение функции, как правило, используется в дальнейших вычислениях программы. Однако в некоторых случаях можно не использовать возвращаемое функцией значение.
Именно так используется в вышеприведенном листинге функция MsgBox, хотя здесь она используется в качестве процедуры (т.к. не использует возвращаемые значения).
В действительности же, VBA предоставляет несколько встроенных констант для определения кнопок в окне сообщения MsgBox.

Однако, результат выбора пользователя опять никаким образом не возвращается и не используется в дальнейшем коде программы. Исправим этот нюанс.

При выполнении последнего листинга VBA после ответа пользователя (который нажал на одну из трех кнопок) закрывает окно и в переменной Otvet сохраняет число, соответствующее выбранной кнопке.
Два последних примера использования MsgBox показывают важный факт, касающийся функций: опуская круглые скобки вокруг списка аргументов функции, мы тем самым игнорируем результат функции. В этом случае VBA интерпретирует вызов функции, как вызов процедуры, и не возвращает результат.
В то же время VBA запрещает игнорирование результата функции, имя которой является ключевым словом VBA (например, CStr), и тех функций, единственным назначением которых является предоставление некоторого возвращаемого значения, например, математических.
Именованные аргументы функции
Аргументы функции необходимо перечислять в определенном порядке. Так для функции MsgBox первый аргумент является сообщением для отображения, второй - это число и тип кнопок для диалогового окна, третий - заголовок диалогового окна. Об этом подсказывает всплывающее окно "Краткие сведения", появляющееся при вводе имени функции.

Следует обратить внимание, что если второй (необязательный) аргумент опустить, все же необходимо включать отмечающие запятые для второго аргумента в список аргументов.
При пропуске или перестановке аргументов в списке аргументов функции можно получить ошибки несовпадения типов или, еще хуже, не получить никакой ошибки вообще. В результате программа может работать неправильно, а вам будет трудно найти причину "неисправности".
Чтобы предотвратить подобные ошибки, VBA дает возможность использования именованных аргументов функций. Обратите внимание на следующий листинг.

Обе строки имеют один и тот же результат. Первый оператор использует обычный метод перечисления аргументов, а второй - метод именованных аргументов. Причем, обратите, внимание, во втором случае порядок следования аргументов изменен. В методе именованных аргументов это допускается.
Полный синтаксис функции MsgBox следующий:
MsgBox (Prompt [, Buttons] [, Title] [, HelpFile, Context])
Единственным обязательным аргументом является аргумент Prompt, который может быть любым строковым выражением и содержит информацию, которая выводится в диалоговом окне. Все остальные аргументы - необязательные.
Аргумент Title - строка для заголовка диалогового окна.
Аргумент HelpFile - строковое выражение, содержащее имя справочного файла Windows (который уже должен быть создан).
Аргумент Context - численное выражение, указывающее раздел в справочном файле, относящийся к отображаемому диалоговому окну.
Аргумент Buttons - численное выражение, которое задает количество и тип кнопок в диалоговом окне. Также указывает кнопку по умолчанию и, содержит ли это диалоговое окно стандартные значки Windows для предупредительных сообщений и запросов пользователя.
Аргументы-константы функции MsgBox
Константа | Назначение |
vbAbortRetryIgnore | Отображает командные кнопки Стоп, Повтор, Пропустить |
vbApplicationModal | Для продолжения работы с приложением пользователь должен ответить на запрос диалогового окна. |
vbCritical | Отображается окно с предупредительным значком критической ошибки. |
vbDefaultButton1 vbDefaultButton2 vbDefaultButton3 vbDefaultButton4 |
Номер командной кнопки в диалоговом окне являющейся кнопкой по умолчанию. |
vbExclamation | Желтый знак вопроса. Используется для отображения важной информации не требующей ответа. |
vbInformation | Отображает значок информации. Используется для отображения справочной информации. |
vbMsgBoxHelpButton | Добавляет к диалоговому окну кнопку Справка. При щелчке на этой кнопке открывается файл, который задан в аргументе HelpFile, в разделе, заданном аргументом Context. |
vbOKCancel | Отображает кнопки ОК и Отмена. |
vbOKOnly | Отображает только кнопку ОК - аналогична пропуску аргумента Buttons. |
vbQuestion | Отображает значок вопроса. Используется когда надо задать пользователю какой-то важный вопрос. |
vbRetryCancel | Отображает кнопки Повтор и Отмена. |
vbSystemModal | Диалоговое окно всегда остается впереди других окон пока не будет закрыто. |
vbYesNo | Отображает кнопки Да и Нет. |
vbYesNoCancel | Отображает кнопки Да, Нет и Отмена. |
Возвращаемые значения-константы функции MsgBox
Константа | Назначение |
vbAbort | Пользователь выбирает кнопку Стоп |
vbCancel | Пользователь выбирает кнопку Отмена |
vbIgnore | Пользователь выбирает кнопку Пропустить |
vbNo | Пользователь выбирает кнопку Нет |
vbOK | Пользователь выбирает кнопку ОК |
vbRetry | Пользователь выбирает кнопку Повтор |
vbYes | Пользователь выбирает кнопку Да |
Функция InputBox
InputBox - еще одна довольно часто используемая функция для обмена данными с пользователем.
Полный синтаксис функции InputBox следующий:
InputBox (Prompt [, Title] [, Default] [, XPos] [, YPos] [, HelpFile, Context])
Аргументы Prompt (единственный обязательный аргумент), Title, HelpFile, Context - аналогичны уже рассмотренным одноименным аргументам функции MsgBox.
Аргумент Default - строковое выражение, использующееся как значение по умолчанию для пользовательского ввода.
Аргументы XPos, YPos - любые численные выражения. Эти аргументы задают координаты вывода диалогового окна на экране монитора. XPos - горизонтальное расстояние от левого края окна. YPos - вертикальное расстояние от верхнего края окна. Оба расстояния измеряются в твипах (1 твип = 1/20 точки = 0,0007 дюйма). Следует быть внимательным при использовании этих аргументов, т.к. при их больших значениях диалоговое окно может "уехать" за пределы экрана монитора.
В качестве примера использования функции InputBox приведен нижеследующий листинг, который запрашивает пользователя ввести имя файла, и предлагает имя по умолчанию.

При вызове InputBox можно использовать именованные аргументы.
Нельзя смешивать именованные аргументы с обычным списком аргументов в одном и том же вызове функции.