如何删除Excel VBA中没有循环的多行

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

首先,让我明确地说,循环没有任何错误 – 他们当然有它的位置!

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

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列有一个值。

我build议这是一个例子,我们可以利用SpecialCells和一个临时的错误列来标识要删除的行。

考虑你可能会添加一列H来尝试识别这些行; 在那一行你可以使用如下的公式:

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

现在,有可能得到这个公式在我testing的行中返回一个错误返回True。 我们这样做的原因是一个名为SpecialCells的Excel的function。

在Excel中select任何空单元格,并在公式栏types中

 =NA() 

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

在该对话框中,单击“公式”旁边的电台,然后清除checkbox,以便只select错误 。 现在点击OK

Excel应该已经select了工作表中的所有单元格,其中有一个错误( #N / A )。

下面的代码利用这个技巧,在列H中创build一个公式,将所有要删除的行中的#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时,创build将返回#NA的公式

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

把这个公式放在H列中,find要删除的行

 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行的限制 (我想是因为这个function可能一直回到Excel的8位版本

VBA的传奇人物Ron de Bruin(我首先在他的网站上拿起这个技巧,除此之外) 对此有些话要说

菲利普

或者,您可以使用自动filter:

 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 
 'this will delete row number 1 to 5 Sub Delete_Multiple_Rows () Rows(“1:5”).EntireRow.Delete End Sub 'this will delete row number from m to n Sub Delete_Multiple_Rows () dim m 'm is starting row number dim n 'n is ending row number m=1 n=5 'define m and n as per your choice Rows(m &":" & n).EntireRow.Delete end sub