Листинг 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.
|
|
На следующем рисунке вы можете видеть окно сообщения, содержащее результаты вызовов функции Rnd.
Выше мы работали, в основном, с числами, теперь поговорим о строковых переменных.
В следующей таблице вы можете найти информацию об основных строковых функциях VBA.
Таблица Строковые функции | |
Функция | Описание |
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 и добавим на него следующие кнопки
Таблица Кнопки на листе | ||
Имя кнопки | Надпись | Номер листинга |
cmd_Len | Длина строки | листинг 6.1. |
cmd_Conv | Конверсия | листинг 6.2. |
cmd_Mid | Вырезание | листинг 6.3. |
cmd_Asc | Коды | листинг 6.5. |
Обработчик нажатия кнопки cmd_Len будет содержать решение следующей задачи: сообщить пользователю длину введенного текста. Очевидно, для решения этой задачи нам понадобится функция 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) + _
" символам")
На рисунке вы можете видеть результат вычисления длины строки.
Теперь займемся конверсией символов - функциями LCase и UCase.
'Переменная для хранения входной строки
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)
На очереди - вырезание символов - функции Mid, LTrim, Rtrim, Left, Right. Среди этих функций наиболее мощной является 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)
Теперь рассмотрим примеры работы функций Asc, Chr и функции String. Чтобы работать с функциями Asc и Chr нам нужно познакомиться с понятием таблицы символов ASCII.
ASCII расшифровывается как American Standard Code For Information Intercharge - американский стандартный код для обмена информацией. Каждый символ в ASCII закодирован 8-мибитным кодом. В результате получается таблица, в которой каждому управляющему символу, цифре, букве латинского или национального алфавитов сопоставлен свой код. Коды записывают в различных представлениях - в основном - в шестнадцатеричном и десятичном. Мы будем пользоваться десятичной записью.
Мы не будем приводить здесь таблицу 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 создадим программу, которая сначала запрашивает у пользователя ввод символа, после чего выводит его 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, "*"))