Основные операции над строками
В классической математике давным - давно определен набор основных операций над числовыми и булевыми данными. Строковой арифметикой серьезно стали заниматься с появлением компьютеров. Жесткий стандарт на эти операции еще не сложился. Как правило, во всех языках есть только одна операция, называемая конкатенацией строк, обозначаемая, обычно, символом "&". Все остальные основные операции реализуются с помощью встроенных функций, имена которых и их аргументы могут варьироваться от языка к языку. Более того, варьируется и сам набор этих операций. Минимально, помимо конкатенации необходимы еще две операции, первая из которых позволяет обнаружить индекс вхождения одной строки в другую, вторая - выделить из строки ее подстроку. VBA имеет достаточно мощный набор операций, который в Office 2000 существенно был расширен принципиально новыми возможностями. Рассмотрим вначале те операции, которые и ранее существовали в языке, а уж потом, чуть более подробно поговорим о новых возможностях.
Функция Len(string) возвращает длину строки, заданной аргументом String. Заметьте, возвращается число символов строки, а не число байтов. Ранее мы уже говорили, что в Office 2000 для внутреннего представления строк используется Unicode кодировка, в которой каждый символ занимает два байта.
Функция InStr определяет позицию (индекс) первого вхождения одной строки внутри другой строки. Синтаксис
InStr([start, ]string1, string2[, compare])
Необязательный аргумент start задает позицию, с которой начинается поиск (по умолчанию - с первого символа строки). Аргумент string1 задает строку, в которой выполняется поиск, а string2 - подстроку, вхождение которой ищется. Необязательный аргумент compare имеет тот же смысл, что и для функции StrComp. Возвращаемые значения определяются следующей таблицей.
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, и производит разбор всех компонент этого пути:
Пример 8.2.
(html, txt)
Вот результаты отладочной печати после запуска процедуры MyPath:
E O2000\VBA2000\Ch8\ Ch8.doc E:\O2000\VBA2000\Ch8\
Обратите внимание, в функции AppPath мы использовали новую функцию InStrRev, что облегчило решение нашей задачи. К описанию вновь введенных функций мы и переходим.
'Определяем полный путь к файлу, задающему активный документ 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 Sub
Пример 8.2.
Вот результаты отладочной печати после запуска процедуры MyPath:
E O2000\VBA2000\Ch8\ Ch8.doc E:\O2000\VBA2000\Ch8\
Обратите внимание, в функции AppPath мы использовали новую функцию InStrRev, что облегчило решение нашей задачи. К описанию вновь введенных функций мы и переходим.