Практически весь программный код модулей VBA содержится в процедурах двух типов Sub (подпрограммы) и Function (функции). Основная задача процедуры-функции Function - это вычисление некоторого значения и возвращение его в точку вызова процедуры-функции.
Синтаксис процедуры-функции Function:
Function Имя_Функции(аргументы As ) As
Имя_Функции = Возвращаемое_Значение
End Function
Процедуры-функции Function могут быть использованы в различных выражениях.
Например, самая простая процедура-функция Function:
Function F1(x As Currency) As Currency
F1=x ^ 10
End Function
Function F1(x) можно использовать в дальнейших вычислениях (программном коде модуля). Процедуру типа Function можно выполнить, только вызвав ее из другой процедуры. Для этого в вызывающей процедуре необходимо присвоить имя данной F1(x) некоторой переменной.
Например, Function F1(x) можно использовать в процедуре MySub (), присвоив переменной "у" имя F1(x).
Sub MySub ( )
Dim y As Single ‘Объявление переменной y
y = F1 (9) ‘Определяем F1 (x) для значения x=9
Debug.Print y ‘Вывод значений в окне Immediate
End Sub
Function F1 (x As Single) As Single
F1 = x ^ 10 ‘Возвращаемое значение х в степени 10
End Function
Здесь Function F1(x)=$x^{10}$ для значения $ x=9$ возвращает в вызывающую процедуру MySub () значение $3,486785E+09$. Если для возвращаемого функцией значения или переменной, которая используется в процедуре VBA, не объявлен тип данных, то по умолчанию будет задан тип данных Variant.
В VBA используются как процедуры-функции Function, так и встроенные функции.
Встроенные функции состоят из двух частей: имени (идентификатора) и аргументов. Встроенные функции - это готовые формулы VBA, которые выполняют определенные действия над выражениями и возвращают некоторое значение в точку их вызова.
Функции возвращают результирующее значение вместо их имени, которое используется в дальнейших вычислениях. Как правило, функции требуют наличия аргументов, которые записываются в скобках через запятую. Но некоторые функции не требует аргументов. Например, функция Now(), которая не требует аргументов, возвращает текущую системную дату и время. Функции можно использовать для создания новых выражений или функций.
Как вставить функцию в текст программы? Чтобы использовать функцию в выражениях, необходимо ввести ее имя в оператор VBA. Для вызова встроенной функции, не требующей аргументов, достаточно ввести ее имя (например, Now) в код программы модуля:
Sub MyDate ( )
Dim TD ‘Объявление переменной TD
TD = Now ‘Определяем текущую системную дату и время
Debug.Print TD ‘Вывод значений в окне Immediate
End Sub
Для вызова функции, требующей ввода одного или нескольких аргументов, необходимо ввести в правой части оператора присваивания ее имя с заключенными в скобках параметрами (значениями аргументов). Например, для вызова встроенной Function Log (N) с одной переменной N в процедуре типа Sub переменной Log_N присвоено имя функции Log (50) со значением аргумента равного 50.
Sub Натуральныйлогарифм ( )
Dim LogN ‘Объявление переменной LogN
LogN = Log (50) ‘Определяем натуральный логарифм 50
Debug.Print LogN ‘Вывод значений в окне Immediate
End Sub
Здесь встроенная функция Log (N) для значения аргумента равного 50 возвращает значение 3,91202300542815 в точку вызова Log (50) вызывающей процедуры "Sub Натуральный_логарифм ()". Функцию можно вызвать как с помощью отдельного оператора VBA, так и поместив ее имя со списком значений аргументов (параметров) в формулу или выражение в программе на VBA. В VBA для сокращения записи используется механизм вложения функций, который позволяет указывать вызов одной функции в качестве аргумента для другой функции. В этом случае возвращаемое первой функцией значение используется в качестве аргумента для следующей функции.
В VBA имеется большой набор встроенных функций и процедур, упрощающих программирование, которые можно разделить на следующие категории:
- математические;
- функции проверки типов;
- функции обработки строк;
- функция форматирования;
- функции преобразования форматов;
- функции даты и времени.
Математические функции
К математическим функциям относят:
- Abs (x) - модуль аргумента $x$;
- Cos(x) - косинус аргумента $x$;
- Exp(x) - возведение основания натурального логарифма в степень $x$;
- Log(x) - логарифм натуральный аргумента $x$;
- Rnd - случайное число из интервала [0,1];
- Sin(x) - синус аргумента $x$;
- Sqr(x) - квадратный корень из $x$;
- Atn(x) - арктангенс от $x$;
- Tan(x) – тангенс от $x$;
- Sgn(x) – знак $x$.
Fix(x) и Int(x) обе функции отбрасывают дробную часть числа и возвращают целое значение. Разница между этими функциями состоит для отрицательных значений аргумента. Int(x) возвращает ближайшее отрицательное целое число, меньшее или равное х, а Fix(x) – ближайшее отрицательное целое число, большее или равное х.
Функции проверки типов
Приведем функции, определяющие каким типом является переменная:
- IsArray(х) – функция проверяет является ли переменная массивом;
- IsDate(х) определяет является ли переменная датой;
- IsError(х) определяет является ли переменная кодом ошибки;
- IsNull(х) определяет является ли переменная пустым значением;
- IsNumeric(х) определяет является ли переменная числовым значением;
- IsObject(х) определяет является ли переменная объектом.
Функция форматирования
Функция форматирования возвращает значение типа Variant (String), содержащее выражение, оформленное согласно синтаксиса функции:
Format(Выражение[,Формат [,Первый день недели[,Первая Неделя Года]]]),где:
- Выражение – обязательный аргумент (любое допустимое выражение – комбинация ключевых слов, операторов, переменных и констант, результатом которой является строка, число или объект);
- Формат – необязательный параметр (любое допустимое именованное или определенное пользователем выражение формата).
Если к имени функции добавляется знак $, то функция возвращает значение типа String., то функция возвращает значение типа String.
При создании собственного числового формата можно использовать следующие символы:
- 0 – резервирует позицию цифрового разряда. Отображает цифру или нуль. Если у форматируемого числа есть какая-нибудь цифра в этой позиции разряда, где в строке формата находится 0, функция отображает эту цифру, если нет, то в этой позиции отображается нуль;
- "#" - действие данного символа аналогично действию 0 с той лишь разницей, что незначащие нули не отображаются;
- . – резервирует позицию десятичного разделителя, определяет, сколько разрядов необходимо отображать слева и справа от десятичной точки;
- % - резервирует процентное отображение числа;
- . – разделяет сотни от тысяч.
Функции преобразования форматов
К ним относят:
- Val(строка) – возвращает числа, содержащиеся в строке, как числовое значение соответствующего типа.
- Str(число) – возвращает значение типа Variant (String), являющееся строковым представлением числа.
Кроме функций Val и Str имеется ряд функций по преобразованию типов выражений.
Функции обработки строк
Среди множества функций можно выделить следующие:
- Chr(код) – преобразует ASCII – код в строку. Например, Chr(10) осуществляет переход на новую строку, Chr(13) – возврат каретки;
- Mid(string, pos[,length]) – возвращает подстроку строки, содержащую указанное число символов, где String – строковое выражение, из которого извлекается подстрока;
- Pos – позиция символа в строке String, с которого начинается нужная подстрока;
- Length – число возвращаемых символов подстроки;
- Len(строка) – возвращает число символов строки.
Функции времени и даты
Возвращают значение типа Variant, содержащее системную дату, текущее время и т. д. Например функция Date возвращает значение, содержащее системную дату.