已完成Set赋值与Dim声明仍报运行时错误91:Excel VBA AutoFilter语句报错
Excel宏运行时错误91 排查与修正方案
报错根因定位
运行时错误91的本质是代码访问了未初始化的空对象(值为Nothing)。你遇到的报错点quidTab.AutoFilter.Sort.SortFields.Clear,触发原因是该语句执行时,quidTab.AutoFilter本身就是空值——也就是工作表根本没有处于启用AutoFilter的状态。
之前能连续数百次正常运行,是因为过往每次执行宏时,目标工作表的AutoFilter都是关闭状态,执行Selection.AutoFilter后刚好开启了筛选,后续代码能正常拿到AutoFilter对象。本次突然报错,常见触发场景:
- 打开的目标工作表已经提前开启了AutoFilter,此时执行
Selection.AutoFilter是切换筛选开关状态的操作,会直接把已开启的筛选关掉,导致后续代码取不到AutoFilter对象 - 代码选中的行和当前表上已有AutoFilter的标题行不匹配,执行
Selection.AutoFilter时会直接移除整张表的筛选配置,把AutoFilter对象置空
具体修正方向
- 彻底放弃
Selection.AutoFilter这种“开关切换”的写法,改成先判断AutoFilter状态、再显式给指定行开启筛选的逻辑,从根源上避免状态切换导致的筛选消失 - 所有涉及单元格、范围的操作,全部显式绑定目标工作表(也就是
quidTab)的引用,不要依赖VBA隐式引用活动工作表的机制,避免活动窗口切换导致的引用错位 - 给
Cells.Find的返回值加判空判断,避免因为数据变动找不到匹配单元格时触发空对象错误 - 操作Sort属性前,前置确认AutoFilter对象存在,不要无校验直接操作排序配置
关键代码调整示例
替换原有筛选开启逻辑
原代码:Rows(CStr(filterRow) & ":" & CStr(filterRow)).Select Selection.AutoFilter Set quidTab = ActiveWorkbook.ActiveSheet调整为:
' 先固定目标工作表引用,不依赖活动窗口状态 Set quidTab = ActiveWorkbook.ActiveSheet ' 如果表上已有旧的AutoFilter,先完全移除,避免范围不匹配的问题 If quidTab.AutoFilterMode Then quidTab.AutoFilterMode = False ' 给指定的筛选标题行显式开启AutoFilter quidTab.Rows(filterRow).AutoFilter补充查找环节的判空逻辑
原代码查找CE_标记的部分没有空值判断,调整为:Dim ceRange As Range Set ceRange = quidTab.Cells.Find(What:="CE_", After:=quidTab.Range("A1"), LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False) ' 找不到匹配标记时直接终止运行,避免后续空对象报错 If ceRange Is Nothing Then MsgBox "未匹配到CE_开头的单元格,终止宏执行" Exit Sub End If filterRow = ceRange.Row - 1修正Sort环节的范围引用
原代码里Sort的Key没有绑定工作表,容易出现引用错位,调整为:quidTab.AutoFilter.Sort.SortFields.Add _ Key:=quidTab.Range("C" & filterRow), SortOn:=xlSortOnValues, Order:=xlAscending, _ DataOption:=xlSortTextAsNumbers
内容的提问来源于stack exchange,提问作者Ivy McKee
相关产品推荐
相关产品推荐

