如何用VBA宏删除XXX状态订单并仅保留Z、L、ZR类型订单?
实现指定条件删除Excel行的VBA方案
前提说明
- 请先确认你的数据对应的列号,以下示例默认状态字段在A列、订单类型字段在B列、第1行为表头,实际使用时可以修改代码中的列号参数
- 运行代码前请先备份原始数据,避免误操作导致数据丢失
小提示:如果你的SAP导出数据字段前后带有多余空格,可以把代码中的
ws.Cells(i, xxx).Value替换为Trim(ws.Cells(i, xxx).Value),即可自动忽略空格匹配。
方案1:逐行倒序删除(逻辑简单,适合初学者修改)
优点:逻辑清晰,仅需要修改开头的3个常量参数即可适配你的表格,无需调整核心逻辑
缺点:数据量超过1万行时运行速度较慢
Sub DeleteInvalidOrders() Dim ws As Worksheet Dim lastRow As Long Dim i As Long ' 配置参数:根据你的实际表格修改对应数字,A列为1、B列为2以此类推 Const STATUS_COLUMN As Integer = 1 ' 状态字段所在列 Const ORDER_TYPE_COLUMN As Integer = 2 ' 订单类型字段所在列 Const HEADER_ROW As Integer = 1 ' 表头所在行 Set ws = ActiveSheet ' 也可以替换为 Set ws = ThisWorkbook.Sheets("你的工作表名称") lastRow = ws.Cells(ws.Rows.Count, STATUS_COLUMN).End(xlUp).Row ' 获取数据最后一行行号 ' 倒序遍历:从最后一行往表头方向遍历,避免删除行后漏检数据 For i = lastRow To HEADER_ROW + 1 Step -1 ' 第一判断条件:状态为XXX直接删除 If ws.Cells(i, STATUS_COLUMN).Value = "XXX" Then ws.Rows(i).Delete Else ' 第二判断条件:订单类型不是Z/L/ZR则删除 Select Case UCase(ws.Cells(i, ORDER_TYPE_COLUMN).Value) ' UCase用于忽略大小写,不需要可以删除 Case "Z", "L", "ZR" ' 符合保留条件,不做操作 Case Else ws.Rows(i).Delete End Select End If Next i Application.ScreenUpdating = True MsgBox "无效订单行删除完成!" End Sub
方案2:自动筛选删除(效率高,适合1万行以上大数据量)
Sub DeleteInvalidOrdersFast() Dim ws As Worksheet Dim lastRow As Long Dim rng As Range ' 配置参数:和方案1一致,根据你的实际表格修改 Const STATUS_COLUMN As Integer = 1 Const ORDER_TYPE_COLUMN As Integer = 2 Const HEADER_ROW As Integer = 1 Set ws = ActiveSheet lastRow = ws.Cells(ws.Rows.Count, STATUS_COLUMN).End(xlUp).Row Set rng = ws.Range(ws.Cells(HEADER_ROW, 1), ws.Cells(lastRow, ORDER_TYPE_COLUMN)) ' 覆盖全部数据的区域 ' 关闭屏幕更新和提示提升运行速度 Application.ScreenUpdating = False Application.DisplayAlerts = False ' 第一步:删除状态为XXX的行 rng.AutoFilter Field:=STATUS_COLUMN, Criteria1:="XXX" If rng.Columns(1).SpecialCells(xlCellTypeVisible).Count > 1 Then rng.Offset(1, 0).Resize(rng.Rows.Count - 1).SpecialCells(xlCellTypeVisible).EntireRow.Delete End If ws.AutoFilterMode = False ' 重新计算删除后的最后一行行号 lastRow = ws.Cells(ws.Rows.Count, STATUS_COLUMN).End(xlUp).Row Set rng = ws.Range(ws.Cells(HEADER_ROW, 1), ws.Cells(lastRow, ORDER_TYPE_COLUMN)) ' 第二步:删除订单类型不是Z/L/ZR的行 rng.AutoFilter Field:=ORDER_TYPE_COLUMN, Criteria1:=Array("Z", "L", "ZR"), Operator:=xlFilterValues ' 隐藏符合保留条件的行,剩余可见行即为需要删除的内容 rng.Offset(1, 0).Resize(rng.Rows.Count - 1).EntireRow.Hidden = True ws.AutoFilterMode = False If rng.Columns(1).SpecialCells(xlCellTypeVisible).Count > 1 Then rng.Offset(1, 0).Resize(rng.Rows.Count - 1).SpecialCells(xlCellTypeVisible).EntireRow.Delete End If ' 恢复显示符合保留条件的行 ws.Rows.Hidden = False ' 恢复系统默认设置 Application.ScreenUpdating = True Application.DisplayAlerts = True MsgBox "无效订单行删除完成!" End Sub
使用方法
- 打开你的Excel文件,按
Alt+F11打开VBA编辑器 - 右键点击左侧面板中你的工作簿名称,选择「插入」-「模块」
- 把选择的方案代码粘贴到弹出的空白模块窗口中
- 修改代码开头的3个常量参数,匹配你自己表格的列号和表头行
- 按
F5运行即可
内容的提问来源于stack exchange,提问作者IUEthan
相关产品推荐
相关产品推荐

