【发布时间】:2016-12-14 20:43:12
【问题描述】:
如果 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的行索引不一定与工作表的行索引匹配。 -
好吧,代码有点乱。例如。在循环中定义变量让我感到恶心。但实际上它正在删除从第 4 (D) 列到第 11 (K) 列没有任何内容的每一行。因此,如果 D8:K8 中的单元格为空,则第 8 行将被删除。尝试使用 F8 单步执行您的代码。
-
我认为@Comintern 的评论可能是原因,但无论如何你总是使用行作为从
UsedRange开始的偏移量 - 它实际上是 columns 你没有从UsedRange的开头偏移。我敢打赌,您在 A、B 或 C 列中都有一个完全空的列,因此rw.Cells(n, 4)不是指 D 列(等) -
您是否只需将 For 循环更新为
For n= nlast to 2 step -1,因为标头已计入UsedRange? -
你的
UsedRange的例子是什么?