VBA代码删除不正确的行

我有这个代码删除行,如果它有列D到L空单元格。
由于某种原因,这也是删除我的标题单元格位于C8。
有人知道为什么 以及如何解决它?

Sub RemoveEmptyRows() Dim ws As Worksheet For Each ws In Sheets ws.Activate Dim n As Long Dim nlast As Long Dim rw As Range Set rw = ActiveWorkbook.ActiveSheet.UsedRange.Rows nlast = rw.count For n = nlast To 1 Step -1 If (rw.Cells(n, 4).Value = "" And rw.Cells(n, 5).Value = "" And rw.Cells(n, 6).Value = "" And rw.Cells(n, 7).Value = "" And rw.Cells(n, 8).Value = "" And rw.Cells(n, 9).Value = "" And rw.Cells(n, 10).Value = "" And rw.Cells(n, 11).Value = "") Then rw.Rows(n).Delete End If Next n Next ws End Sub 

问题是,您正在使用UsedRange行列索引,并假定它们与Worksheet的索引匹配。 事实并非如此。 正如你在评论中对@YowE3K指出的,你有一些完全空的列。

解决scheme非常简单 – 只需使用ws.Cells而不是rw.Cells 。 我也会把所有的东西都放在一个With块中,以使它更快,更可读。 您也可以通过将其转换为Select Case梯形图来将该If语句短路:

 Sub RemoveEmptyRows() Dim ws As Worksheet For Each ws In ThisWorkbook.Sheets With ws Dim n As Long Dim nlast As Long nlast = .UsedRange.Rows(.UsedRange.Rows.Count).Row For n = nlast To 9 Step -1 Select Case False Case .Cells(n, 4).Value = vbNullString Case .Cells(n, 5).Value = vbNullString Case .Cells(n, 6).Value = vbNullString Case .Cells(n, 7).Value = vbNullString Case .Cells(n, 8).Value = vbNullString Case .Cells(n, 9).Value = vbNullString Case .Cells(n, 10).Value = vbNullString Case .Cells(n, 11).Value = vbNullString Case Else .Rows(n).Delete End Select Next n End With Next ws End Sub 

请注意,还有更可靠的方法来查找工作表的最后一行。

你的标题是在C8,然后不要删除,直到行号1:

更换

 For n = nlast To 1 Step -1 

通过

 For n = nlast To 9 Step -1 

这里是你的代码稍加修改。

 Sub RemoveEmptyRows() Dim ws As Worksheet Dim n As Long Dim nlast As Long Dim rw As Range For Each ws In Worksheets 'changed. In case there are Chart Sheets. 'deleted ws.activate. AVOID THAT AS PLAGUE Set rw = ws.UsedRange.Rows With rw nlast = .Count For n = nlast To 2 Step -1 'Note the 2, to skip title row. As was pointed in comments. If (.Cells(n, 4).Value2 = "" And .Cells(n, 5).Value2 = "" And .Cells(n, 6).Value2 = "" And .Cells(n, 7).Value2 = "" And .Cells(n, 8).Value2 = "" And .Cells(n, 9).Value2 = "" And .Cells(n, 10).Value2 = "" And .Cells(n, 11).Value2 = "") Then .Rows(n).Delete End If Next n End With 'rw Next ws End Sub 

你可以试试这个(未经testing)代码:

 Sub RemoveEmptyRows() Dim ws As Worksheet Dim nCols As Long For Each ws In Sheets With Intersect(.Range("D:K"), .UsedRange) nCols = .Columns.Count With .SpecialCells(xlCellTypeBlanks) For iArea = .Areas.Count To 1 Step -1 If .Areas(iArea).Count = nCols Then .Areas(iArea).EntireRow.Delete Next End With End With Next ws End Sub