О стоимости курса |
Основы VBA: встроенные и пользовательские функции
6.1. Встроенные математические функции
06-01-Математика.docm - пример к п. 6.1.
Вы хотите вычислить квадратный корень, округлить число или сделать с ним еще что-нибудь подобное? Для этого VBA имеет специализированные функции, вы можете найти их в табл. 6.1.
Давайте рассмотрим пример. Добавим в документ 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.2. Строковые функции
06-02-Строковые функции.docm - пример к п. 6.2.
В табл. 6.2. вы можете найти информацию об основных строковых функциях VBA.
Работа со строками традиционно считается сложным разделом программирования для начинающих, поэтому проиллюстрируем вышеописанные функции примерами.
Создадим документ Microsoft Word и добавим на него следующие кнопки табл. 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. вы можете видеть результат вычисления длины строки.
Теперь займемся конверсией символов - функциями 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