Основные функции vba. Создаем свою первую функцию в Excel. Создание функции в VBA с необязательными аргументами

28.03.2020 Обзоры 

Dim nResult As Integer

nMult1 = CInt(InputBox("Введите первое число: ")) nMult2 = CInt(InputBox("Введите второе число: ")) nResult = fMultiply(nMult1, nMult2)

Selection.InsertAfter nResult Selection.Collapse wdCollapseEnd

4. Для того чтобы закомментировать код AutoNew() , выделите весь код этой процедуры (включая Public Sub AutoNew() и End Sub ) и нажмите кнопку Comment Block на панели инструментов Edit .

3.9. Встроенные функции языка VBA

3.9.1. Что такое встроенные функции

В языке программирования VBA предусмотрено несколько десятков встроенных функций . Они доступны в любой программе на языке VBA, при этом безразлично, в среде какого программного продукта мы находимся - Excel, Word, Access или, к примеру, AutoCAD. Используются они очень активно, и во многих ситуациях без них не обойтись. Профессиональные программисты применяют их совершенно автоматически, а обычным пользователям хочется посоветовать потратить несколько часов на знакомство с ними, потому что без знания этих функций эффективно работать в VBA не получится. Дополнительным аргументом в пользу их изучения является то, что практически идентичный набор функций есть в обычном Visual Basic и VBScript, а многие из этих функций с теми же названиями и синтаксисом встречаются и в других языках программирования - C++, Delphi, Java, JavaScript и т. п.

В справке по VBA встроенные функции сгруппированы по буквам (рис. 3.2).

Многие слушатели на курсах задавали вопрос: а нет ли справки по этим функциям на русском языке? К сожалению, такой справки мне найти не удалось, поэтому попытаюсь привести краткую справку в этой книге. Далее будет рассказано про большинство активно используемых функций языка VBA (математические функции, такие как косинус или тангенс, которые в практической работе почти не используются, и финансовые функции мы рассматривать не будем). Полный синтаксис функций для экономии места приводиться не будет: главное - понимание, что делает каждая функция и в каких ситуациях ее можно использовать.

Функции в следующих разделах сгруппированы по своей функциональности. Если нужно найти информацию просто по имени функции, можно воспользоваться предметным указателем в конце книги.

Рис. 3.2. Справка по встроенным функциям

3.9.2. Функции преобразования и проверки типов данных

В программах на VBA очень часто приходится преобразовывать значения из одного типа данных в другой. Приведу несколько типичных ситуаций, когда этим приходится заниматься:

преобразование из строкового значения в числовое при приеме значения от пользователя через InputBox() ;

преобразование значения даты/времени в строковое, когда нам нужно отобразить дату или время единообразно вне зависимости от региональных настроек на компьютерах пользователей;

преобразование значения из строкового в дату/время для применения специальных функций даты/времени.

Чаще всего для конвертации типов данных используются функции, имя которых складывается из префикса "C" (от слова Convert ) и имени типа данных. Перечень этих функций следующий: CBool() , CByte() , CCur() , CDate() ,

CDbl(), CDec(), CInt(), CLng(), CSng(), CStr(), CVar(), CVDate(), CVErr().

Просмотреть, что в итоге получилось, можно при помощи функции TypeName() , которая возвращает имя используемого типа данных, например:

nVar1 = CInt(InputBox("Введите значение")) MsgBox TypeName(nVar1)

В данном случае эта функция вернет "Integer" .

Кроме того, существует еще несколько полезных для конвертации функций.

Str() - позволяет перевести числовое значение в строковое. Делает почти то же самое, что и CStr() , но при этом вставляет пробел перед положительными числами.

Val() - "вытаскивает" из смеси цифр и букв только числовое значение. При этом функция читает данные слева направо и останавливается на первом нечисловом значении (допускается единственное нечисловое значение - точка, которая будет отделять целую часть от дробной). Очень удобно, когда у нас вперемежку с числовыми данными прописываются единицы измерения или валюта.

IsNumeric() и IsDate() - проверяют значения на соответствие, чтобы не возникло ошибок при конвертации. Для проверки на соответствие специальным значениям можно использовать функции IsArray() , IsEmpty() ,

IsError(), IsMissing(), IsNull() и IsObject(). Все эти функции возвраща-

ют True или False в зависимости от результатов проверки переданного им значения.

Hex() и Oct() - преобразовывают десятичные данные в строковое представление шестнадцатеричных и восьмеричных значений.

3.9.3. Строковые функции

Это наиболее часто используемые функции. Требуются они постоянно, и необходимо знать их очень хорошо.

Asc() - эта функция позволяет вернуть числовой код для переданного символа. Например, Asc("D") вернет 68. Эту функцию удобно использовать для того, чтобы определить следующую или предыдущую букву. Обычно она используется вместе с функцией Chr() , которая производит обратную операцию - возвращает символ по переданному его числовому коду. Например, такой код в Excel позволяет написать в ячейки с A1 по A20 последовательно буквы русского алфавита от A до У:

Dim n, nCharCode As Integer n = 1

nCharCode = Asc("А") Do While n <= 20

ActiveWorkbook.ActiveSheet.Range("A" & n).Value = Chr(nCharCode)

Синтаксис и программные конструкции VBA

nCharCode = nCharCode + 1 Loop

Варианты этой функции - AscB() и AscW() . AscB() возвращает только первый байт числового кода для символа, а AscW() возвращает код для символа в кодировке Unicode.

Chr() - возвращает символ по его числовому коду. Помимо того, что используется в паре с функцией Asc() (см. предыдущий пример), без нее не обойтись еще в одной ситуации: когда нужно вывести служебный символ. Например, нам нужно напечатать в Word значение "Газпром" (в кавычках). Кавычка - это служебный символ, и попытка использовать строку вида:

Selection.Text = ""Газпром""

приведет к синтаксической ошибке. А вот так все будет в порядке:

Selection.Text = Chr(34) & "Газпром" & Chr(34)

Есть варианты этой функции - ChrB() и ChrW() . Работают аналогично таким же вариантам для функции Asc() .

InStr() и InStrRev() - одни из самых популярных функций. Позволяют обнаружить в теле строковой переменной последовательность символов и вернуть ее позицию. Если последовательность не обнаружена, то возвращается 0. Функция InStr() ищет с начала строки, а InStrRev() - с конца.

Left() , Right() , Mid() - позволяют взять указанное вами количество символов из существующей строковой переменной слева, справа или из середины соответственно.

Len() - возвращает число символов в строке (длину строки). Часто используется с циклами, операциями замены и т. п.

LCase() и UCase() - переводят строку в нижний и верхний регистры соответственно. Часто используются для подготовки значения к сравнению, когда регистр не важен (фамилии, названия фирм, городов и т. п.).

LSet() и RSet() - заполняют одну переменную символами другой без изменения ее длины (соответственно слева и справа). Лишние символы обрезаются, на место недостающих подставляются пробелы.

LTrim() , RTrim() , Trim() - убирают пробелы соответственно слева, справа или и слева, и справа.

Replace() - заменяет в строке одну последовательность символов на другую.

Space() и String() - возвращают строку из указанного вами количества пробелов или символов соответственно. Обычно используются для форма-

Практически весь программный код модулей VBA содержится в процедурах двух типов Sub (подпрограммы) и Function (функции). Основная задача процедуры-функции Function - это вычисление некоторого значения и возвращение его в точку вызова процедуры-функции.

Синтаксис процедуры-функции Function:

Function Имя_Функции(аргументы As) As

Имя_Функции = Возвращаемое_Значение

End Function

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

Пример 1

Например, самая простая процедура-функция Function:

Function F1(x As Currency) As Currency

Function F1(x) можно использовать в дальнейших вычислениях (программном коде модуля). Процедуру типа Function можно выполнить, только вызвав ее из другой процедуры. Для этого в вызывающей процедуре необходимо присвоить имя данной F1(x) некоторой переменной.

Пример 2

Например, Function F1(x) можно использовать в процедуре MySub (), присвоив переменной "у" имя F1(x).

Dim y As Single ‘Объявление переменной y

y = F1 (9) ‘Определяем F1 (x) для значения x=9

Debug.Print y ‘Вывод значений в окне Immediate

Function F1 (x As Single) As Single

F1 = x ^ 10 ‘Возвращаемое значение х в степени 10

Здесь 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

Для вызова функции, требующей ввода одного или нескольких аргументов, необходимо ввести в правой части оператора присваивания ее имя с заключенными в скобках параметрами (значениями аргументов). Например, для вызова встроенной Function Log (N) с одной переменной N в процедуре типа Sub переменной Log_N присвоено имя функции Log (50) со значением аргумента равного 50.

Sub Натуральныйлогарифм ()

Dim LogN ‘Объявление переменной LogN

Debug.Print LogN ‘Вывод значений в окне Immediate

Замечание 1

Здесь встроенная функция 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 - случайное число из интервала ;
  • 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 возвращает значение, содержащее системную дату.

Арифметические выражения Visual Basic.

Теоретическая часть

Выражениями и функциями

ЛАБОРАТОРНАЯ РАБОТА №4. Работа с арифметическими

Вопросы для контроля

1. Какие компоненты позволяют создавать статические изображения в приложении?

2. Как поместить рисунок на форму? Какие методы для этой цели существуют и в чем их отличие?

3. Картинки какого формата может подключать к приложению компонент Image?

4. Какое свойство объекта Image отвечает за масштабирование? За видимость картинки?

Цель работы: ознакомиться с арифметическими выражениями и математическими функциями языка Visual Basic; научиться разрабатывать приложения с использованием выражений и математических функций

Выражения используются для операций над данными. В зависимости от данных и используемых операций выражения разделяют на арифметические, логические и символьные

Арифметические выражения – это последовательность чисел, констант, переменных, функций, которые соединены между собой знаками арифметических операций. Частным случаем выражения является просто константа, переменная или вызов функции.

Арифметические операции языка Visual Basic приведены в Таблице 4.1.

Таблица 4.1 – Арифметические операции языка Visual Basic

Приоритет выполнения операций (в порядке убывания): возведение в степень, умножение и деление, целочисленное деление, вычисление остатка, сложение и вычитание. Вычисления производятся слева направо. Скобки изменяют приоритет.

Примеры:

14 /5*2 = 5.6 – операции одного приоритета выполнятся слева направо

14\5*2 = 1 – умножение имеет более высокий приоритет и при целочисленном делении дробная часть отбрасывается

27^1/3 = 9 – возведение в степень обладает наивысшим приоритетом

27^(1/3) = 3 – скобки изменяют последовательность операций

В языке Visual Basic имеется широкий набор встроенных (стандартных ) функций, облегчающий написание программ. Различают математические функции, функции обработки строк, функции для работы с датами и временем, финансовые.

Математические функции:

Abs (x) – вычисляет модуль аргумента



Atn (x) – вычисляет арктангенс числа x

Sin (x) – вычисляет синус числа x

Cos (x) – вычисляет косинус числа x

Tan (x) – вычисляет тангенс числа x

Exp (x) – вычисляет e^x

Log (x) – вычисляет натуральный логарифм

Sqr (x) – вычисляет квадратный корень

Rnd () – возвращает случайное число в диапазоне от 0 до 1

Int (x) – вычисляет наибольшее целое число, не превышающее x

Fix (x) – вычисляет округленное число (отбрасывает дробную часть аргумента)

CInt(x) – возвращает аргумент, округленный до целого по правилам округления математики

Sgn (x) – возвращает знак числа

X^(1/n) – извлекает корень n-ной степени из X

Hex (x) – переводит десятичное число в шестнадцатеричное

Oct (x) – переводит десятеричное число в восьмеричное

Примеры округления чисел:

Int(7.32) = 7 CInt(5.5) = 6 Fix(-7.32) = -7

Int(-7.32) = -8 CInt(-7.5) = -7

Значения аргументов в тригонометрических функциях задаются в радианах!

Для перевода аргумента из градусов в радианы используется формула:

Аргумент (в радианах) = аргумент (в градусах)*ПИ / 180

Число ПИ может быть определено по формуле:

ПИ = Atn(1)*4

Полные сведения о встроенных функциях и правилах их применения можно найти в справочной системе Visual Basic.

Таблица 6.1. Встроенные математические функции
Функция Описание
Abs Абсолютное значение
Atn Арктангенс
Cos Косинус числа
Exp Возвращает число e (2.718282), возведенное в степень аргумента функции.
Fix Отбрасывает дробную часть числа и возвращает целую. В результате для положительных чисел получается число меньшее, чем входное (Fix(2.5) возвратит 2), для отрицательных - большее (Fix(-2.5) возвратит -2)
Int Отбрасывает дробную часть числа и возвращает целую. Для положительных получается число меньшее введенного (Int(2.5) возвратит 2), для отрицательных - так же меньшее (Int(-2.5) возвратит -3).
Log Возвращает натуральный логарифм числа
Rnd Возвращает случайное число типа Single, причем, это число находится между 0 и 1. Для инициализации генератора случайных чисел используйте директиву Randomize - ее надо вызвать до вызова Rnd .
Sgn Функция предназначена для определения знака числа. Если число положительное - она возвращает 1. Для нуля функция возвратит 0, для отрицательного числа -1.
Sin Синус
Sqr Квадратный корень
Tan Тангенс

Давайте рассмотрим пример. Добавим в документ Microsoft Word кнопку, назовем ее cmd_Calc , надпишем ее как Вычисления и добавим следующий код (листинг 6.1 .), иллюстрирующий работу рассмотренных функций.

Dim dblNumber As Double "Переменная, используемая в вычислениях Dim varResult "Переменная типа Variant dblNumber = Val(InputBox("Введите число")) "Вычисляем абсолютное значение введенного числа "Сначала присвоим результат переменной varResult "Далее - выведем подписанный результат в окне "сообщения, воспользуемся знаком "+" для "конкатенации строк, в других случаях "будем вызывать функции непосредственно "в MsgBox"e "Обратите внимание на то, что мы конвертируем "числовые значения в строки с помощью функции Str varResult = Abs(dblNumber) MsgBox ("Абсолютное значение " + _ Str(dblNumber) + " равняется " + Str(varResult)) "Арктангенс MsgBox ("Арктангенс " + _ Str(dblNumber) + " равняется " + _ Str(Atn(dblNumber))) "Косинус MsgBox ("Косинус " + _ Str(dblNumber) + " равняется " + _ Str(Cos(dblNumber))) "e в степени введенного числа MsgBox ("Число e в степени " + _ Str(dblNumber) + " равняется " + _ Str(Exp(dblNumber))) "Функция Fix MsgBox ("Результат работы функции Fiх для " + _ Str(dblNumber) + " равняется " + _ Str(Fix(dblNumber))) "Функция Int MsgBox ("Результат работы функции Int для " + _ Str(dblNumber) + " равняется " + _ Str(Int(dblNumber))) "Натуральный логарифм MsgBox ("Натуральный логарифм " + _ Str(dblNumber) + " равняется " + _ Str(Log(dblNumber))) "Получим несколько случайных чисел "первое число - от 0 до 1 "второе - от 0 до 10. "Третье - от 25 до 100 "Четвертое - целое от 0 до 34 Randomize MsgBox ("Группа случайных чисел: " + _ Str(Rnd()) + ", " + _ Str(Rnd() * 10) + ", " + _ Str(Rnd() * 75 + 25) + ", " + _ Str(Int(Rnd() * 34))) "Функция Sgn MsgBox ("Результат работы Sgn для " + _ Str(dblNumber) + " равняется " + _ Str(Sgn(dblNumber))) "Cинус MsgBox ("Синус " + _ Str(dblNumber) + " равняется " + _ Str(Sin(dblNumber))) "Квадратный корень MsgBox ("Квадратный корень " + _ Str(dblNumber) + " равняется " + _ Str(Sqr(dblNumber))) "Тангенс MsgBox ("Тангенс " + _ Str(dblNumber) + " равняется " + _ Str(Tan(dblNumber))) Листинг 6.1. Обработчик события Click кнопки cmd_Calc

Обратите внимание на алгоритм получения случайного числа, находящегося в определенном диапазоне, с помощью функции Rnd . Предположим, нам нужно получить случайное число от 15 до 40 . Получим, для начала, число от 0 до 40 . Очевидно, что для этого нам понадобится такой вызов: Rnd ()*40 .

Чтобы "поднять" уровень наименьшего случайного числа, возвращаемого выражением, до 15 , сделаем следующее.

Во-первых, вычислим разность 40 и 15 - у нас получится 25 . Значит, чтобы получить случайное число от 0 до 25 , можно использовать вызов Rnd ()*25 .

Во-вторых, прибавим к полученному случайному числу 15 . Теперь выражение для получения случайного числа от 15 до 40 выглядит так: Rnd ()*25+15 .

Проверим это высказывание на правильность. Функция Rnd , как известно, возвращает случайные числа от 0 до 1 . Если функция возвратит 0 - результат вычисления выражения будет равен 15 (0*25+15) . Если функция возвратит 1 - результат будет равен 40 (25*1+15) . Промежуточные значения Rnd дадут искомые случайные числа между 15 и 40 .

Обработчик нажатия кнопки cmd_Len (листинг 6.2 .) будет содержать решение следующей задачи: сообщить пользователю длину введенного текста. Очевидно, для решения этой задачи нам понадобится функция Len .

"Переменная для хранения входной строки Dim str_InpStr As String "Переменная для хранения найденной длины строки Dim lng_StrLen As Long str_InpStr = InputBox("Введите строку") "Вычисляем длину строки lng_StrLen = Len(str_InpStr) MsgBox ("Длина введенной строки: _" + _ str_InpStr + "_ равняется " + Str(lng_StrLen) + _ " символам") Листинг 6.2. Пример использования функции Len

На рис. 6.2 . вы можете видеть результат вычисления длины строки.


Рис. 6.2.

Теперь займемся конверсией символов - функциями LCase и UCase (листинг 6. 3.).

"Переменная для хранения входной строки Dim str_InpStr As String "Переменная для хранения измененной строки Dim str_NewStr As String str_InpStr = InputBox("Введите текст") "В str_NewStr окажется введеная строка "в которой все прописные буквы заменены строчными str_NewStr = LCase(str_InpStr) MsgBox ("Измененная строка: " + str_NewStr) "Теперь в str_NewStr будет та же строка "в которой все буквы стали прописными str_NewStr = UCase(str_InpStr) MsgBox ("Измененная строка: " + str_NewStr) Листинг 6.3. Пример использования функций LCase и UCase

На очереди - вырезание символов - функции Mid , LTrim , Rtrim , Left , Right (листинг 6.4 .) Среди этих функций наиболее мощной является Mid - используя ее, можно делать со строками очень много всего.

"Переменная для хранения входной строки Dim str_InpStr As String "Переменная для хранения вырезанных символов Dim str_NewStr As String "Зададим строку, с которой удобно будет работать str_InpStr = " Здравствуйте, Александр " "Функции удаления пробелов "При выводе строки ставим перед ее началом "и концом символ "_" для того чтобы "лучше было видно наличие "или отсутствие пробелов MsgBox ("Мы работаем с такой строкой: " + _ "_" + str_InpStr + "_") "LTrim - присваиваем результаты работы "переменной и выводим информацию в MsgBox str_NewStr = LTrim(str_InpStr) MsgBox ("Результат работы LTrim: " + _ "_" + str_NewStr + "_") "RTrim MsgBox ("Результат работы RTrim: " + _ "_" + RTrim(str_InpStr) + "_") "Trim MsgBox ("Результат работы Trim: " + _ "_" + Trim(str_InpStr) + "_") "Left - вырезаем из строки str_InpStr 12 "символов предварительно очистив ее "от начальных пробелов str_NewStr = Left(LTrim(str_InpStr), 12) MsgBox ("Первые 12 символов слева: " + _ str_NewStr) "Right - аналогично Вырезаем 9 символов справа str_NewStr = Right(RTrim(str_InpStr), 9) MsgBox ("Первые 9 символов справа: " + _ str_NewStr) "Функция Mid - для начала выведем по одному символу "со второй и пятнадцатой позиции строки "преварительно очищенной от лишних пробелов "в начале и в конце str_NewStr = Mid(Trim(str_InpStr), 2, 1) MsgBox ("Второй символ введенной строки: " + _ str_NewStr) str_NewStr = Mid(Trim(str_InpStr), 15, 1) MsgBox ("Пятнадцатый символ введенной строки: " + _ str_NewStr) "Выведем 5 символов, начиная с 15 символа str_NewStr = Mid(Trim(str_InpStr), 15, 5) MsgBox ("Пять символов строки с 15-й позиции: " + _ str_NewStr) Листинг 6.4. Пример использования функций для вырезания символов

Теперь рассмотрим примеры работы функций

Практически весь программный код модулей VBA содержится в процедурах двух типов Sub (подпрограммы) и Function (функции). Основная задача процедуры-функции Function - это вычисление некоторого значения и возвращение его в точку вызова процедуры-функции.

Синтаксис процедуры-функции Function:

Function Имя_Функции(аргументы As) As

Имя_Функции = Возвращаемое_Значение

End Function

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

Пример 1

Например, самая простая процедура-функция Function:

Function F1(x As Currency) As Currency

Function F1(x) можно использовать в дальнейших вычислениях (программном коде модуля). Процедуру типа Function можно выполнить, только вызвав ее из другой процедуры. Для этого в вызывающей процедуре необходимо присвоить имя данной F1(x) некоторой переменной.

Пример 2

Например, Function F1(x) можно использовать в процедуре MySub (), присвоив переменной "у" имя F1(x).

Dim y As Single ‘Объявление переменной y

y = F1 (9) ‘Определяем F1 (x) для значения x=9

Debug.Print y ‘Вывод значений в окне Immediate

Function F1 (x As Single) As Single

F1 = x ^ 10 ‘Возвращаемое значение х в степени 10

Здесь 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

Для вызова функции, требующей ввода одного или нескольких аргументов, необходимо ввести в правой части оператора присваивания ее имя с заключенными в скобках параметрами (значениями аргументов). Например, для вызова встроенной Function Log (N) с одной переменной N в процедуре типа Sub переменной Log_N присвоено имя функции Log (50) со значением аргумента равного 50.

Sub Натуральныйлогарифм ()

Dim LogN ‘Объявление переменной LogN

Debug.Print LogN ‘Вывод значений в окне Immediate

Замечание 1

Здесь встроенная функция 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 - случайное число из интервала ;
  • 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 возвращает значение, содержащее системную дату.