迭代在循环中发现的所有单元格

我试图find重复的值,并在Excel中的列中,并将3个值在项目旁边的相应列中。 我正在努力的问题是我的search范围一遍又一遍地find相同的范围,而不是移动到下一个范围,发现包含string或设置replaceValuesRangeNothing

我随后决定将string值更改为MainInputSHeet.Cells(loopCounter, 4).Value = findString & " FOUND"以尝试更改string的值,但我仍然卡在find循环中,我认为是因为string仍然存在于单元格内。

有任何想法吗? 这个问题存在于Do Until Loop中。 其他一切工作正常

这就是直接窗口看起来像迭代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 

你的问题是,

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

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

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

现在的问题是, Do Until循环将无限地执行,但对于每个具有search值的单元格。 我不知道是否有一些更聪明的方法来停止循环,但是我只是将第一个find的单元格的行号保存到fstRowvariables,然后当循环再次find第一个单元格时,将StopStopvariables更改为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 

我最近写了一篇关于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 

阅读查找文档以了解每个参数是一个好主意。 我希望它可以帮助你。

它看起来像你的问题是,你已经设置replaceValuesRange作为一个范围对象。 然后使用do循环运行,直到该范围没有任何内容。 问题是范围仍然是一个对象,并将保持一个对象,直到你对该variables做其他事情。 我会改变这另一个循环,遍历范围。

也许类似

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