Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Работа со строками.docx
Скачиваний:
25
Добавлен:
26.09.2019
Размер:
66.22 Кб
Скачать

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

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

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

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

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

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

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

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

В качестве примера приведем функцию Rep. При копировании программного текста в документ 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 есть одна особенность, на которую следует обратить внимание, - возвращаемый ею результат, начинается не с первой позиции, а с позиции, заданной аргументом 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)