VBA需求:周一筛选上周五至周日数据,其余日期筛选昨日数据
VBA宏:按日期范围自动筛选数据(解决错误+实现需求)
错误原因分析
你遇到的「Sub or Function not Defined」错误来自这行代码:
Set xToday = Thisworksheet.Application.Selection.AutoFilter(field(1), Criteria1(Today))
问题出在:
- 语法错误:
field(1)需写成Field:=1(VBA参数传递必须用:=指定参数名);Criteria1(Today)需改为Criteria1:=Today()(Today是函数,必须加括号调用) - 逻辑错误:这行代码试图通过筛选操作给
xToday赋值,但xToday的作用是获取今日星期,完全不需要通过筛选实现
修正后的完整代码
以下是实现需求的优化代码,同时摒弃了低效易出错的Select写法:
Sub AutoFilterByDate() Dim ws As Worksheet Dim lastRow As Long Dim todayWeekday As String Dim startDate As Date, endDate As Date ' 关闭屏幕更新与提示,提升运行效率 Application.ScreenUpdating = False Application.DisplayAlerts = False ' 指定操作工作表,可根据实际修改为Sheet名称,比如Set ws = ThisWorkbook.Sheets("数据列表") Set ws = ActiveSheet ' 获取C列最后一行数据的行号 lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row ' 处理文本格式日期(拆分后删除临时列) ws.Columns("D:D").Resize(, 2).Insert ' 一次性插入两列 ws.Range("C2:C" & lastRow).TextToColumns _ Destination:=ws.Range("C2"), _ DataType:=xlFixedWidth, _ FieldInfo:=Array(Array(0, 4), Array(10, 1)), _ TrailingMinusNumbers:=True ws.Columns("D:E").Delete ' 获取今日星期(中文环境返回“星期一”,英文环境返回“Monday”,请根据系统语言调整) todayWeekday = Format(Date, "dddd") ' 根据今日星期设置筛选日期范围 If todayWeekday = "星期一" Then ' 英文系统请改为"Monday" ' 周一:筛选上周五(Date-3)至周日(Date-1) startDate = Date - 3 endDate = Date - 1 Else ' 非周一:仅筛选昨日(Date-1) startDate = Date - 1 endDate = Date - 1 End If ' 对C列执行日期范围筛选 ws.Range("C1:C" & lastRow).AutoFilter _ Field:=1, _ Criteria1:=">=" & CLng(startDate), _ Operator:=xlAnd, _ Criteria2:="<=" & CLng(endDate) ' 恢复屏幕更新与提示 Application.ScreenUpdating = True Application.DisplayAlerts = True Set ws = Nothing End Sub
关键说明
- 日期格式兼容:保留了你原本的
TextToColumns操作,确保文本格式日期转换为可筛选的数值型日期 - 星期判断适配:
Format(Date, "dddd")返回当前系统语言的星期全称,请根据Excel语言环境修改判断条件 - 筛选逻辑清晰:
- 周一:通过
Date-3和Date-1锁定上周五至周日的范围 - 非周一:将起始与结束日期设为同一值,实现单日期筛选
- 周一:通过
- 代码稳定性优化:直接操作工作表和单元格对象,避免使用
Select引发的异常
内容的提问来源于stack exchange,提问作者Axel Martins
相关产品推荐
相关产品推荐

