即使满足界限,VBA For循环仍将继续运行
因此,我有一个运行类似以下内容的代码:即使满足界限,VBA For循环仍将继续运行,vba,excel,for-loop,Vba,Excel,For Loop,因此,我有一个运行类似以下内容的代码: maxRow = 5 For numRow=1 to maxRow If Range("A" & numRow).Value = 0 Then Rows(numRow).Select Selection.Delete Shift:=xlUp numRow = numRow - 1 maxRow = maxRow - 1 End If Next num
maxRow = 5
For numRow=1 to maxRow
If Range("A" & numRow).Value = 0 Then
Rows(numRow).Select
Selection.Delete Shift:=xlUp
numRow = numRow - 1
maxRow = maxRow - 1
End If
Next numRow
我有
A1至A5=40 3 1 9(分别)
然而,由于某种原因,循环仍在继续
任何人都请帮助我,所以我最终得到了A1=4,A2=3,A3=1和A4=9,没有连续循环 有时候倒着走比较好: 之前: 守则:
Sub ytrewq()
maxRow = 5
For numRow = maxRow To 1 Step -1
If Range("A" & numRow).Value = 0 Then
Rows(numRow).Select
Selection.Delete Shift:=xlUp
End If
Next numRow
End Sub
及之后:
注意:
没有任何东西会递减。选择
是不必要的:
Sub ytrewq()
maxRow = 5
For numRow = maxRow To 1 Step -1
If Range("A" & numRow).Value = 0 Then
Rows(numRow).Delete Shift:=xlUp
End If
Next numRow
End Sub
这也行。有时候倒回去比较好: 之前: 守则:
Sub ytrewq()
maxRow = 5
For numRow = maxRow To 1 Step -1
If Range("A" & numRow).Value = 0 Then
Rows(numRow).Select
Selection.Delete Shift:=xlUp
End If
Next numRow
End Sub
及之后:
注意:
没有任何东西会递减。选择
是不必要的:
Sub ytrewq()
maxRow = 5
For numRow = maxRow To 1 Step -1
If Range("A" & numRow).Value = 0 Then
Rows(numRow).Delete Shift:=xlUp
End If
Next numRow
End Sub
也可以工作。原因是在
For-Next
循环中,无论在循环本身期间是否更新其结束条件中涉及的变量,您都会在第一次进入循环时确定迭代次数
当您事先不知道循环中的语句要运行多少次时(如您的情况),请使用Do While-loop
loop:
Option Explicit
Sub main()
Dim maxRow As Long, numRow As Long
maxRow = 5
numRow = 1
Do While numRow <= maxRow
If Range("A" & numRow).Value = 0 Then
Rows(numRow).Delete Shift:=xlUp
maxRow = maxRow - 1
Else
numRow = numRow + 1
End If
Loop
End Sub
选项显式
副标题()
Dim maxRow为长,numRow为长
maxRow=5
numRow=1
Do While numRow原因是,在For-Next
循环中,您在第一次进入循环时确定迭代次数,无论在循环本身期间您是否正在更新其结束条件中涉及的变量
当您事先不知道循环中的语句要运行多少次时(如您的情况),请使用Do While-loop
loop:
Option Explicit
Sub main()
Dim maxRow As Long, numRow As Long
maxRow = 5
numRow = 1
Do While numRow <= maxRow
If Range("A" & numRow).Value = 0 Then
Rows(numRow).Delete Shift:=xlUp
maxRow = maxRow - 1
Else
numRow = numRow + 1
End If
Loop
End Sub
选项显式
副标题()
Dim maxRow为长,numRow为长
maxRow=5
numRow=1
当numRownumRow=numRow-1
表示它永远不会超过1时执行。另外,当删除行时,向后循环。@findwindow:不完全,因为numRow=numRow-1
只在If-Range(“A”&numRow)时发生。Value=0
,而numRow
在每次迭代中都会对numRow=1进行更新。真正的问题是,在For counter=iniCounter to endCounter
中,endCounter
值在整个过程中始终保持其初始值loop@user3598756捕捉得好。numRow=numRow-1
意味着它永远不会超过1。另外,当删除行时,向后循环。@findwindow:不完全,因为numRow=numRow-1
只在If-Range(“A”&numRow)时发生。Value=0
,而numRow
在每次迭代中都会对numRow=1进行更新。真正的问题是,在For counter=iniCounter to endCounter
中,endCounter
值在整个过程中始终保持其初始值loop@user3598756好的catch.mmm问题是我简化了这个问题,因为删除该行是一个更大的for循环的一部分,该循环从第2行开始,一直到第10000行...左右我希望有一种简单的方法可以在不改变for循环结构的情况下修复它。@MauroAugusto我发布的代码是处理这种需求的一种非常标准的方法………如果我们能看到更多您的代码,我们可能会帮助您调整它。@MauroAugusto,我的猜测是,您最好将这些多个任务分解成单独的循环/过程。无论如何,你已经得到了问题的正确答案。嗯,问题是我简化了这个问题,因为删除行是一个更大的for循环的一部分,我从第2行开始,到第10000行左右。。。我希望有一种简单的方法可以在不改变for循环结构的情况下修复它。@MauroAugusto我发布的代码是处理这种需求的一种非常标准的方法………如果我们能看到更多您的代码,我们可能会帮助您调整它。@MauroAugusto,我的猜测是,您最好将这些多个任务分解成单独的循环/过程。无论如何,你已经得到了问题的正确答案。@MauroAugusto:你通过了吗?@MauroAugusto:你通过了吗?