0

下面是我的代码,它在 excel 中使用 .Find 函数来查找 dodCell 在 sheet2 中出现的位置,并将 reeCell 从 sheet1 添加到 sheet2 中的第 18 列。这假设根据它在 rRange 中找到 strSearch 的次数来循环。

但是,它目前只运行一次并停止,我认为我的“Do While Loop”中有一个错误,但我无法修复它。

有什么想法吗?

因此,在修复了我的代码中指出的一些错误之后,我修改了 sub. 我想我已经解决了循环问题,但知道程序运行一次并且正在冻结 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

4

3 回答 3

0

APrough 是正确的,do 循环不包含您想要的所有部分。

我不清楚您希望 do 循环做什么,但就目前而言,do 循环除了在其第一个循环期间自动结束之外什么都不做:无论是在dodCell.Address = lastCell.Address(Exit Do) 时还是在下一个循环开始时,因为所有其他dodCell 集的实例ExitLoop = True

要让循环执行任何操作(除了自动结束),您需要在其中包含其他代码。例如,您的 Set 语句,就在 Do 循环的开始上方,看起来像是您可能打算迭代并可能想要进入 do 循环的项目。

附加评论

您的新代码似乎确实将适当的项目移动到 do 循环中。但是,在我看来.Find,就像您所做的那样,嵌套方法会重置活动.Find实例的寄存器。

这意味着当您启动holdCell = dSht.Find寄存器时,dodCell它会被重置。找到.FindNext相同的,并且仅在一次迭代后将匹配, 结束的 hte do 循环。dodCellfirstAddressdodCell

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

这是我的代码:

Sub AddNumber()

'used to add ree value to Dod projects

    'create variables
        Dim wSht1 As Worksheet
        Dim wSht2 As Worksheet

        Dim sFirstrDodCell As String
        Dim sSearch As String

        Dim rDodRange As Range
        Dim rHoldRange As Range
        Dim rDodCell As Range
        Dim rHoldCell As Range

    'establish initial variable values
        Set wSht1 = Worksheets("Sheet1")
        Set wSht2 = Worksheets("Sheet2")

        wSht1.Activate
        Set rDodRange = wSht1.Range("R1", Range("R" & Rows.Count).End(xlUp))
        wSht2.Activate
        Set rHoldRange = wSht2.Range("A1", Range("A" & Rows.Count).End(xlUp))

        sSearch = "2*"

    'find rDodCell values
        Set rDodCell = rDodRange.Find(What:=sSearch, LookIn:=xlValues, _
                        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                        MatchCase:=False, SearchFormat:=False)

        'If something rDodCell holds a value then enter loop to find Sheet2 matches
            If Not rDodCell Is Nothing Then

                'Set sFirstrDodCell to first rDodCell
                    sFirstrDodCell = rDodCell.Address

                'Apply rDodCell values on Sheet2
                    Do
                            For Each rHoldCell In rHoldRange
                                If rHoldCell.Value = rDodCell.Value Then
                                    rHoldCell.Offset(0, 9).Value = rDodCell.Offset(0, -17)
                                End If
                            Next
                            Set rDodCell = rDodRange.FindNext(rDodCell)
                    Loop While Not rDodCell Is Nothing And rDodCell.Address <> sFirstrDodCell
            End If

End Sub
于 2013-08-12T21:11:30.717 回答
0

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

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

于 2013-08-12T19:39:56.903 回答
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的与原始单元格中的一个匹配,则意味着只有在第一次迭代中发生时才匹配。

于 2013-08-12T20:20:37.333 回答