Excel:基于某列单元格条件批量删除所有相关行
解决方法
方法1:辅助列+筛选删除
- 新增辅助列(比如C列),在C2单元格输入公式:
=COUNTIFS(A:A,A2,B:B,"No")>0,回车后下拉填充整列。这个公式会自动判断当前行的Name对应的Condition列里是否存在"No",存在就返回TRUE,不存在返回FALSE。 - 选中整个数据区域(包含表头),点击「数据」选项卡的「筛选」按钮,在辅助列的筛选菜单里勾选「TRUE」,选中所有筛选出的行,右键选择「删除行」即可。
方法2:Power Query 批量处理
- 选中数据区域,点击「数据」选项卡的「从表格/区域」,确认表格包含表头后进入Power Query编辑器。
- 选中「Name」列,点击「转换」选项卡的「分组依据」,设置分组列为
Name,新列名设为HasNo,操作选择「自定义」,然后把默认公式改成:List.Contains([Condition], "No"),点击确定后,会得到每个Name是否包含"No"的结果。 - 点击「合并查询」-「合并查询作为新查询」,选择原数据表格和刚才分组后的表格,匹配列选
Name,合并类型选「左外部」。 - 展开合并后的列,只保留
HasNo列,筛选出HasNo为TRUE的行,选中这些行右键删除,最后点击「关闭并上载」,结果就会同步到Excel中。
方法3:VBA 一键处理
按下Alt+F11打开VBA编辑器,右键点击当前工作簿,选择「插入」-「模块」,粘贴以下代码:
Sub DeleteRowsWithNo() Dim ws As Worksheet Dim lastRow As Long Dim nameDict As Object Dim i As Long Set ws = ActiveSheet lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row Set nameDict = CreateObject("Scripting.Dictionary") ' 先标记所有包含"No"的Name For i = 2 To lastRow If ws.Cells(i, "B").Value = "No" Then nameDict(ws.Cells(i, "A").Value) = True End If Next i ' 从下往上删除对应行 For i = lastRow To 2 Step -1 If nameDict.exists(ws.Cells(i, "A").Value) Then ws.Rows(i).Delete End If Next i End Sub
回到Excel,按下Alt+F8,选择DeleteRowsWithNo宏并运行,即可自动删除所有符合条件的行。
内容的提问来源于stack exchange,提问作者Andrew Czeizler
相关产品推荐
相关产品推荐

