Excel 使用Find方法格式化范围内的特定字符串

Excel 使用Find方法格式化范围内的特定字符串,excel,vba,Excel,Vba,我有一个范围,其中包含随机散布的字符串“freq!”的几个实例。我想把这些字符串的字体改成红色。我尝试使用“查找”方法,但没有成功: [D1:H5000].Find(What:=”freq!”, LookIn:=xlValues).Font.Color = RGB(255,0,0) 我哪里出错了?试试看: Sub BetterRedThan() Dim rFound As Range, rBig As Range, r As Range Set rFound = Nothing

我有一个范围,其中包含随机散布的字符串“freq!”的几个实例。我想把这些字符串的字体改成红色。我尝试使用“查找”方法,但没有成功:

[D1:H5000].Find(What:=”freq!”, LookIn:=xlValues).Font.Color = RGB(255,0,0)
我哪里出错了?

试试看:

Sub BetterRedThan()
    Dim rFound As Range, rBig As Range, r As Range
    Set rFound = Nothing
    Set rBig = Range("D1:H5000")
    For Each r In rBig
        If InStr(1, r.Value, "freq!") > 0 Then
            If rFound Is Nothing Then
                Set rFound = r
            Else
                Set rFound = Union(r, rFound)
            End If
        End If
    Next r

    If rFound Is Nothing Then
    Else
        rFound.Font.Color = RGB(255, 0, 0)
    End If
End Sub

您的
.Find
不起作用的原因是它只用于查找一个实例。要查找多个实例,还需要在循环中使用
.FindNext
。请参见下面的示例:

请注意在搜索字符串周围使用通配符

Sub ChangeFontColor()

Dim rng As Range
Dim rr As Range
Dim sAdd As String
Dim sStr As String

sStr = "*freq!*"

With Worksheets("YourSheetName").Range("D1:H5000")
    Set rng = .Find(sStr)
    If Not rng Is Nothing Then
        sAdd = rng.Address
        Do
            If rr Is Nothing Then
                Set rr = rng
            Else
                Set rr = Application.Union(rr, rng)
            End If
            Set rng = .FindNext(rng)
        Loop While Not rng Is Nothing And rng.Address <> sAdd
    End If
End With

If Not rr Is Nothing Then
    rr.Font.Color = RGB(255,0,0)
End If

End Sub
Sub ChangeFontColor()
变暗rng As范围
调暗rr As范围
像绳子一样暗淡
作为字符串的Dim sStr
sStr=“*频率!*”
带有工作表(“您的SheetName”)。范围(“D1:H5000”)
设置rng=.Find(sStr)
如果不是,那么rng什么都不是
sAdd=rng.地址
做
如果rr不算什么,那么
设置rr=rng
其他的
设置rr=Application.Union(rr,rng)
如果结束
设置rng=.FindNext(rng)
非rng时循环为Nothing,rng.Address sAdd
如果结束
以
如果不是,那么rr什么都不是
rr.Font.Color=RGB(255,0,0)
如果结束
端接头

根据实例的数量,这个例子应该执行得相当快。有关
.FindNext

的更多信息,谢谢,但我希望通过使用Find方法避免循环。无法避免循环吗?Hi Max:您可以使用Find,但可能仍然需要循环。+1使用Union:)几乎(不完全)补偿了for each循环。:)Gary,我想我误解了OP想要什么:)请看我在@ARich post下的最后一条评论。啊,这是我第一次使用Find,并认为它是避免循环的灵丹妙药。没有意识到它只找到一个实例。多大的裂缝啊。即使在我重命名工作表(2).Range(“D1:H5000”)以匹配我自己的工作表名称之后,您的代码也不适用于我。还有什么问题?是不是因为我没有在搜索字符串中包含通配符?请看我编辑的答案。顺便说一句,我一直使用
.Find
,以避免使用循环。人们只需要知道它的局限性就可以了1好的:)为了使代码更快,您可以使用
Union
创建一个范围,而不是对循环中的单元格进行着色,并对循环中的所有单元格进行着色。@SiddharthRout我喜欢这个建议!谢谢我已经更新了代码以包含您的建议。@ARich,不幸的是,您的通配符没有任何区别。代码将运行,但“freq!”字符串的字体不会变为红色。