如何在Excel VBA中不循环删除多行

Our*_*nas 4 excel vba

我们经常被问到如何根据一列或多列中的条件删除行,我们可以使用 SpecialCells 技巧来实现这一点吗?

小智 8

这将删除通过函数传递的行号 m 到 n

Sub Delete_Multiple_Rows (m as Integer, n as Integer) 

    Rows(m & ":" & n).EntireRow.Delete 

End Sub
Run Code Online (Sandbox Code Playgroud)

  • 一般来说,如果答案包含对代码的用途以及为什么可以解决问题的解释,那么答案会更有帮助。 (5认同)

Our*_*nas 5

首先,我要明确地说,循环没有任何问题- 它们确实有其用武之地!

最近,我们遇到了以下情况:

400000  |  Smith, John| 2.4   | 5.66|   =C1+D1
400001  |  Q, Suzy    | 4.6   | 5.47|   =C2+D2
400002  |  Schmoe, Joe| 3.8   | 0.14|   =C3+D3
Blank   |             |       |     |   #VALUE
Blank   |             |       |     |   #VALUE
Run Code Online (Sandbox Code Playgroud)

OP想要删除A列为空的行,但E列中有一个值。

我建议在这个示例中,我们可以利用 SpecialCells 和临时错误列来标识要删除的行。

考虑一下您可以添加 H 列来尝试识别这些行;在该行中,您可以使用如下公式:

=IF(AND(A:A="",E:E<>""),"DELETE THIS ROW","LEAVE THIS ROW")
Run Code Online (Sandbox Code Playgroud)

现在,可以让该公式在我测试返回 True 的行中放置错误。我们这样做的原因是 Excel 的一个称为 SpecialCells 的功能。

在 Excel 中选择任何空单元格,然后在公式栏中键入

=NA()
Run Code Online (Sandbox Code Playgroud)

接下来,按 F5 或 CTRL+G(“编辑”菜单上的“转到... ”),然后单击“特殊”按钮以显示“特殊单元格”对话框。

在该对话框中,单击“公式”旁边的单选按钮,清除下方的复选框,以便仅选择错误。现在单击“确定”

Excel 应该选择工作表中包含错误 ( #N/A ) 的所有单元格。

下面的代码利用了这个技巧,在 H 列中创建一个公式,将#N/A放入要删除的所有行中,然后调用 SpecialCells 来查找行,并清除(删除)它们...

    Sub clearCells()
    '
    Dim sFormula As String
    '
    ' this formula put's an error if the test returns true, 
    ' so we can use SpecialCells function to highlight the
    ' rows to be deleted!
Run Code Online (Sandbox Code Playgroud)

创建一个公式,当公式返回 TRUE 时,该公式将返回#NA

sFormula = "=IF(AND(A:A="""",E:E<>""""),NA(),"""")"
Run Code Online (Sandbox Code Playgroud)

将该公式放入 H 列中,以查找要删除的行...

Range("H5:H" & Range("E65536").End(xlUp).Row).Formula = sFormula
Run Code Online (Sandbox Code Playgroud)

现在使用 SpecialCells 突出显示要删除的行:

Range("H5:H" & Range("E65536").End(xlUp).Row).SpecialCells(xlCellTypeFormulas, xlErrors).entirerow.select
Run Code Online (Sandbox Code Playgroud)

这行代码将使用OFFSET仅突出显示 A 列,以防您想要放入一些文本或清除它,而不是删除整行

Range("H5:H" & Range("E65536").End(xlUp).Row).SpecialCells(xlCellTypeFormulas, xlErrors).Offset(0, -7).select
Run Code Online (Sandbox Code Playgroud)

下面的代码行将删除整行,因为我们可以:)

Range("H5:H" & Range("E65536").End(xlUp).Row).SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Delete shift:=xlup

' clean up the formula
Range("H5:H" & Range("E65536").End(xlUp).Row).Clear
'
End Sub
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果你真的想要一个,也可以使用循环:)

还有一件事,在 Excel 2010 之前,有 8192 行的限制(我想因为这个功能可能一直追溯到 Excel 的 8 位版本

VBA 传奇人物 Ron de Bruin(我首先在他的网站上学到了这项技术,等等)对此有话要说

菲利普