【问题标题】:Nested loops not looping correctly in VBA - either one works or the other嵌套循环在 VBA 中未正确循环 - 一个有效,另一个有效
【发布时间】:2018-12-24 04:39:06
【问题描述】:

我正在做一个复杂的项目。对于这一步,我试图让一个程序在一定数量的行(我使用 For 循环)内重复一定次数(我试图使用 Do Until 循环) .行数大于(大得多)我希望程序循环的次数。我尝试使用两个循环的原因是因为我想在 i 范围内的每一行中搜索各种条件,但我只想更改前 n 个匹配项。因为我不知道匹配的位置或距离有多远,所以我需要搜索完整的 9000+ 范围。

到目前为止,单独的 for 循环有效,但我不知道如何成功添加 Do Until 循环。我在内部和外部都尝试过 For 循环,但都没有工作。

在本例中,for 循环位于内部。本来应该做 9,结果做了 9057(E 的值):

    Sub Hilight()

Dim usch As Worksheet
Set usch = Worksheets("USCH attributes")
Dim m As Worksheet
Set m = Worksheets("Maps")

Dim i As Integer
Dim E As Integer
Dim n As Integer

Dim s1 As String
Dim s2 As String
Dim s3 As String
s1 = Range("U1").Value
s2 = Range("V1").Value
s3 = Range("W1").Value

Dim rU As String
Dim rE As String
Dim rA As String
rU = m.Range("D4").Value
rE = m.Range("D3").Value
rA = m.Range("D2").Value

E = Range("S1").Value
n = 0
        Do Until n >= 9  
        For i = 1 To E
            n = n + 1
            Debug.Print n
            If Cells(i, 15).Value = s3 And Cells(i, 13).Value = rA And Cells(i, 11) = "" Then   
                Cells(i, 15).Interior.ColorIndex = 0
            End If     
        Next i
        Loop
End Sub

我猜,下一个外部带有 for 循环的示例会更好一些?调试只打印了 9 个,所以很好。不幸的是,For 循环似乎根本没有运行,因为没有任何改变颜色。 (只粘贴内部代码,因为所有的暗淡都是一样的)

 For i = 1 To E
    Do Until n >= 9
        n = n + 1
        Debug.Print n
        If Cells(i, 15).Value = s3 And Cells(i, 13).Value = rA And Cells(i, 11) = "" Then
            Cells(i, 15).Interior.ColorIndex = 37
        End If
    Loop  
    Next i

我想过将 n = 0 放在循环中,但那只会打印 1 九千次,对吧?

你们能帮我解决这个问题以正常运行吗?我已经阅读循环教程三天了,但我无法让它工作:(非常感谢任何帮助!

【问题讨论】:

  • 你能做一些minimal reproducible example吗?并用一句话解释这两个循环应该做什么,最多 20 个单词。
  • i 循环应该在一个范围内搜索匹配项,并且 n 循环应该限制 i 循环迭代的次数。哇,这根本不对,是吗
  • n 可能不应该在每个For 循环上增加,而只能在(之前)之后增加。我认为你应该使用 2 个For 循环,这样最好。

标签: vba excel excel-2010 nested-loops


【解决方案1】:

我不知道我是否正确阅读了您的问题,所以这是对您要求的猜测。

以下内容会读取所有行 (E),但会计算 n 中有多少匹配/更改,并在 n 大于 9 时停止进行这些更改。

n = 0

For i = 1 To E
    If n < 10 And Cells(i, 15).Value = s3 And Cells(i, 13).Value = rA And Cells(i, 11) = "" Then
        Cells(i, 15).Interior.ColorIndex = 0
        n = n + 1
    End If
Next i

【讨论】:

  • 非常感谢!您设法理解了我的问题并提出了一个超级简单的魔术解决方案。我确实最终添加了其他人所包含的行,但我非常感谢您的回答
  • 没问题。请参阅我对 Xabier 答案的评论,因为我按照我的方式编写它。很高兴无论哪种方式你都很开心。祝你好运!
【解决方案2】:

我想,我会做一些与 CLR 提供的答案非常相似的事情,但稍微改变一下,如下所示,所以你会通过i = 1 to E,但只要n = 9 我会退出循环以保存关于资源:

n = 0

For i = 1 To E
    If Cells(i, 15).Value = s3 And Cells(i, 13).Value = rA And Cells(i, 11) = "" Then
        Cells(i, 15).Interior.ColorIndex = 37
        n = n + 1
    End If

    If n = 9 Then Exit For
Next i

【讨论】:

  • 我一直在走这条路,直到我读到 “我想在 i 范围内的每一行中搜索各种条件” - 我认为会有更多 If稍后在循环中声明其他“各种标准”。但是这个问题很模棱两可。
  • 我打算使用引用电子表格单元格的变量,所以我(或更可能是其他人)可以在不进入 VBA 的情况下更改标准
  • @Sylphie 是的,它仍然可以工作,只需将 n = 9 替换为 n = yourvariable
【解决方案3】:

根据您的具体操作,在 Excel 中循环遍历列和行是一项标准任务。假设您的任务是在 20 个 Excel 列中生成一些数据,如下所示:

那么你的任务是遍历每一行的每一列,如果它可以被 7 整除,则将其涂成红色:

那么具有 2 个嵌套循环的解决方案可能是最简单的决定 - 一个循环用于行,并且在每一行中循环遍历列:

Public Sub GenerateSomeData()

    Dim someRows As Long
    Dim someCols As Long

    Cells.Clear

    'GenerateSomeData
    For someRows = 1 To 100
        For someCols = 1 To 20
            Cells(someRows, someCols) = someRows + someCols
        Next someCols
    Next someRows

    'Search for values divisable by 7:
    For someRows = 1 To 100
        For someCols = 1 To 20
            If Cells(someRows, someCols) Mod 7 = 0 Then
                Cells(someRows, someCols).Interior.Color = vbRed
            End If
        Next someCols
    Next someRows

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    • 1970-01-01
    • 2012-08-30
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多