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 

代码成功地做了我想要做的事情,但是我最终必须点击转义来阻止它运行。 我认为“从第三排到第五十排”一旦到达第50排就会停下来。

你的问题是你的循环试图从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 

向后退是更好的方法。

如果最后一行是空白的,那么循环被卡住在一个连续的循环中删除第50行,直到第50列的B有一个值,如果在第50行没有更多的值,那么循环将是无限的。 为了演示这个地方在第100行B列中的一个值,它将出现在第50行(删除旧的行50-99)。 我认为最好的解决scheme是意识到在自己的循环中修改循环计数器总是非常危险的,所以简单地将计数器与行指针分开,如下面的代码所示:

 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