在公式单元格上使用Range.Replace

我有一个从A1A10的简短列表:

在这里输入图像说明

A4包含stringabA5包含公式:

 ="a" & "b" 

如果我运行:

 Sub Test1() Dim r As Range Set r = Range("A1:A10") r.Replace What:="ab", Replacement:="x" End Sub 

只有A4被修改。

我怎样才能让replace方法适用于这两种情况?

编辑#1:

我总是可以使用循环来检查/逐项replace,但是replace要快得多。 我想我可以build立和使用一个临时的AutoFilter,但这似乎是极端的。

这是我创造的:

 Option Explicit Sub testme() Dim my_cell As Range Dim str_text As String For Each my_cell In Range("A1:A10") If InStr(my_cell.Text, "ab") > 0 Then str_text = my_cell.Text str_text = Replace(str_text, "ab", "x") my_cell.Value = str_text End If Next my_cell End Sub 

有趣的问题,似乎LookIn选项会很好。

我尝试了一些东西(全部使用循环)。 我禁用了所有testing的屏幕更新。

使用Replace

 r.Replace what:="ab", Replacement:="x" 

使用Find

 Dim c As Range Set c = r.Find(what:="ab", LookIn:=xlValues) While Not (c Is Nothing) c.Value = "x" Set c = r.FindNext Wend 

使用一个简单的循环:

 Dim i As Long For i = 1 To 10 If Cells(i, 1).Value = "ab" Then Cells(i, 1).Value = "x" Next i 

使用更好的循环:

 Dim c as Range For Each c In r.Cells If c.Value = "ab" Then c.Value = "x" Next c 

使用数组来search:

 Dim v As Variant Dim i as Long v = r.Value For i = 1 to 10 If v(i,1) = "ab" Then Cells(i,1).Value = "x" next i 

Replace和数组方法是最快的search范围,我没有注意到任何速度差异。 然而,写入到单元格会减慢循环显着,当有许多替代品(对于我来说,在1,000,000个值中有大约5000个替代品)。 Find受到更多的replace,而其他两个循环search时慢得多。

结论:使用内部数组是最好的方法(我能想到的,它甚至会首先删除所有的公式( r.Value = r.Value ))。

也许保存所有的事件,并在循环后更换它们可以进一步加快速度。

你也可以使用这个:

 Sub ThereIsAnotherOneVariant() With [A1:A10] .Value2 = .Value2 .Replace "ab", "x" End With End Sub 

但是这个变体将删除范围内的所有公式