如何删除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