Особенности функции 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



Ссылка на описание функции в SDN - https://msdn.microsoft.com/ru-ru/library/bt3szac5(v=vs.90).aspx
Ссылка на топик из которого родилась эта статья - http://www.sql.ru/forum/1243319/zamena-simvola-v-stroke

 


Просмотров: 256

  Ваш коментарий будет первым

Добавить коментарий
Имя:
E-mail
Коментарий:



Код:* Code