我们经常被问到如何根据一列或多列中的条件删除行,我们可以使用SpecialCells技巧吗?
答案 0 :(得分:3)
首先,让我断言循环没有问题 - 他们肯定有自己的位置!
最近我们得到了以下情况:
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
时,该公式将返回 #NAsFormula = "=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
顺便说一下,如果你真的想要一个,那么 WITH A LOOP 也是可能的:)
还有一件事,在Excel 2010之前有8192行的限制(我认为因为这个功能一直回到8位版本的Excel可能 )
VBA传奇人物Ron de Bruin(在我的网站上我首先采用了这种技术)has something to say about this
菲利普
答案 1 :(得分: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
答案 2 :(得分:2)
这将删除通过函数
传递的行号m到ntoBits <- function (x, nBits = 8){
tail(rev(as.numeric(intToBits(x))),nBits)
}