我正在尝试理解一段代码,这段代码在过去对我有效,但现在在另一个应用程序中不起作用。基本上,它需要删除包含特定列中信息的所有行,并保持其余行不变。当我运行宏时,代码执行没有问题,但只是删除了一些有值的行。不是所有的。当连续运行代码几次时,它最终会完成预期的任务,但这真的很不方便。代码如下:
Sub Delete_Signoffed()
Dim rCell As Range
Dim iCol As Integer
Dim iRow As Integer
Worksheets("MilestoneDueDate").Activate
If ActiveSheet.AutoFilterMode Then Cells.AutoFilter
ActiveWindow.FreezePanes = False
Columns.EntireColumn.Hidden = False
If WorksheetFunction.CountA(Columns("A")) = 0 Then
Columns("A").Delete
Rows("1:6").Delete
End If
iCol = Cells.Find("Sign-Off By", LookAt:=xlWhole).Column
For iRow = 2 To Cells(Rows.Count, iCol).End(xlUp).Row
Cells(iRow, iCol).Select
If Not IsEmpty(Cells(iRow, iCol).Value) Then Rows(iRow).EntireRow.Delete
Next iRow
End Sub
源文件存在一些格式问题,在为iCol指定列值之前的所有操作都是为了修复格式,因此请忽略。iRow从2开始以避免删除文件标题。
对于为什么For循环不能正常工作有什么想法吗?
提前感谢!
2条答案
按热度按时间gijlo24d1#
我更新了你的脚本。我还添加了评论,以便你能够更好地理解它,并能够在未来改进它。
c2e8gylq2#
正如在注解中已经指出的,代码中的缺陷不是向后循环
但我在此给出一个解决方案,它不需要循环,只使用一行代码,这要归功于
Range
对象的SpecialCells
方法,它指定它过滤具有某个“常量”(即不是从公式中派生的)值的单元格这假定您始终在第1行下面至少有一个值
如果不是这种情况,则只需添加一个检查:
在查看整个代码时,您应该采用避免
Select/Selection, Activate/ActiveXXX
模式的良好做法,并始终完全限定直到其工作表(如果不是工作簿)父对象的范围,如下所示:如你所见
Columns()
、Rows
、Range
、Cells
)通过它们前面点(.
)引用Worksheets("MilestoneDueDate")
iCol
正在运行Find()
方法设置,范围尽可能受限制