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