如何将VBA的Find与FindNext查询结果合并为Range对象
实现VBA多匹配结果合并为单个Range对象的方法
核心思路:新增一个专用Range变量存储所有匹配结果,每次找到匹配项后用Union方法合并到该变量即可。
完整修改后代码
Dim searchRange As Range Set searchRange = ActiveWorkbook.Sheets(SHEET).Range(SEARCHFOLDERCOLUMN & SEARCHSTARTROW & ":" & SEARCHFOLDERCOLUMN & lastRow) '搜索目标值 Dim searchResult As Range Dim firstAddress As String ' 新增变量存储所有匹配结果 Dim allResults As Range Set searchResult = searchRange.Find(what:=sSearchFolder, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False) If Not searchResult Is Nothing Then firstAddress = searchResult.Address Do ' 把当前找到的单元格合并到结果集合 If allResults Is Nothing Then Set allResults = searchResult Else Set allResults = Union(allResults, searchResult) End If '打印找到的单元格地址 Debug.Print searchResult.Address '查找下一个匹配项 Set searchResult = searchRange.FindNext(searchResult) '当回到第一个匹配地址时退出循环,避免死循环 If firstAddress = searchResult.Address Then Exit Do End If Loop While Not searchResult Is Nothing End If ' 输出最终组合Range的地址 If Not allResults Is Nothing Then Debug.Print "所有匹配单元格地址:" & allResults.Address End If Debug.Print "退出循环"
关键逻辑说明
- 提前声明
allResults作为最终结果容器,初始状态为Nothing - 首次匹配到结果时直接赋值给
allResults,后续匹配项统一用Union方法合并 - 调整了结果处理和查找下一个的顺序,避免遗漏第一个匹配项,也不会重复添加
- 最终
allResults就是包含所有匹配单元格的组合Range,直接调用allResults.Address即可得到你需要的逗号分隔的地址字符串
注意:使用最终结果前建议先判断
If Not allResults Is Nothing Then再进行后续操作,避免无匹配结果时报错。
内容的提问来源于stack exchange,提问作者smirnoff103
相关产品推荐
相关产品推荐

