Reputation: 96753
I have a short list of values from A1 through A10:
A4 contains the string ab
and A5 contains the formula:
="a" & "b"
If I run:
Sub Test1()
Dim r As Range
Set r = Range("A1:A10")
r.Replace What:="ab", Replacement:="x"
End Sub
only A4 gets modified.
How can I get the Replace Method to work for both cases ??
EDIT#1:
I can always use a loop to examine/replace item-by-item, but .Replace
is much faster. I suppose that I could build and use a temporary AutoFilter, but this seems extreme.
Upvotes: 11
Views: 9462
Reputation: 42236
Even if this is a historical thread, I think it is good to emphasize that fastest method (Replace
), works very well for solving the question in discussion, without any iteration. In fact, range 'Replace' method works Only for string formulas... But due to the fact that Formula
property of a range without formula returns its text, it works also in that case, too. It only searches and replaces twice, but it needs the exact formula string like What
parameter:
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
Upvotes: 0
Reputation: 43575
This is what I have created:
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
Upvotes: 8
Reputation: 3777
Interesting problem, it seems that a LookIn
option would be nice.
I tried a few things (all using loops however). I disabled screenupdating for all the tests.
Using Replace
:
r.Replace what:="ab", Replacement:="x"
using 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
using a simple loop:
Dim i As Long
For i = 1 To 10
If Cells(i, 1).Value = "ab" Then Cells(i, 1).Value = "x"
Next i
Using a better loop:
Dim c as Range
For Each c In r.Cells
If c.Value = "ab" Then c.Value = "x"
Next c
Using an array to 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
The Replace
and array method were the fastest to search the range and I didn't notice any speed difference. However, the writing to the cells slowed down the loops considerably when there were many replacements to do (it got noticeable somewhere around 5000 replacements out of 1,000,000 values for me).
The Find
suffered heavy from more replacements and the other two loops were much slower when searching.
Conclusion: Using an internal array is the best way (that I can think of. It even beats removing all the formulas first (r.Value = r.Value
).
Maybe saving all the occurrences and replacing them after the loop could speed things up further.
Upvotes: 6
Reputation: 5782
also you can use this:
Sub ThereIsAnotherOneVariant()
With [A1:A10]
.Value2 = .Value2
.Replace "ab", "x"
End With
End Sub
but this variant will remove all formulas in the range
Upvotes: 2