我有一个简短的值列表,从 A1 到 A10 :
A4 包含字符串ab
, A5 包含公式:
="a" & "b"
如果我跑:
Sub Test1()
Dim r As Range
Set r = Range("A1:A10")
r.Replace What:="ab", Replacement:="x"
End Sub
只有 A4 会被修改。
如何让替换方法适用于两种情况?
修改#1:
我总是可以使用循环来检查/替换逐项,但.Replace
要快得多。我想我可以构建并使用临时的AutoFilter,但这看起来很极端。
答案 0 :(得分:8)
这就是我创造的:
Option Explicit
Sub TestMe()
Dim myCell As Range
Dim myText As String
For Each myCell In Worksheets(1).Range("A1:A10")
If InStr(myCell.Text, "ab") > 0 Then
myText = myCell.Text
myCell = Replace(myText, "ab", "x")
myCell.Value = myText
End If
Next myCell
End Sub
答案 1 :(得分:5)
有趣的问题,似乎<=25%
选项会很好。
我尝试了一些东西(但都使用了循环)。我禁用了所有测试的screenupdating。
使用LookIn
:
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
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
和数组方法是搜索范围最快的,我没有注意到任何速度差异。然而,当有许多替换要做的时候,对单元格的写入会大大减慢循环(对于我而言,在1,000,000个值中的5000个替换中,它显得很明显)。
Replace
因更多替换而遭受重创,而其他两个循环在搜索时速度要慢得多。
结论:使用内部数组是最好的方法(我能想到的。它甚至可以首先删除所有公式(Find
)。
也许保存所有的事件并在循环之后替换它们可以进一步加快速度。
答案 2 :(得分:2)
你也可以用这个:
Sub ThereIsAnotherOneVariant()
With [A1:A10]
.Value2 = .Value2
.Replace "ab", "x"
End With
End Sub
但此变体将删除范围
中的所有公式答案 3 :(得分:0)
即使这是一个历史线索,我也想强调一下,最快的方法(Replace
)非常适合解决讨论中的问题,而无需任何迭代。实际上,范围“替换”方法仅适用于用于字符串公式...但是由于没有公式的范围的Formula
属性会返回其文本,因此在这种情况下,它也适用也一样它仅搜索和替换两次,但需要确切的公式字符串,例如What
参数:
Sub Test1_Bis()
Dim r As Range
Set r = Range("A1:A10")
r.Replace What:="=""a"" & ""b""", Replacement:="x"
r.Replace What:="ab", Replacement:="x"
End Sub