在excel VBA中循环查找值的最快/最优雅的方法

在excel VBA中循环查找值的最快/最优雅的方法,excel,vba,loops,find,Excel,Vba,Loops,Find,你好 在我的项目中,我遇到了许多情况,在这些情况下,我需要我的代码在给定范围内多次找到某个字符串,并在找到该字符串时执行许多操作 我已经写了一个符合我需要的Do..Loop,但由于我不是最优雅的程序员(我是自学成才的),我想知道其他可能更快或更优雅的方法 示例代码: Set FindStr = .Sheets(c).Range("C2:C" & LRow).Find("MANUALLY", lookat:=xlWhole) If Not FindStr is Nothing Then

你好

在我的项目中,我遇到了许多情况,在这些情况下,我需要我的代码在给定范围内多次找到某个字符串,并在找到该字符串时执行许多操作

我已经写了一个符合我需要的
Do..Loop
,但由于我不是最优雅的程序员(我是自学成才的),我想知道其他可能更快或更优雅的方法

示例代码:

Set FindStr = .Sheets(c).Range("C2:C" & LRow).Find("MANUALLY", lookat:=xlWhole)
If Not FindStr is Nothing Then
    FRow = FindStr.Row
End If

Do While Not FindStr Is Nothing
    If FindStr.Offset(0,2) = "SA" Then
        FindStr.Offset(0,5) = "Confirmed"
    End If
    Set FindStr = .Sheets(c).Range("C2:C" & LRow).Find("MANUALLY", after:=FindStr, lookat:=xlWhole)

    If Not FindStr Is Nothing Then
        If FindStr.Row = FRow then Exit Do
    End If
Loop

如果要继续搜索,可以使用
FindNext
,而不是重新启动新的搜索

唯一需要注意的是,
FindNext
一旦完成,将在顶部继续搜索。为了能够判断搜索是否再次开始,请保存第一次匹配的地址,如果
FindNext
返回您知道已完成的第一次匹配的地址

对变量命名有一句话:
Find/FindNext
return
Ranges
,您应该为变量命名一个反映这一点的名称
FindStr
impplies它包含一个字符串,这不是真的。一个范围的默认属性是它的值,因此它可能看起来像是一个字符串,但它不是

看看这段代码:

Const searchStr = "MANUALLY"
With .Sheets(c).Range("C2:C" & LRow)
    Dim findRange As Range, firstHit As Range
    Set findRange = .Find(searchStr, lookat:=xlWhole)
    If Not findRange Is Nothing Then
        Set firstHit = findRange     ' Remember first hit.
        Do
            ' ... (Do your stuff here)
            Set findRange = .FindNext(findRange)
        Loop While Not findRange Is Nothing And findRange.Address <> firstHit.Address
    Else
        ' in case you didn't find anything
    End If
End With
Const searchStr=“手动”
带.表(c).范围(“C2:c”和LRow)
暗芬德兰奇作为射程,第一次命中作为射程
设置findRange=.Find(searchStr,lookat:=xlother)
如果不是findRange什么都不是
设置firstHit=findRange“记住第一次命中”。
做
' ... (在这里做你的事情)
设置findRange=.FindNext(findRange)
循环而不是findRange是Nothing和findRange.Address firstHit.Address
其他的
“以防你什么也没找到
如果结束
以

您的代码非常好。这些问题最好是在不使用findRange Is Nothing和findRange.Address firstHit.Address时询问,如果找不到字符串,则返回错误?或者这不会发生,因为FindNext将从顶部返回?我学会了避免这种情况,因为它最初给我带来了很多错误。我还开始避免使用
.FindNext
,因为我发现它有时找不到任何东西或找到错误的值,而设置一个新的查找会起作用。尽管如此,后者也可能是我不称职的结果。初始
Find
后的
If Not FindRange is Nothing
将防止运行时错误-它将直接跳转到
Else
。我建议使用调试器一步一步地检查代码,看看发生了什么。是的,在第一次搜索之后会这样。如果在下面的搜索中没有找到任何内容,那么该行将在
findRange.Address
上返回一个错误。但是既然你提到了
。FindNext
将从顶部搜索回来,我认为这种情况永远不会发生。。。对的除非我删除这行,第一个结果当然是定位的。是的,你是对的。对
findRange的检查没有任何意义,因为循环中的条件是多余的-除非代码将覆盖所有找到的值,然后您将得到一个运行时错误。