Excel VBA - 为什么我的代码没有结束?

时间:2016-02-18 18:47:16

标签: excel vba excel-vba

    Sub DeleteDetails()
    For Row = 3 To 50
        If Cells(Row, "B").Value = "" Then
         Cells(Row, "B").EntireRow.Delete Shift:=xlUp
         Row = Row - 1
        End If
    Next Row
End Sub

代码成功完成了我想要它做的事情,但我最终必须点击escape来阻止它运行。我认为“从第3行到第50行”一旦进入第50行就会阻止它......

2 个答案:

答案 0 :(得分:3)

你的问题是你的循环试图从3顺序向前移动到50,除非B中的值为空,然后你删除该行并“重新运行”该行号。如果您在最后一行之后触及其中包含数据的行,您将连续运行该行号。你可能需要一个出口来检查,如下所示:

Sub DeleteDetails()
    For Row = 3 To 50
        If Cells(Row, "B").Value = "" Then
         Cells(Row, "B").EntireRow.Delete Shift:=xlUp
         Row = Row - 1
            If Cells(Row,"A").value = "" then
                'assuming A will have data if the row isn't empty
                Exit Sub
            End If
        End If
    Next Row
End Sub

或者您可以通过查找最后一行然后向前退一步来向后退一步,例如

For Row = iLastRow to 3 Step -1
    'Do stuff here
Next Row

向后退步将是更好的方法。

答案 1 :(得分:0)

如果最后一行是空白,则循环卡在连续循环中删除第50行,直到第50行B列有一个值,如果第50行没有更多值则循环将是无限的。要在第100行B列中显示此位置,它将显示在第50行(删除旧行50-99)。我认为最好的解决方案是要意识到在自己的循环中修改循环计数器总是很危险的,所以只需将计数器与行指针分开,如下面的代码所示:

Sub DeleteDetails()
    Row = 3
    For i = 3 To 50
        If Cells(Row, "B").Value = "" Then
            Cells(Row, "B").EntireRow.Delete Shift:=xlUp
        Else
            Row = Row + 1
        End If
    Next i
End Sub