Excel VBA:用值替换整个单元格

时间:2017-08-15 12:14:09

标签: excel vba excel-vba

你能帮我解决通过单元格A3:A50并用新值替换整个单元格的循环。

以下参考:

[ita-IT] IT

[jpn] JA

[por-BR] PTBR

[spa-ES] ES

感谢您的提示!

2 个答案:

答案 0 :(得分:3)

尝试:

Sub ReplaceValues()
    Dim r As Range
    Dim v() As Variant
    Dim i As Integer

    v = [{"ita-IT","IT";"jpn","JA";"por-BR","PTBR";"spa-ES","ES"}]


    Set r = ActiveSheet.Range("A3:A50")

    For i = LBound(v) To UBound(v)
        r.Replace what:=v(i, 1), replacement:=v(i, 2), lookat:=xlWhole, MatchCase:=False
    Next i
End Sub

编辑: 有50个(或更多)替换对没有问题,但通过将它们存储在工作簿中的表中而不是将它们列在VBA数组中,这将更容易管理:

Table of replacement values

您可以使用通配符替换在查找值之前/之后具有文本的单元格内容。因此,结合这些更改,您的代码现在变为:

Sub ReplaceValues2()
    Dim r As Range
    Dim v() As Variant
    Dim i As Integer

    v = Sheet1.ListObjects("tbReplacement").DataBodyRange

    Set r = ActiveSheet.Range("A3:A50")

    For i = LBound(v) To UBound(v)
        r.Replace What:="*" & v(i, 1) & "*", Replacement:=v(i, 2), LookAt:=xlWhole, MatchCase:=False
    Next i
End Sub

答案 1 :(得分:1)

这是一种方法。如果你有很多代码需要替换,它可能看起来像意大利面条,如果有替换的逻辑,那么构建逻辑会很好,但是它会按照你的要求做,而且我希望是可读的。

Sub ReplaceStrings()
Dim result As String

For Each myCell In Range("A3:A50")
Select Case myCell.Value
  Case "[ita-IT]"
    result = "IT"
  Case "[jpn]"
    result = "JA"
  Case "[por-BR]"
    result = "PTBR"
  Case "[spa-ES]"
    result = "ES"
  Case Else
    result = myCell.Value
End Select
myCell.Value = result
Next myCell
End Sub

编辑 - 为了符合原始精神,但为了满足字符串中匹配的要求,我用If Elseif系列替换了Case并使用了Like和通配符来匹配。注意为了匹配方括号(假设这是你的意思),我不得不将它们括在方括号中。我还修改了参考ActiveSheet是安全的,借鉴另一个答案(我不批评,只是展示另一种思考方式)。

Sub ReplaceStrings()
Dim result, s As String

For Each myCell In ActiveSheet.Range("A3:A50")
  s = myCell.Value
  If s Like ("*[[]ita-IT[]]*") Then
    result = "IT"
  ElseIf s Like "*[[]jpn[]]*" Then
    result = "JA"
  ElseIf s Like "*[[]por-BR[]]*" Then
    result = "PTBR"
  ElseIf s Like "*[[]spa-ES[]]*" Then
    result = "ES"
  Else
    result = s
End If
myCell.Value = result
Next myCell
End Sub