Excel VBA 使用InputBox筛选科目名称出现运行时错误1004如何解决?
VBA科目名称筛选运行时错误1004修复方案
核心报错原因
- 直接原因:
AutoFilter方法的筛选条件参数名拼写错误,你代码中写的是Criteria:=a,正确参数名为Criteria1,缺少末尾的数字1,触发VBA参数识别错误。 - 潜在诱因:代码大量依赖
Select、Selection、ActiveSheet这类动态对象,运行时很容易因为当前激活工作表/选区不符合预期,导致对象操作失败。 - 逻辑漏洞:未对InputBox的取消操作做判断,如果用户点击输入框的「取消」按钮返回空值,会触发无效筛选。
修正后的完整代码
Sub Quality_Check() Dim dte As Date Dim a As String Dim mBox As Variant Dim Lastrow As Long Dim dataRng As Range ' 日期输入与校验 mBox = InputBox("Enter a date") If mBox = "" Then Exit Sub ' 点取消直接退出 If Not IsDate(mBox) Then MsgBox "输入的日期格式不正确,请重新运行" Exit Sub End If dte = CDate(mBox) ' 科目名称输入与校验 a = InputBox("Enter the Subject Name") If a = "" Then Exit Sub ' 点取消直接退出 ' 绑定Raw Data工作表的数据源,避免依赖Select和激活状态 With Sheets("Raw Data") Lastrow = .Range("A" & .Rows.Count).End(xlUp).Row Set dataRng = .Range("A1:AB" & Lastrow) End With ' 先清除原有筛选,再依次执行日期、科目筛选 If dataRng.Parent.AutoFilterMode Then dataRng.Parent.AutoFilterMode = False ' 日期筛选(第1列) dataRng.AutoFilter Field:=1, Criteria1:=">=" & dte, Operator:=xlAnd, Criteria2:="<" & dte + 1 ' 科目名称筛选(第7列) dataRng.AutoFilter Field:=7, Criteria1:=a ' 复制筛选结果到Filtered工作表 dataRng.SpecialCells(xlCellTypeVisible).Copy Destination:=Sheets("Filtered").Range("A1") Application.CutCopyMode = False End Sub
主要改动说明
- 修复了筛选参数名错误,将
Criteria:=a改为Criteria1:=a - 去掉了所有
Select、Selection操作,直接绑定数据源范围,避免工作表激活状态影响运行结果 - 增加了InputBox取消操作、日期格式校验逻辑,避免异常输入报错
- 统一了筛选的操作对象,所有筛选都针对
Raw Data工作表的数据源执行,避免原来代码中日期筛选在ActiveSheet、科目筛选在Raw Data的逻辑冲突 - 优化了复制粘贴逻辑,直接指定复制目标,不需要切换工作表
内容的提问来源于stack exchange,提问作者Nabeel razaq
相关产品推荐
相关产品推荐

