Примеры работы со строками в vba. Примеры использования функций VBA. Символ из списка или отсутствие символа
Функция InStr
InStr(String1,String2[,Compare])InStrB(String1,String2[,Compare])
Функция InStr (In Str ing) служит для поиска номера символа(номера байта для InStrB ), с которого начинается в заданной строке образец поиска. Поиск идет от указанной позиции слева направо. Поиск вхождения одной строки в другую весьма часто используемая операция. Нумерация символов всегда начинается с единицы
ПримечаниеВ функции InStr при очень длинных строках при текстовом методе сравнения, возможно возникновение ошибки времени исполнения Stack overflow. Избежать этой ошибки можно, переведя исходную строку и образец в один регистр и перейдя на бинарное сравнение
Возвращаемое значениеВозвращает значение типа Variant(Long) , указывающее позицию первого появления одной строки внутри другой
Перечень возвращаемых значений| Вариант | Значение, возвращаемое функцией InStr |
| String1 имеет нулевую длину | 0 |
| String1 имеет значение Null | Null |
| String2 имеет нулевую длину | Start |
| String2 имеет значение Null | Null |
| String2 не найдена | 0 |
| String2 найдена внутри String1 | Позиция, в которой обнаружено совпадение |
| Start > String2 | 0 |
Параметры
| Элемент | Описание |
| Start | Необязательный. Числовое выражение, которое задает первую позицию для каждого поиска. Если параметр опущен, поиск начинается с позиции первого символа. В том случае, когда значение параметра Start Параметр Start является обязательным, если задан параметр Compare |
| String1 | Обязательный. Строковое выражение,в котором ведется поиск |
| String2 | Обязательный. Отыскиваемое строковое выражение |
| Compare | Необязательный. Задает тип сравнения для строк. Если значение параметра Compare равно Null, возникает ошибка. В том случае, когда параметр Compare опущен,тип сравнения определяется установками оператора Option Compare |
Установки
Для параметра Compare используются следующие установки:
Пример " В данном примере функция InStr " возвращает позицию первого появления " одной строки внутри другой строки Dim SearchString, SearchChar, MyPos SearchString ="Русский_Проект" " Исходная строка SearchChar = "Р" " Следует найти "P" " Посимвольное сравнение, начиная с позиции 4. Возвращает 10 MyPos = Instr (4, SearchString, SearchChar, vbTextCompare) " Двоичное сравнение, начиная с позиции 1. Возвращает 1 MyPos = Instr (1, SearchString, SearchChar, 0) " Сравнение является двоичным по умолчанию (последний аргумент опущен) MyPos = Instr (SearchString, SearchChar) " Возвращает 1 MyPos = Instr (1, SearchString, "W") " Возвращает 0 Категория
Буквы от ‘A’ до ‘Z’ следуют в возрастающем порядке, иными словами, каждая буква имеет порядковое значение, соответствующее ее месту в алфавите. Это порядковое значение может быть получено посредством функции ord
.
ord(выражение)
– возвращает порядковый номер литеры или значения другого дискретного типа.
ord(‘I’), ord(‘J’). Результат: 73, 74 (код ASCII)
Порядковый номер литеры зависит от используемого кода. Но, независимо от используемого кода, порядковые значения букв следуют по возрастанию:
ord(‘A’) < ord(‘B’) < ord(‘C’) … < ord(‘Z’)
хотя ord(‘Z’) – ord(‘A’) и не обязательно равно 25. То же самое и со строчными буквами:
ord(‘a’) < ord(‘b’) < ord(‘c’) … < ord(‘z’)
Определенной связи между прописными и соответствующими строчными буквами нет, но можно без опасений полагаться на то, что ord(‘a’) – ord(‘A’) имеет то же значение, что и ord(‘z’) – ord(‘Z’).
Независимо от используемого кода, порядковые значения цифр также расположены по возрастанию:
ord(‘0’) < ord(‘1’) < ord(‘2’) … < ord(‘9’)
и, более того, порядковые значения соседних цифр отличаются на 1; так, ord(‘9’) – ord(‘0’) = 9. Отсюда следует, что численное значение цифры d (типа char) может быть получено так
value:= ord(d) – ord(‘0’).
Паскаль поддерживает типы char, integer
и т.д. В дополнение к ним программист вправе определить и другие типы путем перечисления последовательности констант. Например, тип, заданный перечислением:
type days = (mon, tue, wed, thu, fri, sat, sun);
Константы типа, заданного перечислением, имеют порядковые значения, отсчитываемые от нуля. Например, ord(mon) возвращает 0, ord(sun) возвращает 6; mon < sun.
Тип boolean
– перечисляемый тип, который автоматически задается как
type boolean = (false, true);
следовательно, ord(false) дает 0, ord(true) дает 1; false < true.
Функция chr
Обратной для ord
является функция chr
.
chr(выражение)
– возвращает литеру, порядковое значение которой задается параметром; неправильное значение влечет ошибку.
chr(73), chr(74). Результат: I, J (кодировка ASCII)
chr(1000). Результат: ошибка
Функции succ и pred
Порядковые значения редко бывают нужны сами по себе. Часто достаточно знать следующий или предыдущий элемент в установленном порядке. Для этой цели служат функции succ
и pred
.
succ(выражение)
– возвращает элемент, следующий за тем, который указан в качестве параметра.
succ(‘A’), succ(‘0’), succ(0). Результат: B, 1 (символ), 1 (число)
succ(false). Результат: true
pred(выражение)
– возвращает элемент, предшествующий тому, который указан в качестве параметра.
pred(‘Z’), pred(‘9’), pred(9). Результат: Y, 8 (символ), 8 (число)
pred(true). Результат: false
Эти две функции можно использовать для определения следующих и предшествующих элементов для типа, заданного перечислением. Возьмем тип days , определенный ранее: pred(sun) возвращает sat, succ(mon) возвращает tue.
Однако было бы неверно писать writeln(pred(sun)), поскольку элементы перечисляемого типа нельзя читать или печатать, что, конечно, снижает выгоду от использования таких типов. Наилучшее приближение к writeln(pred(sun) – это оператор writeln(ord(pred(sun))), печатающий число 5 (порядковое значение элемента sat).
Работа со строками
В VBA имеется довольно богатая коллекция операторов и функций для форматирования строк и извлечения тех их частей, которые вы сочтете особенно привлекательными. В табл. 11.3 я представил все относящиеся к строкам команды, которые мне удалось обнаружить.
Таблица 11.3. Операторы и функции для обработки строк
Не забывайте, что буквальные строковые значения (в отличие от переменных, содержащих строковые значения) должны заключаться в кавычки.
|
Оператор или функция |
||
|
Asc (строка) |
Числовой код первого символа в строке |
|
|
Chr (код_символа) |
Символ, соответствующий значению параметра код_символа |
|
|
Filter (массив_источник, эталон, включает, метод сравнения) |
Функция (только в VBA6) |
Массив, состоящий только из тех строк из массива источника, которые содержат эталон. Аргумент массив_истчник должен быть массивом строковых значений. Если необязательный аргумент включает равен False, то функция возвратит только строки, которые не включают эталон |
|
Format (строка) |
См. выше раздел "Форматирование данных" |
|
|
Hex (число) |
||
|
InStr (старт, строка1, строка2) |
Число, соответствующее позиции строки 2 в строке 1; поиск начинается с позиции старт, этот аргумент не обязателен |
|
|
InStrRev (строка 1, строка2, старт) |
функция (только в VBA6) |
Число, соответствующее позиции строки 2 в строке 1, считая с правого края строки 1; поиск начинается с позиции старт, этот аргумент не обязателен |
|
Join (массив_строк, разделитель) |
функция (только B VBA6) |
Одна строка, комбинирующая все строки из массив_строк, который должен быть массивом строковых данных. По умолчанию Join вставляет пробел между строками, взятыми из массива строк, но можно задать и другой символ разделителя (символ необходимо заключить в кавычки) |
|
Left (строка, длина) |
Строка указанной длины из символов, взятых подряд из строки, задаваемой аргументом строка, начиная с левого края последней |
|
|
Len (строка) |
Число символов в строке |
|
|
LCase (строка) |
Копия строки, представленная символами нижнего регистра |
|
|
LSet строковая_ переменная = строка |
Оператор |
Устанавливает значение строковой переменной, равное заданной строке, без изменения длины этой строковой переменной и с размещением заданной строки начиная с левого края переменной |
|
LTrim (строка) |
Новая строка, содержащая копию данной строки без пробелов в начале |
|
|
Mid(строка, старт, длина) |
Новая строка заданной длины из символов данной строки, взятых подряд, начиная с позиции старт |
|
|
Mid(строковая переменная, старт, длина) = строка |
Оператор |
Начиная с позиции старт заменяет символами данной строки заданное аргументом длина число символов в строковой переменной |
|
Replace(строка, найти, заменить, старт, число_замен, метод_сравнения) |
Функция (только в VBA6) |
Новая строка, получаемая в результате замены в заданной строке текста найти текстом заменить. Аргументы старт, число_замен и метод_сравнения не обязательны. Используйте число_замен, чтобы указать, сколько замен следует сделать, если текст найти встречается несколько раз (по умолчанию заменяются все случаи появления текста найти в строке) |
|
Right (строка, длина) |
Строка указанной длины из символов, взятых подряд из строки, задаваемой аргументом строка, начиная с правого края последней |
|
|
RSet строковая_ переменсная = строка |
Оператор |
Устанавливает значение строковой переменной, равное заданной строке, без изменения длины этой строковой переменной и с размещением заданной строки с правого края переменной |
|
RTrim (строка) |
Новая строка, содержащая копию данной строки без пробелов в конце |
|
|
Space (число) |
Строка, состоящая из указанного числа пробелов |
|
|
Split(строка, разделитель, предел, метод сравнения) |
Функция (только B VBA6) |
Массив строк, полученный в результате разделения в заданной строки. По умолчанию оригинальная строка разделяется по пробелам, но можно задать разделитель, отличный от пробела (для задания разделителя используйте символ, заключенный в кавычки). Необязательный аргумент предел задает максимальное число строк в возвращаемом массиве |
|
StrComp(строка1, строка2) |
О, если две строки равны; -1,если строка 1 меньше, чем строка 2; 1, если строка! больше, чем строка 2 (о сравнении строк говорилось в главе 9) |
|
|
StrConv(строка, метод перевода) |
Новая строка, созданная на основе заданной указанным методом перевода |
|
|
String(число, символ) |
Строка, состоящая из заданного числа повторяющихся символов |
|
|
StrReverse (строка) |
Функция(только VBA 6) |
|
|
Trim(строка) |
Новая строка, содержащая копию данной строки без пробелов в начале и конце |
|
|
UCase(строка) |
Копия строки, представленная символами верхнего регистра |
Не расстраивайтесь, если не обнаружите строковую функцию, которая делает в точности то, что вам нужно. Воспринимайте эти функции как строительные блоки - часто для достижения нужного результата эти функции приходится вкладывать одну в другую.
Представим, например, что у вас есть список полных имен в виде следующих строк:
"Самодур, Иван Акакиевич, акад."
"Невеселый, Степан Федорович, проф."
"Шутник, Василий Степанович, канд."
(такой список должен храниться в массиве строк; массивы будут рассматриваться в главе 13).
Предположим, что кто-то заставил вас убрать звания в конце каждой из вышеприведенных строк. Имена в списке имеют разную длину, так что готовые функции задачу не решают.
Но если предположить, что оригинальное имя содержится в переменной str-Старая, то поможет следующий трюк:
strНовая = Left(strСтарая, Len(strСтарая) - 7)
Если бы VBA читал книги вместо программного кода, я объяснил бы ему, что эти действия можно выполнить следующим образом.
1. Сначала вызывается функция Len, которая вычисляет длину оригинальной строки.
2. Из результата, полученного в п. 1, вычитается 7, поскольку каждое из званий занимает семь символов в конце строки (включая запятую и пробел).
В результате получится число, которому должна быть равна длина новой строки.
3. Вызывается функция Left, использующая вычисленную длину в качестве значения второго аргумента.
Функция Left читает столько символов, сколько задано вторым аргументом, из строки, указанной первым аргументом, возвращая только эти прочитанные символы.
4. Новая, более короткая строка, возвращенная функцией Left, присваивается переменной
Продолжая работать с новым списком уже без званий, предположим, что теперь вас попросили извлечь имена с отчествами и поместить их в новый список. Эту задачу можно выполнить с помощью следующего оператора:
strMMfl = Mid (strHoBafl, InStr (str-Новая, ",") + 2)
Функция Mid извлекает символы из любого места в строке, которую вы укажете в виде аргумента. Второй же аргумент этой функции говорит, с какого места в этой строке следует начать извлечение символов. В данном случае этот аргумент представляет собой выражение, состоящее из функции InStr плюс 2.
Функция InStr ищет в заданной строке (первый аргумент) другую строку (второй аргумент).
В данном случае второй аргумент - это запятая, которая в списке следует за фамилией. Значение, которое возвращает InStr, соответствует номеру позиции в первой строке, где встречается вторая строка, - теперь вы знаете, где заканчивается фамилия.
К значению, возвращенному функцией InStr, добавляется 2, чтобы пропустить запятую и следующий за ней пробел и найти позицию, с которой начинается имя. Теперь функция Mid извлечет символы, начиная с этого места и до конца строки (поскольку не указан третий, необязательный аргумент длина).
В реальном программировании работе с датами и временем отводится далеко не последняя, а часто и главная роль. Поэтому VBA предлагает ряд операторов и функций, позволяющих выяснить текущие время и дату, проводить вычисления с датами и извлекать из переменных со значениями дат различные компоненты типа времени, года или дня недели.
В табл. 11.4 представлено описание таких команд. У некоторых функций в этой таблице опущены необязательные аргументы - вы всегда сможете уточнить детали по справке VBA.
После таблицы несколько наиболее важных команд, относящихся к датам и времени, рассматриваются подробнее.
Чтобы воспользоваться предоставляемым здесь материалом, вы должны ясно представлять, как VBA обрабатывает значения дат и времени и как работать с переменными, хранящими даты (см. главу 7).
Таблица 11.4. Операторы и функции для работы с датами и временем
При задании аргументов не забывайте заключать буквальные значения дат в пару символов #, а строковые значения типа интервалов дат - в кавычки.
|
Выполняемые действия (для операторов) или возвращаемые значения (для функций) |
||
|
Текущая системная дата |
||
|
Оператор |
Устанавливает системную дату по значению аргумента дата |
|
|
DateAdd (интервал, число, дата) |
Новое значение даты, равное сумме исходной даты и казенного числа заданных интервалов даты или времени |
|
|
DateDiff (интервал, дата1, дата2) |
Число указанных интервалов даты или времени, помещающихся в отрезке времени между датами 1 и 2 |
|
|
DatePart (интервал, дата) |
Целое значение, представляющее указанный интервал даты |
|
|
DateSerial (год, месяц, день) |
Значение даты, определяемое аргументами год, месяц, день, которые должны быть числовыми |
|
|
DateValue (строка с датой) |
Значение даты, соответствующее строке с датой |
|
|
Целое значение, соответствующее дню месяца, заданного датой |
||
|
Hour (время) |
Целое значение между 0 и 23 включительно, представляющее час суток, заданный указанным временем |
|
|
Minute (время) |
Целое значение между 0 и 59 включительно, представляющее минуты, заданные указанным временем |
|
|
Month (дата) |
Целое значение между 0 и 12 включительно, представляющее месяц, заданный указанной датой |
|
|
MonthName (месяц, сократить) |
Функция (только в VBA 6) |
|
|
Значение, представляющее текущие системные дату и время |
||
|
Second(время) |
Целое значение между 0 и 59 включительно, представляющее секунды, заданные указанным временем |
|
|
Значение, представляющее текущее системное время |
||
|
Time (время) |
Оператор |
Устанавливает системное время по значению аргумента время |
|
Число секунд, прошедших с полуночи |
||
|
TimeSerial (часы, минуты, секунды) |
Значение времени, заданное аргументами часы, минуты, секунды |
|
|
TimeValue (строка_с_временем) |
Значение времени, соответствующее строке со временем (вся информация о дате будет отброшена) |
|
|
Weekday (дата) |
Целое число, представляющее день недели, соответствующий указанной дате |
|
|
(день_не дели, сократить, первый день недели) |
VBA 6) быть целым числом от 1 до 7. Если необязательный аргумент с о к р а т и т ь указан и равен True, то возвращаемая строка будет содержать сокращенное название дня недели. Нумерацию дней недели можно менять, задавая необязательный аргумент первый _ день _ недели равным константам типа vbMonday, vbTuesday и т.д. |
|
|
Целое число, представляющее год, соответствующий указанной дате |
В VBA есть несколько простых операторов и функций для работы с системной датой и системным временем, т.е. со значением даты и времени, которое изменяется и хранится встроенными часами компьютера.
Функция Now возвращает текущие системные дату и время в формате переменной типа Data, как, например, в случае datЛовиМомент = Now.
Чтобы обеспечить работу с системным временем и системной датой по отдельности, VBA предлагает по паре отдельных команд для каждого из этих двух элементов системы. Несколько неожиданным при этом оказывается то, что в каждой из пар и оператор, и функция имеют одинаковые имена.
Например, чтобы извлечь (т.е. получить) системное время в формате даты VBA, нужно использовать функцию Time, а чтобы установить (т.е. задать) системное время, необходимо использовать оператор Time. Другими словами, ключевое слово Time выполняет различные действия в зависимости от контекста:
datЭтоMoeBpeмя = Time " функция Time возвращает значение
" системного времени
Time (113:15 АМ#) " оператор Time устанавливает системное время
Подобным образом работают и различаются соответствующие функции Date и оператор Date.
Итак, продолжаем наши уроки Паскаль для начинающих. В прошлом уроке мы разобрали , но там мы упомянули про символы, поэтому прежде чем глубоко изучать тип данных , мы узнаем о типе Char. Символьный тип данных Char — тип данных, значениями которого являются одиночные символы. Данный тип может содержать всего один любой символ (Например: «*», «/», «.», «!» и другие). Каждый такой символ занимает 8 бит памяти, всего существует 256 восьмибитовых символов. Все символы, используемые символьным типом Char записаны в таблице символов ASCII (American Standart Code for Information Interchange) или Американский стандарт кода для обмена информацией.
Символьные константы заключаются в апострофы, например ".", "*", "7", "s". Также символьную константу можно записать с помощью символа — «решетки», например #185 — выведет символ под номером 185 из таблицы ASCII (это символ "№").
К символьному типу применимы 5 функций: Ord, Chr, Pred, Succ и Upcase.
Функция Ord преобразовывает символ в её числовой код из таблицы ASCII . Например для символа "№" она возвратит значение 185. Функция Chr обратна функции Ord. Функция Chr преобразует числовой код символа в сам символ, например, если взять числовой код 64, то функция Chr (64) возвратит символ "@".
Пример программы на Паскаль с использованием функции Ord:
Begin //Начало программы
writeln (ord (x)); //Вывод номера в таблице ASCII
end. //Конец программы
Пример программы на Паскаль с использованием функции Chr:
Var x:integer; // Описание переменных (x - целочисленный тип)
Begin //Начало программы
readln (x); //Считывание переменной
writeln (chr (x)); //Вывод символа по номеру в таблице ASCII
end. //Конец программы
Функция Pred возвращает значение предыдущего символа из таблицы ASCII, например для символа "P" (Pred (P)) эта функция возвратит символ "O". Функция Succ обратная функции Pred. Для символа "P" функция Succ (P) возвратит символ "Q", то есть следующий символ из вышеописанной таблицы ASCII.
Пример программы на Паскаль с использованием функций Pred и Succ:
Var x:char; // Описание переменных (x - символьный тип)
Begin //Начало программы
readln (x); //Считывание переменной
writeln (pred (x)); //Вывод предыдущего символа в таблице ASCII
writeln (succ (x)); //Вывод следующего символа в таблице ASCII
end. //Конец программы
Функция UpCase применима только для строчных букв английского алфавита. Данная функция преобразует строчные английские буквы в заглавные.
Пример программы на Паскаль с использованием функции UpCase:
Приложение к уроку - таблицы символов ASCII:


На сегодня урок окончен. Помните, что программирование на паскале просто и является основой для многих языков программирования.
ChrФункция Chr
Chr(CharCode)Chr$(CharCode)
ChrB(CharCode)
ChrW(CharCode)
Функция Chr (Ch aracter )позволяет получить символ по значению его числового кода ANSI или Unicode
Возвращаемое значениеФункции Chr , ChrB , ChrW возвращают значение субтипа String типа Variant , содержащее символ, соответствующий указанному коду символа ANSI или Unicode. Функции Chr$ , ChrB$ , ChrW$ возвращают соответственно значение типа String
ПримечаниеChr
и Chr$
возвращают символ по его кодировке в стандарте ANSI
ChrB
и ChrB$
возвращают однобайтовую
строку
ChrW
возвращает символ Unicode, однако в системах, не поддерживающих Unicode, ее поведение аналогично Chr
Использование в параметре CharCode
значения больше, чем 255, генерирует ошибки стадии выполнения 5: Invalid procedure call or argument или 6: Overflow


