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

Vba 迭代在Do INTILL循环中找到的所有单元格,vba,excel,replace,Vba,Excel,Replace,我试图在excel中的一列中找到重复的值和,并在项目旁边的相应列中放置3个值。我正在努力解决的问题是,我的搜索范围是一次又一次地查找相同的范围,而不是移动到发现包含字符串的下一个范围,或者将replaceValuesRange设置为Nothing 随后,我决定将字符串值更改为mainputsheet.Cells(loopCounter,4)。value=findString&“FOUND”,以尝试更改字符串的值,但我仍然卡在find循环中,我认为这是因为字符串仍然存在于单元格中 有什么想法吗?问

我试图在excel中的一列中找到重复的值和,并在项目旁边的相应列中放置3个值。我正在努力解决的问题是,我的搜索范围是一次又一次地查找相同的范围,而不是移动到发现包含字符串的下一个范围,或者将
replaceValuesRange
设置为
Nothing

随后,我决定将字符串值更改为
mainputsheet.Cells(loopCounter,4)。value=findString&“FOUND”
,以尝试更改字符串的值,但我仍然卡在find循环中,我认为这是因为字符串仍然存在于单元格中

有什么想法吗?问题存在于
Do-Until
循环中。其他一切都很好

这就是即时窗口在DoLoop中迭代时的样子:

$D$5
$D$5
$D$5
$D$5
$D$5
$D$5
$D$5
$D$5
$D$5
$D$5
主代码块

Option Explicit
Public Const DIR_SDR_PRODUCT_DEFINITIONS_FILEPATH As String = "U:\Research_Dev Docs\DevFolder\SDR Sheet\SDRProductDefinitionsICE.xlsx"

Public Sub TranslateAndPullProductInformation()

    Dim lastRow As Integer, loopCounter As Integer
    Dim sdrICEDefinitions As Workbook
    Dim DefinitionsSheet As Worksheet
    Dim findString As String, productTypeString As String, marketTypeString As String, contractTypeString As String
    Dim searchRange As Range, findValuesRange As Range, replaceValuesRange As Range

    'Checks file exists in specificed path, assigns workbook name, assigns proper worksheet for information definitions
    If Len(Dir(DIR_SDR_PRODUCT_DEFINITIONS_FILEPATH)) = 0 Then GoTo BAIL_OUT

    Set sdrICEDefinitions = Workbooks.Open(DIR_SDR_PRODUCT_DEFINITIONS_FILEPATH)

    Set DefinitionsSheet = sdrICEDefinitions.Sheets(1)

    Set searchRange = DefinitionsSheet.Range("A:A")

    lastRow = MainInputSheet.Cells(MainInputSheet.Rows.Count, "D").End(xlUp).Row

    For loopCounter = 2 To lastRow

        If IsEmpty(MainInputSheet.Cells(loopCounter, 3)) = True Then

            findString = MainInputSheet.Cells(loopCounter, 4).Value

            Set findValuesRange = searchRange.Find(findString)

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

            Do Until replaceValuesRange Is Nothing

                'Product Name
                MainInputSheet.Cells(loopCounter, 1) = findValuesRange.Offset(0, 1).Value

                'Market Type
                MainInputSheet.Cells(loopCounter, 2) = findValuesRange.Offset(0, 2).Value

                'Contract Type
                MainInputSheet.Cells(loopCounter, 3) = findValuesRange.Offset(0, 3).Value

                MainInputSheet.Cells(loopCounter, 4).Value = findString & " FOUND"

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

                Debug.Print replaceValuesRange.Address

            Loop

        End If

    Next

Exit Sub

BAIL_OUT:

    MsgBox ("ProductDefinitions File not found")

End Sub

我最近写了一篇关于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
Sub-FindTest()
变暗间隔作为范围
将值设置为字符串
将结果变暗为范围
将以前的结果变暗为范围
设置间隔=范围(“A1:A1000”)
Value=“Pedro*”
Set Result=Intervalo.Find(值,LookIn:=xlFormulas,LookAt:=xlWhole_
SearchOrder:=xlByColumns)
如果结果是什么,那么
调试。打印“未找到值”
出口接头
如果结束
做
调试。打印结果。值
Set PreviousResult=结果
Set Result=Interval.Find(值,After:=PreviousResult_
LookIn:=xlFormulas,LookAt:=xlWhole,SearchOrder:=xlByColumns)
循环到Result.Row

最好阅读以了解每个参数。我希望它能帮助您。

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

也许像

对于i=2至最后一行,变量范围从第2行开始,一直到最后一行。
此处编码
接下来我

你的问题是

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

您搜索的值是否出现在D5以外的单元格中,例如D20?@Limak它们可以,但问题是有时它们不会。该值可以在数据范围内出现一次,也可以出现几千次?我想问的问题是,当数据中出现
findString
时,即在单元格D10、D23和D34中,这个
Do直到
循环无限地通过这3个单元格,一次又一次。或者,如果它只会通过第一个(本例中为D10)。@Limak它只会一遍又一遍地通过第一个(本例中为D10)。Adam我已经有了它,但我宁愿只需要搜索定义表一次,以满足主表中该字符串的所有发生率。而不是在两个工作表中多次搜索同一字符串。如果是这样,则需要向.findnext添加参数。它有一个起始单元格的可选参数。因此,在代码中,需要将变量设置为找到findstring每个实例的确切单元格,然后将该变量用作findnext的参数。ExampleSet replaceValuesRange=MainInputSheet.Range(MainInputSheet.Cells(2,4),MainInputSheet.Cells(lastRow,4)).FindNext(replaceValuesRange)我建议的一个完美例子可以在以下位置找到:我尝试了您列出的解决方案,但仍然一次又一次地卡在同一个单元格中。不确定该范围为何被列为单个范围。