Excel VBA多条件搜索获取全部匹配结果的代码优化问题
问题解决方案
现有代码的问题主要有两点:
- 匹配到第一条符合全部条件的记录后直接执行
Exit Do跳出循环,终止了后续查找逻辑 - 仅使用单个
Found对象存储匹配结果,无法承载多条匹配记录
修改后的完整代码
Dim MatchRows As New Collection ' 存储所有符合条件的行 Dim rngSearch As Range Dim Found As Range Dim Firstfound As String Set rngSearch = Sheets(Temp_Bereich).Range("A:M") Set Found = rngSearch.Find(What:=Material_A, _ LookIn:=xlValues, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False) If Not Found Is Nothing Then Firstfound = Found.Address Do ' 匹配到所有条件时将行存入集合,不跳出循环 If Found.EntireRow.Range("B1").Value = Material_B And _ Found.EntireRow.Range("C1").Value = Schmierzustand_AB And _ Found.EntireRow.Range("G1").Value = Rauheit_A And _ Found.EntireRow.Range("H1").Value = Rauheit_B And _ Found.EntireRow.Range("D1").Value = Schmiermittel_AB Then MatchRows.Add Found.EntireRow ' 将匹配行加入集合 End If Set Found = rngSearch.FindNext(After:=Found) ' 遍历回到第一个查找结果时终止循环 If Found.Address = Firstfound Then Set Found = Nothing Loop Until Found Is Nothing End If ' 处理匹配结果 If MatchRows.Count > 0 Then Dim i As Integer ' 示例1:将所有匹配结果输出到当前工作表O列起的位置,可根据需求调整输出位置 For i = 1 To MatchRows.Count MatchRows(i).Range("A1:M1").Copy Cells(i, "O") ' 示例2:如果需要给控件赋值,可根据需求取对应行的值,示例默认保留原逻辑取第一条赋值 If i = 1 Then Haftreibwert.Value = MatchRows(i).Cells(1, 12).Value Gleitreibwert.Value = MatchRows(i).Cells(1, 13).Value End If Next ' 跳转到第一条匹配结果 Application.Goto MatchRows(1) Else MsgBox "Es trifft leider nichts auf alle 6 Kriterien zu ", , "Kein Match gefunden" End If
关键修改说明
- 新增
Collection类型的MatchRows对象,用于存储所有符合全部条件的行记录,解决单对象只能存单条结果的问题 - 移除了原匹配逻辑后的
Exit Do语句,匹配到符合条件的记录后仅存入集合,继续执行后续查找逻辑,直到遍历完所有符合Material_A的单元格 - 结果输出部分支持自定义:可以批量输出到表格指定区域,也可以按需提取对应行的字段值赋值给控件
- 保留了原有的错误提示逻辑,无匹配结果时正常弹出提示框
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

