excel - 如果有 2 个连续的空行,则删除行
问题描述
我想要做的是删除行,如果有 2 个连续的空行,并且还要删除标题和第一组数据行之间的空行。这是我的原始 输入和我想要的是这个。我试图在这里和那里找到一些代码并想出这个代码。
Sub Testing()
Dim i As Long , lRow As Long
Dim ws As Worksheet
Set ws = Activesheet
With ws
With .Range("C:C")
fr = .Find(what:="*", after:=.Cells(1, 1), LookIn:=xlValues).row
If fr > 2 Then
.Rows("2:" & fr - 1).EntireRow.Delete
End If
End With
i = 1
For i = 1 To lRow
If IsEmpty(Cells(i, 3)) And IsEmpty(Cells(i + 1, 3)) Then
.Rows(i).EntireRow.Delete
End If
Next i
End With
End Sub
但是,数据集中间仍然有一些连续的空行。我知道那是因为我正在增加i
它将查看下一个单元格,但我不知道如何解决它。我是 vba 的新手,甚至是 SO 发布的新手,所以如果我做错了什么,请告诉我,并感谢您的帮助。
解决方案
您唯一需要做的就是向后循环。代替
For i = 1 To lRow
做
For i = lRow To 1 Step -1
这是因为从底部循环对尚未处理的行的行计数没有任何影响,但从上到下循环会。
您也可以在它没有任何影响i = 1
之前跳过它,因为从指定为下限的任何内容开始。For
For
i
我认为您的代码只是一个示例,但以防万一注意lRow
从未在您的代码中设置为值,因此是0
.
请注意,在这一行
If IsEmpty(Cells(i, 3)) And IsEmpty(Cells(i + 1, 3)) Then
您的Cells
对象没有被引用到With
语句表,因为您在一开始就忘记了.
。它应该是
If IsEmpty(.Cells(i, 3)) And IsEmpty(.Cells(i + 1, 3)) Then
此外,我强烈建议您使用Range.Find 方法
fr = .Find(what:="*", after:=.Cells(1, 1), LookIn:=xlValues).row
您始终将LookAt
参数指定为xlWhole
or xlPart
(请参阅XlLookAt)。因为该LookAt
参数没有默认值(很遗憾),如果您没有指定它,VBA 将使用用户界面或 VBA最后xlWhole
使用的任何一个或任何内容。因此,您无法知道以前使用过哪一个,它会变得非常随机(或者您的代码有时可能有效,有时无效)。xlPart
替代(更快)方法……</h3>
…是保持前向循环并收集所有要删除的行在一个变量RowsToDelete
中,以便最终一次删除它们。它快得多,因为每个删除操作都需要时间,在这种方法中,您只有一个删除操作……而在另一种方法中,每行一个删除操作。
Dim RowsToDelete As Range
For i = 1 To lRow 'forward loop is no issue here because we just collect
If IsEmpty(.Cells(i, 3)) And IsEmpty(.Cells(i + 1, 3)) Then
If RowsToDelete Is Nothing Then 'first row
Set RowsToDelete = .Rows(i).EntireRow
Else 'append more rows with union
Set RowsToDelete = Application.Union(RowsToDelete, .Rows(i).EntireRow)
End If
End If
Next i
'delete all collected rows (after the loop, so delete doesn't affect row counting of the loop)
If Not RowsToDelete Is Nothing Then
RowsToDelete.Delete
End If
推荐阅读
- sql - 如果存在相同 ID 的其他条目,则 SQL 获取最小值,同时忽略默认日期
- javascript - 我的 if 运行了两次,我希望它使用 -400 只运行一次
- c# - 使用 HTTP 进行测试
- node.js - google api auth 数据存储在节点的什么位置?
- python - 由于其中有空格而找不到文件
- mysql - 恢复使用 --no-create-info 创建的 mysqldump 并希望跳过当前数据库中不存在的表
- django - 返回查询集时如何仅计算()特定字段上的不同值
- node.js - Node.js TCP 客户端使用“net”包与远程服务器通信
- google-apps-script - 单击按钮后需要警报确认操作已执行
- c++ - 错误:由于要求 '!is_signed,static_assert 失败
::value' "" static_assert((!is_signed<_Tp>::value), "");