【问题标题】:Loop inside loop. Stop second loop if condition is met循环内循环。如果满足条件,则停止第二个循环
【发布时间】:2016-03-18 16:37:03
【问题描述】:

我写了下面的代码。它是一个循环内循环。第一个循环运行以在所有第二个循环的所有范围(sheet2)中搜索第一个范围的值(sheet1)。如果满足条件,我希望第二个循环停止并继续下一个值。

如果满足条件,我将使用“退出”来停止第二个循环。但问题是......

当第一个循环 = 2 时,第二个循环也是 2 并且满足条件,第二个循环停止。第一个循环变为 = 3,但第二个循环仍然保持 = 2,这导致不匹配和失败。请帮忙。

    For I = 2 To REND        
         For P = 2 To ENDROW
          If Range("D" & I) = D.Range("c" & P) Then
            If Range("H" & I) = D.Range("F" & P) Then
                Range("A" & I) = "MATCHED"
                Exit For

            Else
                Range("A" & I) = "DIFFERENCE OF " & Range("G" & I) - D.Range("F" & P)
            End If
          Else
            Range("A" & I) = "AP NOT FOUND"
          End If
         Next P
Next I

声明在哪里:

Dim D As Worksheet, F As Worksheet, R As WorksheetDim X As String
Dim I As Integer, ENDROW As Integer, FEND As Integer
Dim P As Integer, REND As      Integer, L As Integer 
Set D = ActiveWorkbook.Sheets("DWAC")
Set F = ActiveWorkbook.Sheets("FPS")
Set R = ActiveWorkbook.Sheets("RAW")
ENDROW = D.Range("C2").End(xlDown).Row
FEND = F.Range("C2").End(xlDown).Row
REND = R.Range("C2").End(xlDown).Row

【问题讨论】:

  • 我可能还没有完全理解您的问题,但是为什么您为比较范围的一侧定义页面而不为另一侧定义页面? (即您使用 'range("G" & I) - D.Range("F" & P) 为什么没有定义第一个范围 'page'?除此之外,您正在隐式比较 'values',即没有定义.Value 范围的属性?这可能是不匹配的错误,因为在这种情况下没有定义到底应该比较什么?
  • 所以我使用with sheet 作为第一个范围,所以真的不需要使用page.range
  • 第二个比较字段包含整数,因此不使用range.value
  • GD Akkitech,如果你在这个循环中使用with sheet,那么你应该使用.Range 而不仅仅是Range - 注意点- !!

标签: vba excel loops for-loop


【解决方案1】:

根据您的问题,我假设Sheets("DWAC") column C 中只有一个结果。考虑到这一点,我们可以使用 find 而不是循环,直到找到匹配项。

如果我们清理了您的 Dim 语句(代码中没有使用一张表,行变量应该是 long

    Dim D As Worksheet, R As Worksheet
    Dim ENDROW As Long, REND As Long
    Dim rng1 As Range, rng2 As Range
    Dim c As Range, FndC As Range

现在当然要设置工作表

Set D = Sheets("DWAC")
Set R = Sheets("RAW")

然后找到最后一行并设置范围。

这会找到c列Sheets("DWAC")的最后一行,设置的范围就是我们要从Sheets("RAW")中找到原始值的地方

 With D
    ENDROW = .Cells(.Rows.Count, "C").End(xlUp).Row
    Set rng2 = .Range("C2:C" & ENDROW) 'find value in column C sheet D
End With

然后从表格 R 中设置循环范围,这是我们将循环通过的范围。

With R
        REND = .Cells(.Rows.Count, "D").End(xlUp).Row
        Set rng1 = .Range("D2:D" & REND) 'Loop through column D in sheet R
    End With

现在我们可以开始循环了。 c 会循环遍历 rng1 并在 rng2 中找到自己,如果找到 c,则 FndC 将是范围。

 For Each c In rng1.Cells
        Set FndC = rng2.Find(what:=c, lookat:=xlWhole)

如果找到 c 就做点什么。

   If Not FndC Is Nothing Then

            If c.Offset(, 4) = FndC.Offset(, 3) Then
                c.Offset(, -3) = "Match"
            Else
                c.Offset(, -3) = "DIFFERENCE OF " & c.Offset(, 3) - FndC.Offset(, 3)
            End If
        Else: c.Offset(, -3) = "Not Found"

        End If
    Next c

如果我的偏移顺序有误,您可以根据自己的要求进行编辑。 这就是偏移量所代表的内容。

c.Offset(, 4)'=Column H Sheet "R"
FndC.Offset(, 3)'=Column F Sheet "D"
c.Offset(, -3)'=Column A Sheet "R"
c.Offset(, 3)'=Column G Sheet "R"

这是完整的代码。

Sub FindAndStuff()
    Dim D As Worksheet, R As Worksheet
    Dim ENDROW As Long, REND As Long
    Dim rng1 As Range, rng2 As Range
    Dim c As Range, FndC As Range

    Set D = Sheets("DWAC")
    Set R = Sheets("RAW")

    With D
        ENDROW = .Cells(.Rows.Count, "C").End(xlUp).Row
        Set rng2 = .Range("C2:C" & ENDROW) 'find value in column C sheet D
    End With


    With R
        REND = .Cells(.Rows.Count, "D").End(xlUp).Row
        Set rng1 = .Range("D2:D" & REND) 'Loop through column D in sheet R
    End With

    For Each c In rng1.Cells
        Set FndC = rng2.Find(what:=c, lookat:=xlWhole)

        If Not FndC Is Nothing Then

            If c.Offset(, 4) = FndC.Offset(, 3) Then
                c.Offset(, -3) = "Match"
            Else
                c.Offset(, -3) = "DIFFERENCE OF " & c.Offset(, 3) - FndC.Offset(, 3)
            End If
        Else: c.Offset(, -3) = "Not Found"

        End If
    Next c

End Sub

【讨论】:

  • 更多 excel,更少 VBA,与其他解决方案一样出色。另一种风格。
【解决方案2】:

我知道的最好的方法是使用布尔值:

Dim chck As Boolean
Dim chck2 As Boolean
For I = 2 To REND
    chck = False
    chck2 = False
    For P = 2 To ENDROW
        If Range("D" & I) = D.Range("c" & P) Then
            chck = True
            If Range("H" & I) = D.Range("F" & P) Then
                chck2 = True
                Exit For
            End If
        end if
    Next P    
    If chck And chck2 Then
        Range("A" & I) = "MATCHED"
    ElseIf chck Then
        Range("A" & I) = "DIFFERENCE OF " & Range("G" & I) - D.Range("F" & P)
    Else
        Range("A" & I) = "AP NOT FOUND"
    End If
Next I

【讨论】:

  • 它有效,但是当If chck And chck2 Then 为真时,它结束了循环并停止宏。但是For I = 2 To REND 需要继续。
  • 在“Next P”之前不是缺少“End If”吗?除此之外,是的,当退出条件变得复杂时,布尔值就是要走的路。
  • @ScottCraner For P = 2 to ENDROW 仍然是 2 而For I = 2 To REND 是 3。它仍然没有移动到 P 的下一个范围......
猜你喜欢
  • 1970-01-01
  • 2022-01-02
  • 2021-09-30
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 2013-11-22
相关资源
最近更新 更多