使用VBA替换字符串中特定位置的文本

时间:2019-11-08 16:52:55

标签: excel vba

我想通过指定substring_a的位置和长度,用一个字符串中的另一个substring(substring_b)替换一个substring(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

我希望代码返回“长文本”,但返回“长文本”。

我该如何解决?

注意:上面是一个说明性示例。我不能直接在replace_text中使用Replace函数,因为在我的实际宏中,replacement_text是可变的。

3 个答案:

答案 0 :(得分:3)

您使一件简单的事情变得过于复杂。所需要的只是一个简单的替换。

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

要仅替换第一个匹配项,请使用此命令:

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 Replace Function

答案 1 :(得分:0)

如果使用Replace(),则很容易在VBA中替换字符串中的字符串。 无论如何,如果Replace()被省略,那么它将变得更加有趣。从理论上讲,字符串可以始终分为三部分:

  

第一部分-要替换的字符串-最后一部分

即使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

答案 2 :(得分:0)

以下是我的解决方法:

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的解决方案效率更高,但是上面的代码显示了如何在特定位置替换文本(这是我的实际用例所需要的)。