如何修改Excel VBA导航宏 实现仅遍历符合指定列条件的行
解决方案
你可以先将所有符合筛选条件的行号存入全局数组,后续所有导航逻辑直接从数组中读取行号即可,无需改动原有导航的核心逻辑。以下是完整修改后的代码:
第一步:模块顶部声明全局变量
把以下代码放在当前模块所有子程序的最上方,所有导航宏(上一条、下一条、最后一条)都可以共用这两个变量:
Dim arrMatchRows As Variant ' 存储所有符合筛选条件的行号 Dim lMatchCount As Long ' 符合筛选条件的总记录数
第二步:新增筛选匹配子程序
新增专门负责筛选符合条件行的子程序,后续筛选规则修改、数据源更新都可以调用这个子程序刷新:
Sub RefreshMatchRows() Dim historyWks As Worksheet Dim lastRow As Long, i As Long, tempArr As Variant Set historyWks = Worksheets("dataSheet") ' 取datasheet的最后一行数据行号 lastRow = historyWks.Cells(Rows.Count, 1).End(xlUp).Row ReDim tempArr(1 To lastRow) lMatchCount = 0 ' 遍历所有行筛选符合条件的记录 ' 这里默认第1行是表头,所以从第2行开始遍历,无表头就把i的初始值改成1 For i = 2 To lastRow ' 筛选规则:第5列值等于"Test",需要改规则直接修改这一行即可 If historyWks.Cells(i, 5).Value = "Test" Then lMatchCount = lMatchCount + 1 tempArr(lMatchCount) = i End If Next i ' 处理匹配结果 If lMatchCount > 0 Then ReDim Preserve tempArr(1 To lMatchCount) arrMatchRows = tempArr Else arrMatchRows = Array() MsgBox "未找到符合筛选条件的记录" End If End Sub
第三步:修改原导航宏
Sub ViewLogFirst() Dim historyWks As Worksheet Dim InputWks As Worksheet Dim lRec As Long Dim lRecRow As Long Application.EnableEvents = False Set InputWks = Worksheets("visibleSheet") Set historyWks = Worksheets("dataSheet") ' 首次运行未加载匹配记录时自动刷新,数据源更新后也可以手动调用RefreshMatchRows刷新 If lMatchCount = 0 Then RefreshMatchRows If lMatchCount = 0 Then GoTo exitHandler With InputWks .Range("CurrRec").Value = 1 lRec = .Range("CurrRec").Value ' 从匹配数组中取对应行号,替换原来直接计算行号的逻辑 lRecRow = arrMatchRows(lRec) .Range("A2").Value = historyWks.Cells(lRecRow, 1) .Range("A3").Value = historyWks.Cells(lRecRow, 2) End With exitHandler: Application.EnableEvents = True End Sub
其他说明
如果你还有上一条、下一条、跳转到最后一条的其他导航宏,只需要参照上面的逻辑,把原代码里计算lRecRow的部分替换为从arrMatchRows数组取值即可。
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

