原创作者:李锐
微信公众号:VBA应用大全(VbaApp)
一句话核心价值点:用不到30行的VBA,把你在表格里翻来翻去、函数筛不出、数据透视表做不了的批量删行活一次办妥,让2026年的办公像按快门一样省事。
办公室常见场面:销售表里要找出“地区=华北 & 销量<500 & 客户类型=新客”,再把它们整行删掉。用函数写多条件,得套一堆IF+MATCH,公式一长屏幕都拐弯,还容易因单元格引用错位漏删。
Sub 多条件删行()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim i As Long, lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = lastRow To 2 Step -1
If ws.Cells(i, "B").Value = "华北" And _
ws.Cells(i, "C").Value < 500 And _
ws.Cells(i, "D").Value = "新客" Then
ws.Rows(i).Delete
End If
Next i
End Sub原理很简单:从最后一行往上扫,避免删行后序号乱跳。三个条件用And绑死,必须全符合才执行删除。VBA不怕条件多,只管在If里加判断,比函数拼长串清爽得多,小白改改列号就能用。
有时候数据上万行,函数算完卡半分钟,透视表能分组统计却不能直接删原始行。你想按“部门=售后 & 状态=已结 & 完成天数>30”批量清掉,透视表只能让你看结果,手动点删要点到天黑。
Sub 透视表搞不定的删行()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim i As Long, lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = lastRow To 2 Step -1
If ws.Cells(i, "E").Value = "售后" And _
ws.Cells(i, "F").Value = "已结" And _
ws.Cells(i, "G").Value > 30 Then
ws.Rows(i).Delete
End If
Next i
End Sub原理就是让电脑替你盯全表,一秒扫几千行不喘气。透视表擅长归纳视角,但动手改源数据得靠别的工具,VBA正好补上这个缺口。
遇到“如果A列日期在2026年1月且C列产品=配件且D列库存=0就删行”,这种跨三列又夹着日期范围的,手工筛选要点好几回,还容易眼花勾错。
Sub 跨列逻辑删行()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim i As Long, lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = lastRow To 2 Step -1
If ws.Cells(i, "A").Value >= #1/1/2026# And _
ws.Cells(i, "A").Value <= #1/31/2026# And _
ws.Cells(i, "C").Value = "配件" And _
ws.Cells(i, "D").Value = 0 Then
ws.Rows(i).Delete
End If
Next i
End Sub原理是把日期范围包进判断,VBA认得#号里的日期格式,跨列条件一次写完,不必分几步筛选。比起人工来回勾选,这法子稳且不累眼。
每月客户黑名单会变,比如这次要删“客户名在动态区域Z2:Z50里且订单额<1000”的行。函数得每次改引用范围,透视表没法随区域伸缩自动筛。
Sub 动态名单删行()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim i As Long, lastRow As Long
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim rng As Range, cell As Range
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set rng = ws.Range("Z2:Z50")
For Each cell In rng
If Not IsEmpty(cell.Value) Then
dict(cell.Value) = ""
End If
Next cell
For i = lastRow To 2 Step -1
If dict.exists(ws.Cells(i, "B").Value) And _
ws.Cells(i, "C").Value < 1000 Then
ws.Rows(i).Delete
End If
Next i
End Sub原理是用字典装名单,查找飞快。区域内容一变,代码不用改,只要Z列更新就行。VBA能跟动态数据共舞,函数固定引用就没这么灵。
有些行看着正常,其实某列含不可见字符或前后空格,导致函数匹配失败,比如“ 华北 ”带空格,等于没筛出来。VBA可以先清掉干扰再判断。
Sub 清干扰删行()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim i As Long, lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = lastRow To 2 Step -1
Dim area As String
area = Trim(ws.Cells(i, "B").Value)
If area = "华北" And _
ws.Cells(i, "C").Value < 500 And _
Trim(ws.Cells(i, "D").Value) = "新客" Then
ws.Rows(i).Delete
End If
Next i
End Sub原理是Trim去掉首尾空格,让比较更诚实。VBA能在判断前先洗数据,减少因脏数据造成的漏删。函数公式对这类隐形差异往往无感。
函数是照着地图找路,VBA是直接开车到终点。
多条件删行这活,交给VBA就像请了个不喊累的助手。
不怕条件怪,不怕数据乱,代码一跑全摆平。
学一点VBA,重复劳动就少一点,时间多到能喝杯茶。
表格里的繁杂删行,不是非得手动熬,也不是函数硬扛,VBA用短代码就能把难题拆成爽快步骤。敢试的人,已在2026年的办公桌上悄悄领先。


原创作者: 李锐
微信公众号:VBA应用大全(VbaApp)

干货教程 · 信息分享
