Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
即使满足界限,VBA For循环仍将继续运行_Vba_Excel_For Loop - Fatal编程技术网

即使满足界限,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

当numRow
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捕捉得好。
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:你通过了吗?