下面是我在excel中使用.find函数找到dodCell在sheet2中出现的位置,并将sheet中的reeCell添加到sheet2中的第18列的代码。这是基于它在rRange中找到strSearch的次数来循环。
但是,目前它只运行一次并停止,我认为我的“Do While Loop”中有一个错误,但我无法解决它。
有什么想法吗?
因此,在修复了我的代码中指出的一些错误后,我修改了sub。我想我已经解决了Loop问题,但是知道程序运行一次并且冻结excel然后我需要重启Excel。我想我已经创建了一个无限循环,但不知道如何修复任何想法?
Sub addnumber()
'used to add ree value to Dod projects
Dim sSht As Worksheet, dSht As Worksheet
Dim lastrow As Integer
Dim firstAddress As String
Dim strSearch As String
Dim ReeCell As Range, dodCell As Range, aRange As Range, rRange As Range, aaRange As Range
Dim hold1Cell As Range, holdCell As Range, lastCell As Range
Set sSht = Worksheets("Sheet1")
Set dSht = Worksheets("Sheet2")
Set rRange = sSht.Columns(18)
Set aRange = sSht.Columns(1)
Set aaRange = dSht.Columns(1)
lastrow = sSht.Range("A" & Rows.Count).End(xlUp).Row
strSearch = "2*"
Set dodCell = rRange.Find(What:=strSearch, LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
'If something dodCell holds a value then enter loop
If Not dodCell Is Nothing Then
'Set lastCell to dodCell
firstAddress = dodCell.Address
Do
'Set ReeCell to the value of the Ree number
Set ReeCell = dodCell.Offset(0, -17)
'Set holdCell to the Cell that holds that Dod number in "Sheet2"
Set holdCell = aaRange.Find(What:=dodCell, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
'Set hold1Cell to the location that the Ree Value should be
Set hold1Cell = holdCell.Offset(0, 9)
'Give hold1Cell the Ree # from ReeCell
hold1Cell = ReeCell.Value
Set dodCell = rRange.FindNext(dodCell)
Loop While Not dodCell Is Nothing And dodCell.Address <> firstAddress
End If
End Sub
答案 0 :(得分:0)
我认为你的Do While循环可能正常工作。看起来你的问题是改变单元格内容的代码也不在循环中。你设置dodCell,根据另一个find改变它的值,然后你循环找到下一个dodCell,并获取它的地址(Set dodCell = rRange.FindNext
等),但是然后退出循环然后子。
尝试将其他一些代码移到循环中,看看是否得到了预期的结果。
答案 1 :(得分:0)
在这里,您有一个修改后的代码版本,用于确定目标字符串是否出现过一次(justOne
为True
时):
Dim beyondFirst As Boolean
Dim justOne As Boolean
Do While ExitLoop = False
Set dodCell = rRange.FindNext(After:=dodCell)
If Not dodCell Is Nothing Then
If Not beyondFirst And dodCell.Address = lastCell.Address Then
justOne = True
Exit Do
End If
Else
ExitLoop = True
End If
beyondFirst = True
Loop
正如您所定义的那样,此循环将遍历目标字符串所在的所有单元格。就你使用After
而言,找到的第一个单元格在最后一刻才会被迭代;这是我更正的基础:如果给定的Address
与原始单元格匹配,则表示只有一次匹配,如果它在第一次迭代中发生。
答案 2 :(得分:0)
APrough是正确的,do循环不包含你想要的所有部分。
我不清楚你想要do循环做什么,但是当它循环时,do循环只会在第一次循环期间自动结束:在dodCell.Address = lastCell.Address
(退出Do)或开始时下一个循环,因为dodCell的所有其他实例都设置为ExitLoop = True
。
要让循环执行任何操作(除了自动结束),您需要在其中包含其他代码。例如,在Do循环开始之上的Set语句看起来就像你可能想要迭代的项目,并且可能想要进入do循环。
其他评论
您的新代码确实会将相应的项目移动到do循环中。但是,在我看来,像嵌套.Find
方法一样,重置了活动.Find
实例的寄存器。
这意味着当您启动holdCell = dSht.Find
时,dodCell
的注册表将被重置。在.FindNext
上找到相同的dodCell
,firstAddress
将与dodCell
匹配,仅在一次迭代后结束hte do循环。
我提出的允许do循环遍及整个搜索范围的解决方案涉及使用For Each
语句循环遍历holdCell
值并找到与当前{{ 1}}。有更有效的方法可以做到这一点,但以下代码应该作为一个开始。如果有很多行,它会很慢:它会在Sheet2上为每个找到的dodCell值循环遍历每一行。
这是我的代码:
dodCell