Заменить текст в определенной позиции в строке, используя VBA - PullRequest
1 голос
/ 08 ноября 2019

Я хочу заменить подстроку (substring_a) другой подстрокой (substring_b) в строке, указав позицию и длину substring_a.

Я пытаюсь использовать функцию Mid, но она не 'Кажется, что работает, если substring_b не равен или больше, чем substring_a

Вот мой код:

Sub Test_Mid()
Dim starting_text As String
Dim replacement_text As String

starting_text = "Long Starting Text"
replacement_text = "End"

Mid(starting_text, 6, 8) = replacement_text
MsgBox (starting_text)

End Sub

Я хочу, чтобы код возвращал "Long End Text", но вместо этого он возвращает "Long Endrting Text ".

Как это исправить?

Примечание. Выше приведен иллюстративный пример. Я не могу использовать функцию Replace напрямую с replace_text, потому что в моем реальном макросе replace_text является переменной.

Ответы [ 3 ]

3 голосов
/ 08 ноября 2019

Вы делаете простую вещь слишком сложной. Все, что нужно, - это простая замена.

starting_text = Replace(starting_text, "Starting", "End")

Чтобы заменить только 1-е вхождение, используйте это:

starting_text = Replace(starting_text, "Starting", "End", 1, 1)

Или, если это только одно вхождение, начиная с определенного места,используйте это:

starting_text = Replace(starting_text, "Starting", "End", Instr(starting_text, "Starting"), 1)

Или, если это только одно вхождение, начинающееся с определенного местоположения, и вы не хотите, чтобы оно чувствительно к регистру, используйте это:

starting_text = Replace(starting_text, "Starting", "End", Instr(starting_text, "Starting", vbTextCompare), 1, vbTextCompare)

Функция замены VBA

0 голосов
/ 08 ноября 2019

Ниже мое решение:

Sub Test_Mid()
Dim starting_text As String
Dim replacement_text As String
Dim replaced_text As String

starting_text = "Long Starting Text"
replacement_text = "End"

replaced_text = Mid(starting_text, 6, 8)
starting_text = Replace(starting_text, replaced_text, replacement_text)

MsgBox (starting_text)

End Sub

Примечание. Для примера кода, приведенного здесь, решение @ brax более эффективно, но этот код выше показывает, как заменить текст в определенной позиции (это то, что янужно для моего фактического использования).

0 голосов
/ 08 ноября 2019

Замена строки в строке в VBA очень проста, если используется Replace(). В любом случае, если пропустить Replace(), это становится более интересным. Теоретически, строку всегда можно разбить на 3 части:

Первая часть - строка для замены - Последняя часть

Даже когда FirstPart или / и LastPart с длиной 0, деление должно быть сделано. Затем, удалив StringToReplace из строки полностью и в ее положении, запишите новую строку. Позиция определяется с помощью IsStr. Его можно использовать как функцию, используя обработчики ошибок для возврата исходного выражения, если find не является частью строки:

Function Replace2(expression As String, find As String, replace As String) As String

    On Error GoTo replace2_Error

    Replace2 = expression        
    Dim position As Long: position = InStr(1, expression, find)
    Replace2 = Left(expression, position - 1)    
    Replace2 = Replace2 & Mid(expression, position + Len(find))
    Replace2 = Left(Replace2, position - 1) & _
                    replace & _
                    Right(Replace2, Len(Replace2) - position + 1)

    Exit Function

replace2_Error:
    Replace2 = expression    
End Function

И тесты функции:

Sub TestMe()

    Debug.Print Replace2("1", "", "")
    Debug.Print Replace2("1", "", "2")
    Debug.Print Replace2("", "3", "")
    Debug.Print Replace2("32", "a", "")
    Debug.Print Replace2("My Very Interesting Long Starting Text", "Starting", "Ending")
    Debug.Print Replace2("My Very Interesting Long Text Starting", "Starting", "Ending")
    Debug.Print Replace2("Starting My Very Interesting Long Text", "Starting", "Ending")

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...