Excel VBA隐藏行下Find方法异常:foundCell返回空值求助
问题分析
你的问题核心是Range.Find函数在目标单元格处于隐藏行时无法定位,原因在于:
- 当传入
row=77时,after参数指向的Cells(77, "B")属于隐藏的40-82行范围; - 使用
SearchDirection:=xlPrevious时,Excel的Find函数从after单元格的前一个单元格开始向上搜索,若after单元格本身处于隐藏行,搜索范围会被限制在可见区域内,导致无法定位到同样在隐藏区域的目标单元格(Cells(74, "B")); - 当40-82行可见,或传入
row=73(73行不在隐藏范围内,after单元格可见)时,搜索范围不受限制,因此能正常找到目标。
解决方案
修改Find函数的调用逻辑,规避隐藏行对after参数的影响,有两种可行方案:
方案1:将after参数指定为列的最后一个单元格,确保搜索覆盖整个B列
把after参数改为ws.Cells(ws.Rows.Count, "B"),这样xlPrevious方向的搜索会从B列最后一行开始向上遍历整个列,包括隐藏行:
Private Function GetAccountRange(ws As Worksheet, actName As String, row As Long) As Range Dim actString As String Dim foundCell As Range actString = Right(actName, Len(actName) - InStr(actName, " " & Chr(183) & " ") - 2) ' 修改after参数为B列最后一行,确保搜索覆盖全列 Set foundCell = ws.Columns("B").Find(actString, after:=ws.Cells(ws.Rows.Count, "B"), _ LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False, SearchDirection:=xlPrevious) Set GetAccountRange = foundCell ' 补充函数返回值,原代码遗漏了这一行 End Function
方案2:先定位到可见区域的最后一个可见单元格作为after参数
如果需要保留基于传入row的搜索逻辑,可以先找到传入row上方最近的可见单元格,以此作为after参数:
Private Function GetAccountRange(ws As Worksheet, actName As String, row As Long) As Range Dim actString As String Dim foundCell As Range Dim afterCell As Range actString = Right(actName, Len(actName) - InStr(actName, " " & Chr(183) & " ") - 2) ' 找到传入row上方最近的可见单元格,若当前行可见则直接使用 Set afterCell = ws.Cells(row, "B") Do While afterCell.Row > 1 And afterCell.EntireRow.Hidden Set afterCell = afterCell.Offset(-1, 0) Loop Set foundCell = ws.Columns("B").Find(actString, after:=afterCell, _ LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False, SearchDirection:=xlPrevious) Set GetAccountRange = foundCell ' 补充函数返回值 End Function
额外说明
原代码遗漏了Set GetAccountRange = foundCell这一行,导致函数无法返回找到的单元格,必须补充才能让函数正常工作。
内容的提问来源于stack exchange,提问作者Josh Marks
相关产品推荐
相关产品推荐

