Особенности функции Replace |
Автор Joss | ||||||
10.07.2019 г. | ||||||
То, о чём скромно умалчивают справочники, а Микрософт сообщает мелким шрифтом в примечании.
На написание этой статьи меня натолкнул пользователь Панург с сайта SQL.RU.
Сначала дадим определение функции Replace по справочнику. Назначение функции Replace Возвращает строку, в которой указанная подстрока заданное число раз заменена другой подстрокой. Replace( _ ByVal Expression As String, _ ByVal Find As String, _ ByVal Replacement As String, _ Optional ByVal Start As Integer = 1, _ Optional ByVal Count As Integer = -1, _ Optional ByVal Compare As vbCompareMethod = vbBinaryCompare _ ) As String Параметры Expression - Обязательный параметр. Строковое выражение, содержащее замещаемую подстроку. Find - Обязательный параметр. Подстрока, которую требуется найти. Replacement - Обязательный параметр. Подстрока для замены. Start - Необязательный параметр. Позиция внутри строки Expression, с которой начинается поиск подстроки. Если этот аргумент опущен, используется значение 1. Count - Необязательный параметр. Число выполняемых замен подстроки. Если этот аргумент опущен, по умолчанию принимается значение –1, указывающее, что следует произвести все возможные замены. Compare - Необязательный параметр. Числовое значение, которое указывает вид сравнения, выполняемого при оценке подстрок. Возможные значения см. в разделе "Параметры". Аргумент Compare может принимать следующие значения: vbBinaryCompare - Выполняется двоичное сравнение. vbTextCompare - Выполняется текстовое сравнение. vbDatabaseCompare - - используется только в Microsoft Access, задает сравнение строк на основе порядка сортировки, определяемого национальной настройкой базы данных Функция Replace возвращает следующие значения. Если Find имеет нулевую длину или Nothing - копия Expression Если Replace имеет нулевую длину - копия Expression без вхождений Find Если Expression либо имеет нулевую длину, либо значение Nothing - Nothing Если значение Start больше длины выражения Expression - Nothing Если Count равно 0 - копия Expression Исключения Значение параметра Count < -1 или Start <= 0 вызывает Err 5 - Вызов процедуры или аргумент не является допустимым А теперь главное! То о чём не пишут в справочниках! Значение, возвращаемое функцией Replace является строкой, которая начинается с позиции, указанной параметром Start, и завершается в конце строки Expression, с заменой подстрок Find значениями Replace. Это предложение находится в конце описания функции Replace под скромным заголовком Заметки Это совсем не то (или не совсем то), что мы ожидаем прочитав описание функции. Темой обсуждения послужил следующий код Панурга Replace ("1011112", "1", "2", 5, 1)выдаёт 212, а надо 1011212 В результате обсуждения я написал свою функцию Replace '--------------------------------------------------------------------------------------- ' Procedure : fnReplace ' Author : Joss ' Date : 26.12.2016 ' Purpose : Подмена стандартной функции Replace '--------------------------------------------------------------------------------------- ' Public Function fnReplace(ByVal Expression, ByVal Find, ByVal Replacement, _ Optional ByVal Start As Integer = 1, Optional ByVal Count As Integer = -1, _ Optional ByVal Compare As VbCompareMethod = vbBinaryCompare) As String On Error GoTo fnReplace_Error If IsNull(Expression) Then fnReplace = "" Exit Function End If If IsNull(Find) Then fnReplace = Expression Exit Function End If If IsNull(Replacement) Then fnReplace = Expression Exit Function End If If Len(Expression) < Start Then fnReplace = Expression Exit Function End If If Count < -1 Then fnReplace = Expression Exit Function End If If Start <= 1 Then fnReplace = Replace(Expression, Find, Replacement, Start, Count, CompareMethod) Exit Function End If If Start > 1 Then fnReplace = Left(Expression, Start - 1) & Replace(Expression, Find, Replacement, Start, Count, CompareMethod) Exit Function End If On Error GoTo 0 Exit Function fnReplace_Error: MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure fnReplace" End Function
Просмотров: 1348
|