Опубликован: 25.03.2009 | Уровень: для всех | Доступ: свободно
Лекция 6:

Основы VBA: встроенные и пользовательские функции

< Лекция 5 || Лекция 6: 123 || Лекция 7 >
Аннотация: Лекция посвящена описанию основных конструкций и принципов VBA. Подробно обсуждаются стандартные встроенные функции VBA и пользовательские процедуры и функции.

6.1. Встроенные математические функции

06-01-Математика.docm - пример к п. 6.1.

Вы хотите вычислить квадратный корень, округлить число или сделать с ним еще что-нибудь подобное? Для этого VBA имеет специализированные функции, вы можете найти их в табл. 6.1.

Таблица 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.

На рис. 6.1. вы можете видеть окно сообщения, содержащее результаты вызовов функции Rnd.

Окно сообщения, выводящее случайные числа

Рис. 6.1. Окно сообщения, выводящее случайные числа

Выше мы работали, в основном, с числами, теперь поговорим о строковых переменных.

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

06-02-Строковые функции.docm - пример к п. 6.2.

В табл. 6.2. вы можете найти информацию об основных строковых функциях VBA.

Таблица 6.2. Строковые функции
Функция Описание
Len(string) Возвращает длину строки. Например, длина строки "Добрый день" составляет 11 символов - учитывая пробел. Выходное значение имеет тип Long
LCase(string) Возвращает строку, все символы которой записаны в нижнем регистре. Например, строка "Привет" превратится в "привет"
UCase(string) Возвращает строку, все символы которой записаны в верхнем регистре. Например, для "Привет" мы получим "ПРИВЕТ"
String(number, character) Возвращает строку, состоящую из number символов character
Left(string, length) Возвращает length символов, начиная с первого левого символа строки string
Right(string, length) Возвращает length символов, начиная с самого правого символа строки string
LTrim(string) Возвращает строку, в которой вырезаны все пробелы слева
RTrim(string) Вырезает из строки все пробелы справа
Trim(string) Вырезает из строки все пробелы слева и справа
Mid(string, start[, length]) Вырезает из строки string с позиции start length символов
Asc(string) Возвращает ASCII-код первого символа строки
Chr(charcode) Возвращает символ, соответствующий коду символа

Работа со строками традиционно считается сложным разделом программирования для начинающих, поэтому проиллюстрируем вышеописанные функции примерами.

Создадим документ Microsoft Word и добавим на него следующие кнопки табл. 6.3.

Таблица 6.3. Кнопки на листе
Имя кнопки Надпись Номер листинга
cmd_Len Длина строки листинг 6.1.
cmd_Conv Конверсия листинг 6.2.
cmd_Mid Вырезание листинг 6.3.
cmd_Asc Коды листинг 6.5.

Обработчик нажатия кнопки 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. Пример использования функций для вырезания символов

Теперь рассмотрим примеры работы функций Asc, Chr и функции String. Чтобы работать с функциями Asc и Chr нам нужно познакомиться с понятием таблицы символов ASCII.

ASCII расшифровывается как American Standard Code For Information Intercharge - американский стандартный код для обмена информацией. Каждый символ в ASCII закодирован восьмибитным кодом. В результате получается таблица, в которой каждому управляющему символу, цифре, букве латинского или национального алфавитов сопоставлен свой код. Коды записывают в различных представлениях - в основном - в шестнадцатеричном и десятичном. Мы будем пользоваться десятичной записью.

Мы не будем приводить здесь таблицу ASCII полностью, приведем лишь некоторые полезные коды и диапазоны кодов.

Коды в диапазоне 0-31 имеют управляющие символы. Символ возврата каретки (тот самый, который вставляется в документ при нажатии клавиши Enter ) имеет код 13.

Коды в диапазоне 32-127 имеют латинские символы, цифры, знаки препинания - эта часть таблицы остается постоянной для различных кодовых таблиц. Например, пробел имеет код 32, точка - 46. Диапазон 48-57 занимают цифры от 0 до 9, диапазон 65-90 занимают заглавные латинские буквы от A до Z, диапазон 97-122 - строчными буквы a-z.

В диапазоне 128-225 расположены символы национальной кодировки. В русифицированных версиях MS Windows обычно применяется кодовая страница MS Windows 1251. В ней коды 192-223 имеют заглавные буквы от А до Я, 224-255 - строчные буквы от а до я.

Используя коды символов можно вводить в документы (или записывать в файлы, создаваемые программно) символы, которые нельзя ввести с клавиатуры.

В коде обработчика Click для cmd_Asc создадим программу (листинг 6.5.), которая сначала запрашивает у пользователя ввод символа, после чего выводит его ASCII код, потом - ввод кода, после чего выводит соответствующий ему символ. Так же здесь мы посмотрим на то, как работает функция String:

'Переменная для хранения кода символа
    Dim num_AscNumber
    'Переменная для хранения символа
    Dim str_Char
    'Начало блока перевода кода в символ
    num_AscNumber = Val(InputBox("Введите код символа"))
    'В переменной str_Char теперь хранится символ
    'с кодом num_AscNumber
    str_Char = Chr(num_AscNumber)
    MsgBox (str_Char + " - символ с кодом " + _
    Str(num_AscNumber))
    'Начало блока перевода символа в код
    str_Char = InputBox("Введите символ")
    'Теперь в переменной num_AscNumber хранится
    'Код символа, введенного в str_Char
    num_AscNumber = Asc(str_Char)
    MsgBox ("Символу " + str_Char + " соответствует код" + _
    Str(num_AscNumber))
    'А теперь - пример функции String.
    'выведем в окне сообщения 15 символов *
    MsgBox ("15 символов *: " + String(15, "*"))
Листинг 6.5. Пример использования функций Chr, Asc, String
< Лекция 5 || Лекция 6: 123 || Лекция 7 >
Евгений Ушаков
Евгений Ушаков
О стоимости курса
Александр Новиков
Александр Новиков
Справочник по объектам VBA
Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Михаил Алексеев
Михаил Алексеев
Россия, Уфа, УГАТУ, 2002