VBA 中的嵌套循环未正确循环 - 一个有效或另一个有效
Nested loops not looping correctly in VBA - either one works or the other
我有一个项目正在逐步复杂化。对于这一步,我试图让程序在一定数量的行(我正在使用 For 循环)内重复一定次数(我正在尝试使用 Do Until Loop) .行数比我希望程序循环的次数大(大得多)。我尝试使用两个循环的原因是因为我想在 i 范围内的每一行中搜索各种条件,但我只想更改前 n 个匹配项。因为我不知道比赛在哪里或相距多远,所以我需要搜索整个 9000+ 范围。
到目前为止,for 循环单独工作,但我不知道如何成功添加 Do Until 循环。我在内部和外部都尝试过 For 循环,但都没有用。
在这个例子中,for循环在里面。本来应该做 9,结果做了 9,057(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 循环似乎根本没有 运行,因为没有任何颜色改变。 (只粘贴内部代码,因为所有的 dims 都是一样的)
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 九千次,对吗?
你们能帮我把这个正确地改成 运行 吗?我已经阅读了三天的循环教程,但我无法让它工作:(我真的很感激任何帮助!
我不知道我是否正确阅读了你的问题,所以这是对你的要求的猜测。
以下读取所有行 (E
) 但会计算 n
中有多少行 matches/changes 并在 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
我想,我会做一些与 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
根据您的具体操作,循环遍历 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
我有一个项目正在逐步复杂化。对于这一步,我试图让程序在一定数量的行(我正在使用 For 循环)内重复一定次数(我正在尝试使用 Do Until Loop) .行数比我希望程序循环的次数大(大得多)。我尝试使用两个循环的原因是因为我想在 i 范围内的每一行中搜索各种条件,但我只想更改前 n 个匹配项。因为我不知道比赛在哪里或相距多远,所以我需要搜索整个 9000+ 范围。
到目前为止,for 循环单独工作,但我不知道如何成功添加 Do Until 循环。我在内部和外部都尝试过 For 循环,但都没有用。
在这个例子中,for循环在里面。本来应该做 9,结果做了 9,057(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 循环似乎根本没有 运行,因为没有任何颜色改变。 (只粘贴内部代码,因为所有的 dims 都是一样的)
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 九千次,对吗?
你们能帮我把这个正确地改成 运行 吗?我已经阅读了三天的循环教程,但我无法让它工作:(我真的很感激任何帮助!
我不知道我是否正确阅读了你的问题,所以这是对你的要求的猜测。
以下读取所有行 (E
) 但会计算 n
中有多少行 matches/changes 并在 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
我想,我会做一些与 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
根据您的具体操作,循环遍历 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