Excel四万+行数据跨行列匹配:筛选指定条件的Model列表
解决方案:筛选符合条件的Model(Model Type=Interest 且对应Marge=Yes)
针对四万多行带空行、区块行数不固定的数据,提供两种可行方案:
一、Excel动态数组公式(适合Excel 365/2021及以上版本)
直接在空白单元格输入以下公式,自动返回所有符合条件的Model名称:
=FILTER( MID(FILTER(A:A,LEFT(A:A,6)="Model:"),8,LEN(FILTER(A:A,LEFT(A:A,6)="Model:"))-7), BYROW( FILTER(A:A,LEFT(A:A,6)="Model:"), LAMBDA(x, AND( INDEX(A:A,XLOOKUP("Model Type:",OFFSET(x,1,0):A$100000,"",,1)+ROW(x))="Interest", INDEX(A:A,XLOOKUP("Marge:",OFFSET(x,1,0):A$100000,"",,1)+ROW(x))="Yes" ) ) ) )
公式说明:
FILTER(A:A,LEFT(A:A,6)="Model:"):提取所有包含"Model:"的行MID(...,8,...):从"Model: "后截取Model名称BYROW(...,LAMBDA(...)):对每个Model行,检查两个核心条件:- 向下定位第一个"Model Type:",取其下一行值是否为
Interest - 向下定位第一个"Marge:",取其下一行值是否为
Yes
- 向下定位第一个"Model Type:",取其下一行值是否为
- 最终返回同时满足两个条件的Model名称
二、VBA宏(适合大数据量,运行更高效)
按Alt+F11打开VBA编辑器,插入模块后粘贴以下代码,运行后会自动生成「筛选结果」工作表并输出符合条件的Model:
Sub FilterInterestModelsWithYesMarge() Dim ws As Worksheet, wsResult As Worksheet Dim lastRow As Long, i As Long, modelRow As Long Dim modelName As String Dim isInterest As Boolean, hasYesMarge As Boolean Set ws = ActiveSheet lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 创建或激活结果工作表 On Error Resume Next Set wsResult = ThisWorkbook.Worksheets("筛选结果") If Err.Number <> 0 Then Set wsResult = ThisWorkbook.Worksheets.Add wsResult.Name = "筛选结果" End If On Error GoTo 0 wsResult.Cells.Clear wsResult.Range("A1").Value = "符合条件的Model" modelRow = 0 For i = 1 To lastRow ' 定位Model区块起始行 If Left(ws.Cells(i, "A").Value, 6) = "Model:" Then isInterest = False hasYesMarge = False modelName = Mid(ws.Cells(i, "A").Value, 8) modelRow = i ElseIf modelRow > 0 Then ' 在当前区块内匹配条件 Select Case ws.Cells(i, "A").Value Case "Model Type:" isInterest = (ws.Cells(i + 1, "A").Value = "Interest") Case "Marge:" hasYesMarge = (ws.Cells(i + 1, "A").Value = "Yes") Case "" ' 区块结束,判断是否符合条件 If isInterest And hasYesMarge Then wsResult.Cells(wsResult.Rows.Count, "A").End(xlUp).Offset(1).Value = modelName End If modelRow = 0 End Select End If Next i ' 处理无空行结尾的最后一个区块 If modelRow > 0 And isInterest And hasYesMarge Then wsResult.Cells(wsResult.Rows.Count, "A").End(xlUp).Offset(1).Value = modelName End If MsgBox "筛选完成,结果已保存到「筛选结果」工作表", vbInformation End Sub
代码逻辑:
- 遍历所有行,识别每个Model区块的起始位置
- 在区块内查找
Model Type:和Marge:对应的取值 - 遇到空行(区块结束)时,判断是否同时满足两个条件,符合则写入结果表
- 兼容无空行结尾的最后一个区块
内容的提问来源于stack exchange,提问作者Ani
相关产品推荐
相关产品推荐

