3

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

4

3 回答 3

6

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

Sub Delete_Multiple_Rows (m as Integer, n as Integer) 

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

End Sub
于 2016-01-12T13:06:58.490 回答
4

首先,让我明确地说,循环没有任何问题——它们当然有自己的位置!

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

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

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

我建议这是一个示例,我们可以使用 SpecialCells 和临时错误列来识别要删除的行。

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

=IF(AND(A:A="",E:E<>""),"DELETE THIS ROW","LEAVE THIS ROW")

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

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

=NA()

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

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

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!

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

sFormula = "=IF(AND(A:A="""",E:E<>""""),NA(),"""")"

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

Range("H5:H" & Range("E65536").End(xlUp).Row).Formula = sFormula

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

Range("H5:H" & Range("E65536").End(xlUp).Row).SpecialCells(xlCellTypeFormulas, xlErrors).entirerow.select

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

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

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

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

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

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

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

菲利普

于 2013-03-15T11:55:06.490 回答
3

或者,您可以使用自动过滤器:

Sub clearCells()
'
' Example code for StackOverflow post
'http://stackoverflow.com/questions/15431801/how-to-delete-multiple-rows-without-a-loop-in-excel-vba
'
Dim rngTable As Range
Dim ws As Worksheet
Dim StartCell As Range

Const ColumntoFilter1 As Integer = 1
Const FilterCriteria1 As String = "="
Const ColumntoFilter2 As Integer = 5
Const FilterCriteria2 As String = "<>"

Set ws = ActiveSheet
'Set the starting position (Top-left most position) of your data range
Set StartCell = ws.Range("A1")

'Turn off autofilter in case it's already active
ws.AutoFilterMode = False
'Define data table
Set rngTable = StartCell.CurrentRegion
'Filter and delete data
With rngTable
    .AutoFilter Field:=ColumntoFilter1, Criteria1:=FilterCriteria1
    .AutoFilter Field:=ColumntoFilter2, Criteria1:=FilterCriteria2
    .Offset(1, 0).EntireRow.Delete
End With

'Turn filters off again
ws.AutoFilterMode = False

Set rngTable = Nothing
Set StartCell = Nothing
Set ws = Nothing
End Sub
于 2013-03-16T06:46:26.253 回答