Excel做查找

时间:2013-08-12 18:49:47

标签: excel vba excel-vba

下面是我在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

3 个答案:

答案 0 :(得分:0)

我认为你的Do While循环可能正常工作。看起来你的问题是改变单元格内容的代码也不在循环中。你设置dodCell,根据另一个find改变它的值,然后你循环找到下一个dodCell,并获取它的地址(Set dodCell = rRange.FindNext等),但是然后退出循环然后子。

尝试将其他一些代码移到循环中,看看是否得到了预期的结果。

答案 1 :(得分:0)

在这里,您有一个修改后的代码版本,用于确定目标字符串是否出现过一次(justOneTrue时):

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上找到相同的dodCellfirstAddress将与dodCell匹配,仅在一次迭代后结束hte do循环。

我提出的允许do循环遍及整个搜索范围的解决方案涉及使用For Each语句循环遍历holdCell值并找到与当前{{ 1}}。有更有效的方法可以做到这一点,但以下代码应该作为一个开始。如果有很多行,它会很慢:它会在Sheet2上为每个找到的dodCell值循环遍历每一行。

这是我的代码:

dodCell