如何用Excel AutoFilter同时筛选两列含指定值的行并保留数据结构?
实现B列或C列含特定值的筛选方案
可以通过以下两种变通方法实现需求,同时保留数据集的排序与结构:
方案1:辅助列+手动筛选(无需VBA)
- 在数据区域右侧插入新列(例如S列),在该列的第一个数据行(如S2)输入公式:
=OR(ISNUMBER(SEARCH("102",B2)),ISNUMBER(SEARCH("102",C2))) - 下拉填充公式至数据最后一行,公式会为符合条件的行返回
TRUE,不符合的返回FALSE - 对该辅助列筛选
TRUE,即可只显示B列或C列包含102的行
方案2:修改VBA代码实现自动化筛选
写法1:利用AutoFilter的「或」运算符
直接调整原代码,添加C列的筛选条件并使用xlOr运算符:
Sub Filter_Or_Criteria() Dim ws As Worksheet Set ws = ThisWorkbook.ActiveSheet Dim lastRow As Long lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row Dim rng As Range Set rng = ws.Range("A1:R" & lastRow) '需包含表头,AutoFilter依赖表头识别列 '清除现有筛选状态 If ws.AutoFilterMode Then ws.AutoFilterMode = False '设置筛选规则:B列(Field:=2)含102 或 C列(Field:=3)含102 rng.AutoFilter Field:=2, Criteria1:="*102*", Operator:=xlOr, _ Field:=3, Criteria2:="*102*" End Sub
写法2:高级筛选(适配更复杂条件场景)
如果后续需要扩展更多筛选条件,高级筛选更稳定:
Sub AdvancedFilter_Or_Criteria() Dim ws As Worksheet Set ws = ThisWorkbook.ActiveSheet Dim lastRow As Long lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row Dim dataRng As Range Set dataRng = ws.Range("A1:R" & lastRow) '创建临时条件区域(放在数据下方,执行后自动清理) Dim criteriaRng As Range Set criteriaRng = ws.Range("A" & lastRow + 2 & ":C" & lastRow + 3) '注意:替换下面的「B列表头」「C列表头」为你表格中对应列的实际表头文字 criteriaRng.Cells(1, 2).Value = "B列表头" criteriaRng.Cells(2, 2).Value = "*102*" criteriaRng.Cells(1, 3).Value = "C列表头" criteriaRng.Cells(2, 3).Value = "*102*" '清除现有筛选 If ws.AutoFilterMode Then ws.AutoFilterMode = False '执行原地高级筛选 dataRng.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=criteriaRng '清理临时条件区域 criteriaRng.ClearContents criteriaRng.Delete Shift:=xlUp End Sub
方案对比
- 方案1适合手动操作场景,无需代码,直观易维护
- 方案2适合自动化需求,其中AutoFilter写法简洁高效,高级筛选更适配复杂多条件场景
内容的提问来源于stack exchange,提问作者Waleed
相关产品推荐
相关产品推荐

