【问题标题】:VBA to replace the same letter with different valuesVBA用不同的值替换相同的字母
【发布时间】:2025-12-23 19:55:16
【问题描述】:

我正在尝试编写 vba 代码,该代码将在字符串中查找一个字母并将其替换为特定的单元格值。

问题是该字母在字符串中最多出现3次,每次都需要用不同的值替换。

示例字符串I have x and x and x

第一个 x 应该替换为 1,第二个替换为 2,第三个替换为 3。

到目前为止我的代码

for i = 0 to lim

range("B" & lim +13).Value = replace (range("B" & lim +13), "x",range("K" & lim +13).Value)

Next i

上面代码的问题是这会将每个x 替换为相同的值;我想按照特定的替换顺序来制作它。

理想情况下,第二个和第三个替换将来自我选择的不同单元格值。

【问题讨论】:

  • “x”在现实中是什么形式?
  • x 将被数值替换。
  • 你能在工作表上贴一些例子的快照吗?

标签: excel vba


【解决方案1】:

你可以使用Replace()函数:

Dim s As String
Dim i As Long

s = "I have x and x and x"
Do While InStr(s, "x") > 0
    i = i + 1
    s = Replace(s, "x", i, , 1)
Loop

所以你可以将它包装在一个函数中 :

Function Rep(s As String, x as string) As String
    Dim i As Long

    Do While InStr(s, x) > 0
        i = i + 1
        s = Replace(s, x, i, , 1)
    Loop
    Rep = s
End Function

使用如下:

range("B" & lim +13).Value = Rep(range("B" & lim +13).Value, "x")

【讨论】:

  • 很好的解决方案 HTH。
  • 您使用 Do 循环的方法简单、干净、优雅。
【解决方案2】:

试试拆分功能:

Sub XTest()
Dim s As String
s = "I have x and x and x"
Dim parts As Variant
parts = Split(s, "x")
Dim i As Long
For i = 0 To UBound(parts) - 1
    parts(i) = parts(i) & i + 1
Next i
s = Join(parts, "")
Debug.Print s
End Sub

【讨论】:

    【解决方案3】:

    将替换按顺序排列在一个数组中,然后为每个单元格将第一个“x”替换为第一个数组值,将第二个“x”替换为第二个数组值,依此类推。

    Dim newString As String, i As Long, j As Long, replacements As Variant
    
    For i = 0 To lim
    
        replacements = Array(1, 2, "some other value or cell", "4th replacement")
    
        newString = Range("B" & i + 13).value
    
        For j = 0 To UBound(replacements)
            If InStr(newString, "x") = 0 Then Exit For
            newString = Replace$(newString, "x", replacements(j), 1, 1)
        Next
    
        Range("B" & i + 13).value = newString
    
    Next
    

    (我在limRange insetad 中使用了i,因为lim 在你的for 循环中永远不会改变)

    【讨论】:

      最近更新 更多