VBA-当所有列都为0时删除行

  • 本文关键字:0时 删除行 VBA- excel vba
  • 更新时间 :
  • 英文 :


当C-M列中的所有数据都为0时,有人能告诉我如何编写VBA代码来删除所有行吗。如果在除0之外的任何列中有任何内容,我需要保留该行。

我找到的所有信息都显示了如何删除一行,但仅基于一列。

将要使用的文件的范围从5行到1500行不等。

BigBen建议的替代方案。假设我们有m行数据,那么:

  1. 将细胞的m乘C-m块读取为2D阵列(矩阵(
  2. 求和矩阵的每一行,如果为零,则需要删除该行
  3. 从电子表格底部开始删除行(即第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

最新更新