Сначала дадим определение функции 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