在公式单元格

时间:2016-06-27 11:45:06

标签: excel vba excel-vba

我有一个简短的值列表,从 A1 A10

enter image description here

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,但这看起来很极端。

4 个答案:

答案 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