如何在Excel中筛选并复制当日或当周日期匹配的数据至新工作表
当然可以解决这个手动翻找的痛点!我给你两种实用方案,覆盖不同Excel版本和使用习惯:
方法一:用Excel内置函数(适合Excel 365/2021及以上版本)
这个方法不用写代码,直接用FILTER函数就能自动提取匹配数据,操作简单还能自动刷新。
假设你的原始数据工作表名叫数据源,日期列是A列(A1是表头),目标工作表分别叫当日数据和当周数据:
- 提取当日数据
在「当日数据」工作表的A2单元格输入以下公式,按回车后会自动提取所有和今天日期匹配的行:
=FILTER(数据源!A:O, 数据源!A:A=TODAY(), "无匹配数据")
- 解释:
数据源!A:O代表要提取的全部15列数据;数据源!A:A=TODAY()是筛选条件,只保留日期等于今天的行;最后一个参数是无匹配数据时显示的提示内容。
- 提取当周数据
需要先明确你的周起始日(比如周一还是周日):
- 若周起始为周日,用
WEEKNUM函数:
=FILTER(数据源!A:O, WEEKNUM(数据源!A:A,1)=WEEKNUM(TODAY(),1), "无匹配数据")
- 若周起始为周一,用国际标准的
ISOWEEKNUM函数:
=FILTER(数据源!A:O, ISOWEEKNUM(数据源!A:A)=ISOWEEKNUM(TODAY()), "无匹配数据")
注意:公式输入后会自动溢出填充所有匹配行,不用手动下拉复制,只要确保目标区域没有其他内容即可。
方法二:用VBA宏(适合所有Excel版本,支持一键更新)
如果你用的是旧版Excel(没有FILTER函数),或者想要更自动化的一键操作,VBA宏会更适合:
- 按下
Alt + F11打开VBA编辑器,右键点击左侧的工作簿名称 → 插入 → 模块,然后粘贴以下代码:
Sub 复制当日数据() Dim 数据源表 As Worksheet, 目标表 As Worksheet Dim 最后一行 As Long, i As Long, 目标行 As Long ' 根据你的实际表名修改这里 Set 数据源表 = ThisWorkbook.Worksheets("数据源") Set 目标表 = ThisWorkbook.Worksheets("当日数据") ' 清空目标表原有数据(保留表头) 目标表.Rows("2:" & 目标表.Rows.Count).ClearContents 最后一行 = 数据源表.Cells(数据源表.Rows.Count, "A").End(xlUp).Row 目标行 = 2 ' 目标表从第2行开始填充数据 ' 遍历数据源表,复制当日匹配行 For i = 2 To 最后一行 If 数据源表.Cells(i, "A").Value = Date Then 数据源表.Rows(i).Copy 目标表.Rows(目标行) 目标行 = 目标行 + 1 End If Next i MsgBox "当日数据复制完成!", vbInformation End Sub Sub 复制当周数据() Dim 数据源表 As Worksheet, 目标表 As Worksheet Dim 最后一行 As Long, i As Long, 目标行 As Long Dim 当前周 As Integer, 数据周 As Integer ' 根据你的实际表名修改这里 Set 数据源表 = ThisWorkbook.Worksheets("数据源") Set 目标表 = ThisWorkbook.Worksheets("当周数据") ' 清空目标表原有数据(保留表头) 目标表.Rows("2:" & 目标表.Rows.Count).ClearContents 最后一行 = 数据源表.Cells(数据源表.Rows.Count, "A").End(xlUp).Row 目标行 = 2 ' 目标表从第2行开始填充数据 当前周 = WorksheetFunction.WeekNum(Date, 2) ' 2代表周起始为周一,改周日的话换成1 ' 遍历数据源表,复制当周匹配行 For i = 2 To 最后一行 If IsDate(数据源表.Cells(i, "A").Value) Then 数据周 = WorksheetFunction.WeekNum(数据源表.Cells(i, "A").Value, 2) If 数据周 = 当前周 Then 数据源表.Rows(i).Copy 目标表.Rows(目标行) 目标行 = 目标行 + 1 End If End If Next i MsgBox "当周数据复制完成!", vbInformation End Sub
修改代码里的工作表名称(比如把
"数据源"、"当日数据"换成你实际的表名),如果需要调整周起始日,把WeekNum函数的第二个参数从2改成1即可。运行宏的方法:按下
Alt + F8,选择对应的宏名称点击「执行」,或者你可以给宏添加一个按钮到快速访问工具栏,以后一键就能完成操作。
额外提醒
- 确保原始数据的日期列是真正的日期格式,不是文本格式(可以选中日期列,右键→设置单元格格式→日期,确认格式正确)。
- 函数方法会随数据源更新自动刷新数据;VBA方法需要重新执行宏来更新数据。
内容的提问来源于stack exchange,提问作者user3773444




