Опубликован: 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
Виталий Белов
Виталий Белов
Россия, Коломна, МВАКИУ, 1997
Сергей Мороз
Сергей Мороз
Россия