Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСНОВЫ ОФИСНОГО ПРОГРАММИРОВАНИЯ И ЯЗЫК VBA - 2....doc
Скачиваний:
79
Добавлен:
17.12.2018
Размер:
1.62 Mб
Скачать

Новые функции для работы со строками

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

Функция InStrRev - поиск последнего вхождения подстроки

Функция InStrRev симметрично дополняет функцию InStr, аналогично тому, как функция Right дополняет функцию Left. Эта функция ищет вхождение подстроки в строку, но начинает свою работу с правого конца строки. Ее использование может существенно ускорить работу, если заранее известно, что искомая подстрока находится где- то в конце строки - источника. Если вхождение искомой подстроки единственно, то обе функции дают один и тот же результат. При множественном вхождении функция InStr возвращает первое вхождение, в то время как InStrRev - последнее. Ее синтаксис:

InstrRev(stringcheck, stringmatch[, start[, compare]])

Ее параметры имеют тот же смысл, что и у функции InStr, но, заметьте, порядок их задания изменен. Необязательный параметр Start теперь задается третьим по счету. Когда он опущен, то по умолчанию, его значение равно "-1", и поиск начинается с последнего символа. Если вернуться к нашему последнему примеру, то для решения нашей содержательной задачи требовалось определить первое и последнее вхождение символа "\" в строке, задающей путь к файлу. Поэтому обе функции были весьма кстати. Нужно отметить, что это весьма типичная ситуация при разборах текста.

Функция Replace - замена всех вхождений подстроки

Это удивительно, что в наборе встроенных функций не было до сих пор функции Replace. Замена одной подстроки на другую - это одна из основных операций при работе со строками. Поэтому в арсенале практически каждого из программистов была своя версия функции Replace. Теперь можно пользоваться стандартной реализацией. Ее несомненным достоинством является то, что она позволяет заменить не только первое вхождение искомой подстроки, но и все такие вхождения, не требуя организации цикла. С другой стороны, можно ограничиться только заменой первого или нескольких первых вхождений. Рассмотрим синтаксис появившейся функции:

Replace(expression, find, replace[, start[, count[, compare]]])

Первый аргумент expression задает строковое выражение, результат которого определяет строку - источник, в которой осуществляется замена. Аргументы find и Replace задают заменяемую подстроку и ее новое значение. Аргумент Count определяет число замен. Обычно он равен 1, когда речь идет о замене первого вхождения, или опускается, - в этом случае его значение по умолчанию равно "-1", означающее замену всех вхождений. Аргумент compare имеет обычный смысл.

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

Public Sub Rep()

'Эта процедура преобразует выделенный программный текст

'Заменяя пробелы табуляцией и конец абзаца мягким концом строки

Dim TxtRange As String

TxtRange = Selection.Range.Text

'Замена пробелов: 4-х, 3-х и 2-х символом табуляции

TxtRange = Replace(TxtRange, " ", vbTab)

TxtRange = Replace(TxtRange, " ", vbTab)

TxtRange = Replace(TxtRange, " ", vbTab)

'Замена концов абзаца

Selection.Range.Text = Replace(TxtRange, VBA.Chr(13), VBA.Chr(11))

End Sub

Несмотря на всю полезность функции Replace нам пришлось написать еще одну собственную модификацию этой функции. Дело в том, что у Replace есть одна особенность, на которую следует обратить внимание, - возвращаемый ею результат, начинается не с первой позиции, а с позиции, заданной аргументом Start. Так что помимо своей основной роли она еще обрубает голову строки, если только Start, отличается от 1. Поскольку замену зачастую нужно производить не с самого начала, а получать хочется полную строку, то мы написали свой вариант этой функции. Приведем его текст:

Public Function MyReplace(ByVal Expr As String, ByVal find As String, _

ByVal rep As String, Optional ByVal start As Long = 1, Optional

ByVal count As Long = -1, _

Optional ByVal compare As VbCompareMethod = vbBinaryCompare) As String

'Вызов стандартной функции Replace

If start = 1 Then

MyReplace = replace(Expr, find, rep, start, count, compare)

Else

MyReplace = VBA.Left(Expr, start - 1) & replace(Expr, find,

rep, start, count, compare)

End If

End Function

Вот результаты нескольких вызовов Replace и MyReplace в окне отладки:

? Replace("A+B *(D*B +B)","B","C",4,1)

*(D*C +B)

? MyReplace("A+B *(D*B +B)","B","C",4,1)

A+B *(D*C +B)

? MyReplace("A+B *(D*B +B)","B","C",4)

A+B *(D*C +C)