请求协助:O365桌面版批量生成日期区间关联明细
O365 日期区间展开并关联人员信息的解决方案
针对你1000行含姓名、起止日期、缺勤类型的数据展开需求,以下两种O365原生方法可直接实现,无需复杂VBA:
方法一:动态数组公式(一步生成结果)
假设原始数据表头在A1:D1(A=姓名,B=startdate,C=enddate,D=缺勤类型),数据行从A2到D1001。在空白单元格(比如F1)输入以下公式,按回车后自动生成所有展开行:
=LET( 数据源, A2:D1001, 姓名列, INDEX(数据源,,1), 开始日期列, INDEX(数据源,,2), 结束日期列, INDEX(数据源,,3), 缺勤类型列, INDEX(数据源,,4), 生成日期序列, MAP(开始日期列, 结束日期列, LAMBDA(s,e, SEQUENCE(e-s+1,1,s))), 重复姓名, MAP(姓名列, 结束日期列, 开始日期列, LAMBDA(n,e,s, REPT(n&"|", e-s+1))), 重复类型, MAP(缺勤类型列, 结束日期列, 开始日期列, LAMBDA(t,e,s, REPT(t&"|", e-s+1))), HSTACK( TEXTSPLIT(TEXTJOIN("|",,重复姓名), "|",,TRUE), TOCOL(生成日期序列, 1), TEXTSPLIT(TEXTJOIN("|",,重复类型), "|",,TRUE) ) )
额外处理:去重
如果原始数据有重复行,展开后需要去重,只需将公式包裹在UNIQUE()函数中:
=UNIQUE(LET( 数据源, A2:D1001, 姓名列, INDEX(数据源,,1), 开始日期列, INDEX(数据源,,2), 结束日期列, INDEX(数据源,,3), 缺勤类型列, INDEX(数据源,,4), 生成日期序列, MAP(开始日期列, 结束日期列, LAMBDA(s,e, SEQUENCE(e-s+1,1,s))), 重复姓名, MAP(姓名列, 结束日期列, 开始日期列, LAMBDA(n,e,s, REPT(n&"|", e-s+1))), 重复类型, MAP(缺勤类型列, 结束日期列, 开始日期列, LAMBDA(t,e,s, REPT(t&"|", e-s+1))), HSTACK( TEXTSPLIT(TEXTJOIN("|",,重复姓名), "|",,TRUE), TOCOL(生成日期序列, 1), TEXTSPLIT(TEXTJOIN("|",,重复类型), "|",,TRUE) ) ))
方法二:Power Query(可视化操作,适合新手)
- 选中原始数据区域,点击数据选项卡 → 从表格/区域,确认表头存在后加载到Power Query编辑器
- 点击添加列 → 自定义列,输入以下公式生成日期列表:
=List.Dates([startdate], Duration.Days([enddate]-[startdate])+1, #duration(1,0,0,0)) - 选中新生成的自定义列,点击转换选项卡 → 展开到新行
- 可选:删除原
startdate和enddate列,调整列顺序 - 点击关闭并上载,结果会自动生成到新工作表
这两种方法都能自动适配每月行数变化,处理1000行数据完全无压力。
内容的提问来源于stack exchange,提问作者Vojtěch Babka
相关产品推荐
相关产品推荐

