迭代在Do Until循环中找到的所有单元格

时间:2016-11-23 16:17:19

标签: excel vba excel-vba replace

我试图在excel的列中找到重复的值,并在项目旁边的相应列中放入3个值。我正在努力解决的问题是我的搜索范围一遍又一遍地找到相同的范围,而不是转到下一个包含字符串或将replaceValuesRange设置为{{1}的范围}}

我随后决定将字符串值更改为Nothing以尝试更改字符串的值,但我仍然陷入查找循环中,我认为这是因为字符串仍然存在于细胞

有什么想法吗?问题存在于MainInputSHeet.Cells(loopCounter, 4).Value = findString & " FOUND"循环中。其他一切都很好

这就是立即窗口在DoLoop中迭代的内容:

Do Until

主要代码块

$D$5
$D$5
$D$5
$D$5
$D$5
$D$5
$D$5
$D$5
$D$5
$D$5

3 个答案:

答案 0 :(得分:1)

你的问题是,

Set replaceValuesRange = MainInputSheet.Range(MainInputSheet.Cells(2, 4), MainInputSheet.Cells(lastRow, 4)).FindNext

每次都会从乞讨开始搜索。要继续搜索(显示下次出现的搜索值),您必须使用:

Set replaceValuesRange = MainInputSheet.Range(MainInputSheet.Cells(2, 4), MainInputSheet.Cells(lastRow, 4)).FindNext(replaceValuesRange)

现在的问题是,Do Until循环将无限延伸,但对于每个具有搜索值的单元格。我不确定是否有更智能的方法来停止循环,但我只是将第一个找到的单元格的行号保存到fstRow变量,然后在StopStop时更改True变量循环将再次找到第一个单元格:

Dim StopStop As Boolean
Dim fstRow As Long

    StopStop = False
    Set replaceValuesRange = MainInputSheet.Range(MainInputSheet.Cells(2, 4), MainInputSheet.Cells(lastRow, 4)).Find(findString)
    If Not replaceValuesRange Is Nothing Then fstRow = replaceValuesRange.Row
    Do Until replaceValuesRange Is Nothing Or StopStop
        Set replaceValuesRange = MainInputSheet.Range(MainInputSheet.Cells(2, 4), MainInputSheet.Cells(lastRow, 4)).FindNext(replaceValuesRange)
        If replaceValuesRange.Row = fstRow Then StopStop = True
    Loop

答案 1 :(得分:0)

我最近写了一篇关于Find的文章,但是用葡萄牙文写的,我认为它不会帮助你。

在那篇文章中,我提供了一个示例代码,您可以学习并了解它是如何工作的:

Sub FindTest()

Dim Interval As Range
Dim Value As String
Dim Result As Range
Dim PreviousResult As Range

Set Interval = Range("A1:A1000")
Value = "Pedro*"
Set Result = Intervalo.Find(Value, LookIn:=xlFormulas, LookAt:=xlWhole, _
    SearchOrder:=xlByColumns)

If Result Is Nothing Then
    Debug.Print "Value not found"
    Exit Sub
End If

Do
    Debug.Print Result.Value
    Set PreviousResult = Result
    Set Result = Interval.Find(Value, After:=PreviousResult, _
        LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByColumns)
Loop Until Result.Row < PreviousResult.Row

End Sub

阅读Find documentation以了解每个参数是个好主意。我希望它对你有所帮助。

答案 2 :(得分:0)

在我看来,您的问题是您已将replaceValuesRange设置为范围对象。然后使用do循环运行,直到该范围为止。问题是范围仍然是一个对象,并且在您对该变量执行其他操作之前将保留一个对象。我会将此更改为另一个for循环并迭代该范围。

也许像

对于i = 2到lastrow'你的变量范围从第2行开始直到最后一行    代码在这里 接下来我