Операции и встроенные функции
Работа со строками
Работать с текстами программисту, как правило, приходится значительно чаще, чем работать с числами. Поэтому следует хорошо представлять основные базисные операции над строками, которые в большинстве случаев реализуются с помощью встроенных функций. Заметим, что в VBA Office 2000 добавлены новые операции над строками, расширяющие возможности эффективной работы по преобразованию текста.
Сравнение строк
Обычные операции сравнения применимы и к строковым данным. Мы уже говорили ранее о том, что интерпретация этих операций зависит от установки опции Option Compare.
- Если эта опция установлена как Text, то сравнение на "больше - меньше" представляет лексикографическое сравнение, когда строки сравниваются по их расположению в словаре. Заметьте, это сравнение не чувствительно к регистру, так что большие и малые буквы не различаются. Программисты, конечно, понимают, что сравнение строк означает сравнение кодов их символов, так что лексикографический порядок определяется кодировкой символов алфавита.
- Если эта опция установлена как Binary, то сравнение идет побитно. В этом случае сравнение естественно, чувствительно к регистру.
- При работе со строками в Access по умолчанию применяется сортировка, заданная на строках базы данных Access. Заметьте, при создании модуля в Access по умолчанию вставляется опция Option Compare Database. Конечно, эта опция применима только при работе в Access.
Если нужно локально переопределить вид сравнения, заданный опцией для всего модуля, то можно использовать встроенную функцию StrComp, которая возвращает результат сравнения строк. Ее синтаксис:
StrComp(string1, string2[, compare])
Аргументы string1 и string2 - сравниваемые строки. Необязательный аргумент compare указывает способ сравнения строк: значение по умолчанию 0 используется, чтобы выполнить двоичное сравнение, 1 задает посимвольное сравнение без учета регистра.
Если string1 меньше чем string2, то результат равен -1, если строки равны, то - 0, если вторая меньше, то - 1, если хоть одна из строк имеет значение Null, то результат также равен Null.
Сравнение с образцом
Мощным и весьма полезным средством при работе с текстами является операция Like, задающая сравнение с образцом. Необходимость нахождения в наборе всех строк, удовлетворяющих некоторому шаблону (образцу), возникает в самых разнообразных задачах. VBA позволяет решать ее в одну операцию. Приведем таблицу специальных символов, допустимых при задании образца.
Символы | Интерпретация | Примеры |
---|---|---|
* | Любой текст - произвольное число символов | Шаблону Agent* соответствуют все тексты, начинающиеся со слова Agent. Строки Agent007 и Agent Майор Пронин удовлетворяют шаблону. |
? | Один любой символ | Шаблону К?к удовлетворяют, в частности строки Кок и Кук. |
# | Любая цифра от 0 до 9 | Шаблону Agent### соотвествуют 1000 различных строк, среди которых и Agent007, но, конечно же, не Agent Майор Пронин. |
[множество_символов] | Любой символ, принадлежащий множеству | Задать множество можно с помощью перечисления и интервалов. Шаблону К[аоу]к удовлетворяют слова "Как", "Кок", "Кук". Чувствительность к регистру зависит от установки опции Option Compare. |
[!множество_символов] | Любой не принадлежащий множеству символ | Шаблону [!а-я] удовлетворяет символ, не являющийся буквой русского алфавита. |
Приведем пример работы с операцией Like:
Public Sub LikeOperation() Const pat1 = "[A-Z]" Const pat2 = "[a-z]" Const pat3 = "[!a-z]" Const pat4 = "[3-5]" Dim res As Byte Dim Sym As String res = "Кук" Like "К[аоу]к" Debug.Print res res = "f" Like pat1 Debug.Print res res = "f" Like pat2 Debug.Print res res = "f" Like pat3 Debug.Print res res = "5" Like pat4 Debug.Print res Sym = "3" res = Sym Like pat1 & pat4 Debug.Print res res = Sym Like pat1 Or Sym Like pat4 Debug.Print res End Sub8.1.
Вот результаты отладочной печати:
255 0 255 0 255 0 255
Обратите внимание на последние два результата, демонстрирующие некорректный и корректный способы работы с объединением множеств проверяемых символов.
Основные операции над строками
В классической математике давным - давно определен набор основных операций над числовыми и булевыми данными. Строковой арифметикой серьезно стали заниматься с появлением компьютеров. Жесткий стандарт на эти операции еще не сложился. Как правило, во всех языках есть только одна операция, называемая конкатенацией строк, обозначаемая, обычно, символом "&". Все остальные основные операции реализуются с помощью встроенных функций, имена которых и их аргументы могут варьироваться от языка к языку. Более того, варьируется и сам набор этих операций. Минимально, помимо конкатенации необходимы еще две операции, первая из которых позволяет обнаружить индекс вхождения одной строки в другую, вторая - выделить из строки ее подстроку. VBA имеет достаточно мощный набор операций, который в Office 2000 существенно был расширен принципиально новыми возможностями. Рассмотрим вначале те операции, которые и ранее существовали в языке, а уж потом, чуть более подробно поговорим о новых возможностях.
Функция Len(string) возвращает длину строки, заданной аргументом String. Заметьте, возвращается число символов строки, а не число байтов. Ранее мы уже говорили, что в Office 2000 для внутреннего представления строк используется Unicode кодировка, в которой каждый символ занимает два байта.
Функция InStr определяет позицию (индекс) первого вхождения одной строки внутри другой строки. Синтаксис
InStr([start, ]string1, string2[, compare])
Необязательный аргумент start задает позицию, с которой начинается поиск (по умолчанию - с первого символа строки). Аргумент string1 задает строку, в которой выполняется поиск, а string2 - подстроку, вхождение которой ищется. Необязательный аргумент compare имеет тот же смысл, что и для функции StrComp. Возвращаемые значения определяются следующей таблицей.
Условия | Значение функции InStr |
---|---|
string1 - пустая строка | 0 |
string1 или string2 равны Null | Пустое значение - Null |
string2 - пустая строка | start |
Вхождение string2 не найдено в string1 | 0 |
Вхождение string2 найдено в string1 | Позиция обнаруженной подстроки |
start >Len(string2) | 0 |
Например, два вызова этой функции в окне отладки вернут следующие результаты:
? InStr(4, "XXпXXпXXПXXП", "П", 1) 6 ? InStr(4, "XXпXXпXXПXXП", "П", 0) 9
Функция Left(string, length) выделяет в строке string указанное число length символов слева, позволяя выделить префикс строки.
Функция Right(string, length) выполняет аналогичную операцию, выделяя символы справа, что позволяет получить суффикс (окончание) строки.
Более универсальная функция Mid(string, start[, length]) позволяет выделить из строки string подстроку длины length, начиная с позиции start.
Вот пример вызова этих функций непосредственно из окна отладки:
? VBA.Left("рококо",3) рок ? VBA.Right("рококо",3) око ? VBA.Mid("рококо",3,3) кок
Функции LTrim(string), RTrim(string), Trim(string) возвращают копию строки, из которой удалены пробелы, находившиеся в начале строки ( LTrim ), в конце строки ( RTrim ) или в начале и конце строки ( Trim ).
Функция String создает строку: содержащую заданное число повторяющихся символов.
Синтаксис:
String(number, character)
Аргумент number задает длину строки, а character - код символа или строковое выражение, первый символ которого используется при создании результирующей строки.
Функции LCase(string) и UCase(string) возвращают копию строки, символы которой приведены к нижнему ( Low ) или верхнему регистру ( Upper ).
Функции, возвращающие строки, существуют в двух вариантах, отличающихся именами. Функции, имена которых мы приводили, возвращают результат типа Variant. Во втором варианте имена функций оканчиваются знаком $, например, Mid$, UCase$. В этом случае результат возвращается типа String. Такие функции выполняются быстрее, но не могут корректно работать со строками, имеющими значение Null.
Приведем в качестве примера полезную функцию, которая находит путь к активному документу Word, и производит разбор всех компонент этого пути:
Public Function AppPath(Disk As String, Dir As String, FileName As String) As String 'Эта Функция возвращает в качестве результата полный путь активного документа 'Ее параметры содержат компоненты этого пути - имя диска, каталог на диске и имя файла Dim MyDoc As Document Dim Path As String Dim Start As Byte, Finish As Byte 'Определяем полный путь к файлу, задающему активный документ Word Set MyDoc = ActiveDocument Path = MyDoc.FullName 'Выделяем имя диска - первый символ полного пути Disk = VBA.Left(Path, 1) 'Выделяем каталог, в котором хранится документ Start = VBA.InStr(1, Path, "\") Finish = VBA.InStrRev(Path, "\") Dir = VBA.Mid(Path, Start + 1, Finish - Start) 'Выделяем имя файла FileName = VBA.Mid(Path, Finish + 1) 'Возвращается результат - полный путь к каталогу AppPath = VBA.Left(Path, Finish) End Function Public Sub MyPath() Dim Path As String Dim Dir As String Dim Disk As String Dim FileName As String Path = AppPath(Disk, Dir, FileName) Debug.Print Disk, Dir, FileName, Path End Sub8.2.
Вот результаты отладочной печати после запуска процедуры MyPath:
E O2000\VBA2000\Ch8\ Ch8.doc E:\O2000\VBA2000\Ch8\
Обратите внимание, в функции AppPath мы использовали новую функцию InStrRev, что облегчило решение нашей задачи. К описанию вновь введенных функций мы и переходим.
Новые функции для работы со строками
В VBA 2000, как мы уже говорили, добавлены полезные функции для работы со строками.
Функция InStrRev - поиск последнего вхождения подстроки
Функция InStrRev симметрично дополняет функцию InStr, аналогично тому, как функция Right дополняет функцию Left. Эта функция ищет вхождение подстроки в строку, но начинает свою работу с правого конца строки. Ее использование может существенно ускорить работу, если заранее известно, что искомая подстрока находится где- то в конце строки - источника. Если вхождение искомой подстроки единственно, то обе функции дают один и тот же результат. При множественном вхождении функция InStr возвращает первое вхождение, в то время как InStrRev - последнее. Ее синтаксис:
InstrRev(stringcheck, stringmatch[, start[, compare]])
Ее параметры имеют тот же смысл, что и у функции InStr, но, заметьте, порядок их задания изменен. Необязательный параметр Start теперь задается третьим по счету. Когда он опущен, то по умолчанию, его значение равно "-1", и поиск начинается с последнего символа. Если вернуться к нашему последнему примеру, то для решения нашей содержательной задачи требовалось определить первое и последнее вхождение символа "\" в строке, задающей путь к файлу. Поэтому обе функции были весьма кстати. Нужно отметить, что это весьма типичная ситуация при разборах текста.