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行就会阻止它......
答案 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