Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2 Курс Информатика VBA(ЗО) / Книги / В.Д.Хорев - Самоучитель программирования на VBA в Microsoft Office

.pdf
Скачиваний:
2707
Добавлен:
31.05.2015
Размер:
21.66 Mб
Скачать

Операторы и встроенные функции языка VBA 305

MyString = Mid(“АБВГДЕ”, 5, 1)

присваивает переменной MyString строку “Д”.

Поиск в строке (функции InStr, InStrB)

Для поиска в строке используется функция InStr. Эта функция ищет вхождение подстроки, заданной вторым параметром (“строка2”), в строке, заданной первым параметром (“строка1”). Если “строка2” нашлась внутри “строки1”, то функция возвращает позицию (порядковый номер символа) “строки2” в “строке1”. В случае безуспешности поиска функция возвращает значение 0.

Если строка содержит двоичные данные, то аналогичную задачу можно решить при помощи функции InStrB.

Например, выражение

InStr(“АБВГДЕ”, “Д”)

вернет значение 5, а выражение

InStr(“АБВГДЕ”, “Ж”)

вернет 0, поскольку символа “Ж” в строке “АБВГДЕ” нет. Выражение

InStr(“Иванов Иван Иванович”, “Иван”)

вернет значение 1, поскольку первая строка начинается с символов “Иван”, а вот выражение

InStr("Иванов Иван Иванович", " Иван")

вернет 7: хотя сочетание символов “ Иван” встречается в первой строке два раза, функция возвращает позицию первого вхождения подстроки.

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

InStr(8, "Иванов Иван Иванович", " Иван")

вернет число 12, поскольку первое вхождение строки “ Иван” будет пропущено (поиск начинается с 8-го символа).

Вот каким образом, например, функцию InStr используют для того, чтобы разделить строковое значение вида “фамилия, имя” на две отдельные строки — “имя” и “фамилия”, пользуясь положением запятой, как ориентиром для разбиения строки:

Dim MyFullName As String

Dim MyLastName As String

Dim MyFirstName As String

MyFullName = "Иванов, Иван"

MyLastName = Left(MyFullName, InStr(MyFullName, ",") - 1)

MsgBox MyLastName

MyFirstName = Right(MyFullName, InStr(MyFullName, ",") - 3)

MsgBox MyFirstName

В переменную MyLastName попадет подстрока “Иванов”, а в переменную MyFirstName — подстрока “Иван”.

Преобразования регистра (функции LCase, UCase)

Для преобразования регистра символов в строке используют функции LCase и UCase.

306 Приложение. VBA, как язык программирования: данные, синтаксис и функции

Функция LCase преобразует строку-параметр в нижний регистр (заглавные и строчные буквы становятся строчными), а функция UCase наоборот, преобразует строку-параметр в верхний регистр (заглавные и строчные буквы становятся заглавными). Например:

Dim MyString As String

MyString = LCase("Произвольный Текст")

В переменной MyString будет содержаться строка “произвольный текст”. А это выражение

MyString = UCase("Произвольный Текст")

присвоит переменной MyString строку “ПРОИЗВОЛЬНЫЙ ТЕКСТ”.

Форматирование строки

Функция Space

Для того чтобы вставить в строку заданное число пробелов, используют функцию Space. Дело не только в том, что написать, например, “Space(30)” проще, чем отсчитать 30 пробелов. При форматировании строковых значений количество вставляемых пробелов может быть величиной переменной, подлежащей вычислению, и тут уж без функции Space не обойтись. Например:

MyString = “Иван” + Space(10) + “Иванов”

В результате переменная MyString будет содержать строку “Иван

Иванов”.

Функция String

Более универсальным инструментов для решения подобных задач является функция String. Она возвращает строковое значение, состоящее из заданного числа заданных символов, например:

MyString = “Иван” + String(10,”-“) + “Иванов”

В переменной MyString будет содержаться строка “Иван----------

Иванов”.

Функция Len

Функция Len возвращает длину строки в символах. Например, выражение

Len(“Иван”)

вернет значение 4.

Функция Len универсальна, если в качестве параметра указать не строковую переменную, функция вернет размер переменной в байтах.

Примеры форматирования строк

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

Dim MyString As String

Dim Str1, Str2 As String

Str1 = "Иван"

Str2 = "Иванов"

Чтобы сформировать результирующую строку из строк Str1 и Str2, используем, во-первых, функцию Space, сделав отступ первого слова равным 10:

Операторы и встроенные функции языка VBA 307

MyString = Space(10) + Str1 ...

Понятно, что перед тем, как добавить к строке MyString слово из переменной Str2, необходимо вставить какое-то количество точек. Как вычислить это количество? Очень просто — выражение

Len(Str1)

вернет длину первого слова, а разница

30 - Len(Str1)

обеспечит такое число символов, которое в сумме с длиной первого слова всегда будет равняться 30. Таким образом, между первым и вторым словом нужно вставить выражение

String(30 - Len(Str1), ".")

и получим две выровненные по левому краю колонки независимо от длины слов в этих колонках:

MyString = Space(10) + Str1 + String(30 - Len(Str1), ".") + Str2

Функции удаления пробелов (LTrim, RTrim, Trim)

Иногда пробелы приходится не вставлять, а наоборот — удалять. Например, при сравнении строковых значений их часто приходится приводить к стандартному виду, удаляя ведущие и замыкающие пробелы, а также преобразуя к одному и тому же регистру.

Для удаления ведущих пробелов используют функцию LTrim. Она возвращает строкупараметр без ведущих пробелов. Замыкающие пробелы аналогичным образом удаляет функция RTrim, а функция Trim удаляет одновременно, и ведущие, и замыкающие пробелы. Например:

Dim MyString As String

Иванов

")

MyString = LTrim("

В результате в переменной MyString будет содержаться строка “Иванов ”. А это выраже-

ние

 

 

MyString = RTrim("

Иванов

")

присваивает переменной MyString строку “ Иванов”. Следующая строка

MyString = Trim(" Иванов ")

присваивает переменной MyString строку “Иванов”.

Функция Format

Функция Format представляет собой, наверно, наиболее мощный (и, в то же время, наиболее сложный) инструмент из арсенала строковых функций Visual Basic.

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

Ниже приведены примеры форматирования значений различных типов при помощи функции Format. При их рассмотрении необходимо учитывать, что такие, например, форматы, как представление денежных сумм и дат, зависят от локализации Windows и пакета Office, а также от текущих настроек в окне Язык и стандарты панели управления Windows. Пример:

308 Приложение. VBA, как язык программирования: данные, синтаксис и функции

Dim MySum As Double

Dim MyNum As Long

Dim MyEnabled As Boolean

Dim MyControl As Single

Dim MyDate As Date

Dim MyTime As Date

Dim MyResult As String

MySum = 1999.99

MyResult = Format(MySum, "Currency")

В результате в переменной MyResult будет содержаться строка “2 000 р.”. Следующая строка

MyResult = Format(MySum, "Fixed")

присваивает переменной MyResult строку “1999,99”. Следующая строка

MyResult = Format(MySum, "#,##0.0000")

присваивает переменной MyResult строку “1 999,9900”. Следующая строка

MyResult = Format(MySum, "###0.00 руб.")

присваивает переменной MyResult строку “1999,99 руб.”. Следующая строка

MyNum = 12345678

MyResult = Format(MyNum, "000 000 00")

присваивает переменной MyResult строку “123 456 78”. Следующая строка

MyControl = 1.17

MyResult = Format(MyControl, "Percent")

присваивает переменной MyResult строку “117,00%”. Следующая строка

MyEnabled = True

MyResult = Format(MyEnabled, "Yes/No")

присваивает переменной MyResult строку “Да”. Следующая строка

MyDate = "17/04/2001"

MyResult = Format(MyDate, "Long Date")

присваивает переменной MyResult строку “17 апреля 2001 г.”.

MyResult = Format(MyDate, "dddd, mmm d yyyy")

присваивает переменной MyResult строку “вторник, апр 17 2001”. Следующая строка

MyTime = #1:11:01 PM#

MyResult = Format(MyTime, "h:m:s")

присваивает переменной MyResult строку “13:11:1”. Следующая строка

MyResult = Format(MyTime, "hh:mm:ss AMPM")

присваивает переменной MyResult строку “01:11:01”. Следующая строка

Операторы и встроенные функции языка VBA 309

MyResult = Format("Иванов", "<")

присваивает переменной MyResult строку “иванов”. Следующая строка

MyResult = Format("Иванов ", ">")

присваивает переменной MyResult строку “ИВАНОВ”.

Преобразование строковых и символьных значений

Символы в строковых значениях имеют внутреннее представление в виде кодов, —попросту, целых чисел, каждое из которых соответствует определенному символу. Иногда требуется переходить от кодовой “ипостаси” символа к знаковой и наоборот.

Функции Asc, AscB и AscW

Для получения кода символа используют функцию Asc — эта функция получила свое название от кода ASCII, хотя в настоящее время используются также и другие коды.

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

Функции Chr, Chr B и Chr W

Обратное преобразование, то есть преобразование целого числа, представляющего код символа, в символьное значение, осуществляет функция Chr. Эта функция возвращает строку, состоящую из одного символа, код которого задан параметром. Если строка должна содержать двоичные данные, то следует воспользоваться функцией ChrB. Для символов в коде Unicode, следует воспользоваться функцией ChrW (если система не поддерживает Unicode, то функция действует аналогично Chr).

Выражение

Asc(“A”)

так же, как и выражение

Asc(“ABCDEF”)

вернет целочисленное (Integer) значение 65 — код латинской буквы “A” в стандарте ASCII. Выражение

Chr(65)

вернет строковое значение “A”.

Примеры использования строковых функций

Шифрование/дешифрование строки

В следующем примере осуществляется упрощенное шифрование строки MyString, при этом шифрованная строка помещается в переменную MyEncodedString. Затем строка MyEncodedString дешифруется:

Dim N As Integer

Dim MyString As String

Dim MyEncodedString As String

Dim MyTempChar As String

Dim MyTempInteger As Integer

310 Приложение. VBA, как язык программирования: данные, синтаксис и функции

Помещаем текст в исходную строку:

MyString = "Иванов"

Зашифрованная строка первоначально пуста:

MyEncodedString = ""

Начинаем цикл с первого символа MyString до последнего символа, то есть до числа, равного длине строки MyString:

For N = 1 To Len(MyString)

Поместим очередной символ в переменную MyTempChar (функция Mid будет возвращать каждый раз N-й символ строки MyString):

MyTempChar = Mid(MyString, N, 1)

В переменную MyTempInteger запишем код этого символа, увеличенный на “ключ” — чис-

ло 10:

MyTempInteger = Asc(MyTempChar) + 10

Добавим к шифрованной строке символ, соответствующий коду в переменной

MyTempInteger:

MyEncodedString = MyEncodedString + Chr(MyTempInteger)

Next N

После окончания цикла в переменной MyEncodedString содержится строка “Тмкчшм”, представляющая зашифрованную строку “Иванов”. Следующий оператор выводит ее на экран:

MsgBox MyEncodedString

Теперь выполним обратное преобразование, поменяв строки MyString и

MyEncodedString местами и вычитая “ключ” 10 из кода символа, вместо того, чтобы добавлять его:

MyString = ""

For N = 1 To Len(MyEncodedString)

MyTempChar = Mid(MyEncodedString, N, 1)

MyTempInteger = Asc(MyTempChar) - 10

MyString = MyString + Chr(MyTempInteger)

Next N

В результате в переменной MyString будет содержаться строка “Иванов”. Следующий оператор выводит ее на экран:

MsgBox MyString

Конечно, это упрощенный алгоритм на уровне “пляшущих человечков”: не требуется быть криптоаналитиком, чтобы его разгадать. На практике используют гораздо более сложные преобразования, однако сам механизм от этого не меняется. Усложняются лишь математические операции, которые производятся над кодами символов.

Операторы и встроенные функции языка VBA 311

Разбор строки

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

При автоматизации офиса посредством VBA очень часто возникает необходимость импортировать данные из текстовых файлов. Такие файлы могут быть никак не приспособлены для автоматической “закачки” в таблицу Excel или базу данных Access. В подобных случаях приходится разбирать строки файла, выделяя в них требуемые значения.

Предположим, подлежащие разбору строки имеют следующий вид:

Ф.И.О.: Иванов Иван Иванович; адрес: м. Ивановская 1; год рождения: 1962;

Необходимо выделить в строке фамилию, адрес и год рождения. Здесь невозможно “привязаться” к позициям символов, поскольку от строки к строке положение всех этих составляющих будет меняться по той простой причине, что фамилии и адреса разных людей имеют разную длину. Но все же такую строку можно корректно разобрать на составляющие посредством строковых функций VBA.

Пусть подлежащая разбору строка содержится в переменной MyString:

Dim MyString As String

А результирующие значения будут представлены отдельными строковыми переменными:

Dim Familia As String

Dim Adres As String

Dim GodRogdenia As String

Еще потребуется промежуточная строковая переменная для хранения подстроки ФИО:

Dim FIO As String

и две целочисленные переменные, назначение которых станет ясно в дальнейшем:

Dim BegPoint, EndPoint Integer

Итак, каким-нибудь образом в переменной MyString оказывается исходное значение:

MyString = "Ф.И.О.: Иванов Иван Иванович; " + _ "адрес: м. Ивановская 1; год рождения: 1962;"

Вначале удалим ведущие и замыкающие пробелы. Есть они или их нет — какая разница? Проще и надежней удалить их, чем задумываться над их существованием:

MyString = Trim(MyString)

Теперь найдем в строке первые вхождения символов “:” и “;”, и запомним их позиции в пере- менных-указателях BegPoint и EndPoint:

BegPoint = InStr(MyString, ":")

EndPoint = InStr(MyString, ";")

Теперь у нас есть указатели на позиции перед началом подстроки “Иванов Иван Иванович” и после конца этой подстроки.

Чтобы выделить подстроку при помощи функции Mid, необходима небольшая арифметическая корректировка. Начало выделяемой подстроки должно быть на два символа правее двоеточия (BegPoint + 2), а длина выделяемой подстроки должна равняться разнице между указателями на-

312 Приложение. VBA, как язык программирования: данные, синтаксис и функции

чала и конца, за вычетом 1, то есть EndPoint – BegPoint – 1. Таким образом, загрузим в переменную FIO всю подстроку:

FIO = Mid(MyString, BegPoint + 2, EndPoint – BegPoint – 1)

Теперь в переменной FIO содержится строка “Иванов Иван Иванович”. Чтобы выделить фамилию, найдем в ней первый пробел, удалив на всякий случай ведущие пробелы (при небрежном наборе текста слова вполне могут разделять несколько пробелов вместо одного и привязанная к позиции “:” подстрока может все-таки начинаться с пробелов):

BegPoint = InStr(LTrim(FIO), " ")

Отрежем слева количество символов, на единицу меньшее позиции первого пробела:

Familia = Left(LTrim(FIO), BegPoint - 1)

Теперь в переменной Familia содержится строка “Иванов”.

Далее надо найти позицию адреса. Начало адреса укажет подстрока “адрес:”:

BegPoint = InStr(1, MyString, "адрес:")

А вот чтобы найти второе вхождение символа “;”, обозначающего конец адреса, необходимо начинать поиск не с начала строки, а с позиции, на 1 большей той, где в прошлый раз было найдено первое вхождение символа “;” (это число все еще хранится в переменной EndPoint):

EndPoint = InStr(EndPoint + 1, MyString, ";")

Далее можно извлечь адрес, сделав поправку на длину собственно самой подстроки “адрес:”:

Adres = Mid(MyString, BegPoint+Len("адрес:"), _

EndPoint-BegPoint-Len("адрес:"))

Теперь в переменной Adres содержится строка “м. Ивановская 1”. Остается извлечь год рождения.

Сначала выделим пять символов справа:

GodRogdenia = Right(MyString, 5)

В результате в переменной GodRogdenia содержится строка “1962;”. А затем выделим четыре символа слева:

GodRogdenia = Left(GodRogdenia, 4)

Теперь в переменной GodRogdenia содержится строка “1962”.

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

MsgBox FIO

MsgBox Familia

MsgBox Adres

MsgBox GodRogdenia

Предметный указатель

A

Access диалоговое окно

Add Procedure, 155 Построитель, 147 Создание форм, 139

создание таблицы в режиме Конструктора, 133 ADO (ActiveX Data Objects), 157

C–D

Chr(13), 91

CreateObject, создание объекта

Access.Application, 153

Word.Application, 69

DAO (Data Access Objects), 157

E

Excel

группирование данных, 26 диалоговое окно

Присвоение имени, 53 Условное форматирование, 32 Формат ячеек, 24, 32, 34

диапазон ячеек, 25 именованные ячейки, 30 именованный диапазон, 53 команда

Вставка Имя | Присвоить, 53 Лист, 45

Строки, 24, 26 Данные | Группа и структура | Группировать,

27, 28 Правка | Заполнить | Вниз, 31 Формат

Столбец | Скрыть, 62 Условное форматирование, 32 Ячейки, 23, 24

команда контекстного меню ярлыка рабочего листа Исходный текст, 35

объединение ячеек, 24 строка

вставка, 26 удаление, 26

условное форматирование ячеек, 32

G–O

GetObject, 81

Hyperlinks, 81

IMAP, 318, 329, 334, 335, 339

OLE Automation, 96, 102

Outlook

команда

Сервис | Учетные записи, 327

Outlook.SyncObject, 334

R–W

Range, 45 SQL-запрос, 158 Value, 69

wdTableFormatContemporary, формат Wordтаблицы Современный, 71

wdWindowStateMaximize, состояние окна, 73 Worksheet, 35

À–Â

автоформат, 71

база данных Access, 132 библиотека Microsoft

Access 9.0 Object Library, 151 ActiveX Data Objects 2.1 Library, 157 Excel 8.0 Object Library, 79

Excel 9.0 Object Library, 79 Outlook 9.0 Object Library, 320 Word 8.0 Object Library, 68 Word 9.0 Object Library, 68

буфер обмена Windows (Clipboard), 25 выражение

Function, 103

Private, 333

Public, 333

Sub, 103

Ä

денежная единица грн. Ukrainian, 23 р. Русский, 23

диалоговое окно

Add Procedure, 103 Безопасность, 20 Вставка процедуры, 103 Запись макроса, 63 Макрос, 68, 77

Назначить макрос объекту, 43, 44, 61 Поле, 67 Специальная вставка, 25, 48, 98

Учетные записи в Интернете, 327 Форматирование объекта, 56

добавление гиперссылок, 81

Ç–È

значение xlPasteFormats, 48 xlPasteValues, 48

имя рабочего листа Excel, 47

Ê

команда

Вид Панели инструментов, 191

Панели инструментов | Формы, 42, 55 Панель элементов, 142

Вставка | Поле, 67 Окно | Отобразить, 82

Соседние файлы в папке Книги