当C-M列中的所有数据都为0时,有人能告诉我如何编写VBA代码来删除所有行吗。如果在除0之外的任何列中有任何内容,我需要保留该行。
我找到的所有信息都显示了如何删除一行,但仅基于一列。
将要使用的文件的范围从5行到1500行不等。
BigBen建议的替代方案。假设我们有m行数据,那么:
- 将细胞的m乘C-m块读取为2D阵列(矩阵(
- 求和矩阵的每一行,如果为零,则需要删除该行
- 从电子表格底部开始删除行(即第m行(
最后一步很重要,如果删除行时从头开始,最终会跳过一些行。例如,如果删除了第5行,那么第6行将变为第5行。当您移动到下一行时,您跳过了原来的第6行,因为所有行都向上移动了一行。
从性能角度来看,BigBens的评论可能更快。如果你的工作簿中永远不会超过1500行,那么这种方法也应该很快。
for rw=1 to 1500 'loop through your rows
'test if columns are empty
if application.worksheetfunction.counta(range(cells(rw,3),cells(rw,13)))=0 then
Cells(rw, 1).EntireRow.Delete 'delete row of empty columns
endif
next rw
我假设您将以列A作为主列,其中包含所有记录的数据,如果适用,请尝试以下代码:
Sub checkrows()
Range("A2").Select
While ActiveCell <> ""
c = 3
i = 0
For c = 3 To 13
r = ActiveCell.Row
If Cells(r, c).Value = "" Then i = i + 1
Next
If i = 11 Then
Selection.EntireRow.Delete
ActiveCell.Offset(-1, 0).Select
End If
ActiveCell.Offset(1, 0).Select
Wend
End Sub
我假设你的问题是"删除某些列中单元格为零的每一行">
一种检查单元格是否为0:的简单方法
=(C2 <> 0)
范围也是如此
{=(C2:M2 <> 0)}
这将返回一个值数组喜欢{FALSEFALSETRUEFALSE...FALSETRUEFALSEFALSE}
我们知道这个数组的和就足够了:如果它大于零,那么该范围包含除零之外的单元格。转换布尔值使用N((函数将TRUE\FALSE设置为1\0,并使用通常的sum((求和
=SUM(N(C2:M2<>0))
这将适用于数字和空单元格。但从Excel的角度来看,包含文本的单元格并不等于零。我们如何知道我们的范围中有多少文本单元格?
=COUNTA(C2:M2)-COUNT(C2:M2)
我们需要从总额中减去这个数额
=SUM(N(C2:M2<>0))-COUNTA(C2:M2)+COUNT(C2:M2)
如何在VBA宏代码中使用此公式?带Evaluate((:
Sub removeZeroRows()
Dim rData As Range
Dim sRange As String
Dim i As Long
Set rData = ActiveSheet.UsedRange
Application.ScreenUpdating = False
For i = rData.Rows.Count To 2 Step -1
sRange = Application.Intersect(rData.Rows(i), ActiveSheet.Columns("C:M")).Address
If (Evaluate("=SUM(N(" & sRange & "<>0))-COUNTA(" & sRange & ")+COUNT(" & sRange & ")") = 0) Then rData.Rows(i).Delete
Next i
Application.ScreenUpdating = True
End Sub