Excel两表按匹配条件合并及日期筛选实现方法咨询
无需VBA!用Excel内置工具就能实现你的需求
我来给你明确说——完全不需要写VBA代码,Excel自带的Power Query(2016及以后版本原生自带,2013及之前版本可以免费安装插件)就能完美搞定你的所有需求,而且操作全程可视化,不用碰复杂代码。下面是具体的步骤:
核心操作步骤
1. 把两张表导入Power Query编辑器
- 选中表1的所有数据,点击顶部菜单栏的「数据」→「从表格/区域」,确认数据有表头后,就能进入Power Query编辑器;
- 用同样的方法把表2也导入Power Query。
2. 先把表2拆成“一行对应一个资源-日期”的格式
表2里的日期列是横向的,我们需要把它转成纵向的:
- 在表2的编辑器里,选中
ProjName和Resource这两列; - 点击顶部「转换」→「逆透视列」→「逆透视其他列」,这样原来的每一列日期(比如1-20、1-27)都会变成一行,同时生成两列:
Attribute(存日期文本)和Value(存对应资源分配天数)。现在表2就变成了“项目名-资源-日期-天数”的单行记录格式。
3. 合并表1和处理后的表2
我们要保留表1的所有项目,所以用左外部连接:
- 回到表1的编辑器,点击「主页」→「合并查询」→「合并作为新查询」;
- 在弹出的窗口里,选择要合并的表是刚才处理好的表2,匹配条件选
ProjName列,连接类型选「左外部(从第一个表获取所有行,从第二个表获取匹配的行)」; - 点击确定后,展开合并后的列,只勾选
Resource、Attribute、Value这三列(如果表2没有匹配的项目,这些列会显示null,完全符合你要保留表1所有项目的需求)。
4. 过滤符合日期要求的数据
这一步要处理两个过滤条件:
- 转换日期格式:首先把
Attribute列的文本日期(比如1-20)转换成真实的日期类型(假设是当前年份),可以添加自定义列,用公式=Date.FromText([Attribute], [Format="M-dd", Culture="en-US"]),然后把原来的Attribute列替换成这个新日期列; - 过滤项目:保留表1中
End Dt>=今日的项目(或者根据你实际需求调整,比如Start Dt>=今日,直接在End Dt列的筛选器里设置>=Date.From(DateTime.LocalNow())); - 过滤日期列数据:在转换后的日期列筛选器里,只保留>=今日的行,同时可以过滤掉
Value(天数)为0或null的行(如果不需要这些记录的话)。
5. 整理输出
调整列的顺序,删除不需要的中间列,然后点击「主页」→「关闭并上载」,结果就会自动加载到新的工作表里。
补充:如果不用Power Query,函数组合可行吗?
如果是数据量很小的情况,也可以用FILTER、INDEX、MATCH、TEXTJOIN这些函数组合实现,但公式会比较复杂,容易出错,而且维护起来麻烦。相比之下,Power Query的可视化操作更适合这种多步骤的数据处理需求。
总之,你的需求完全不需要VBA,用Power Query就能高效完成。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

