一、案例说明
1、问题背景
已知开始时间,并在子表单里面列出了所有的周末和节假日(联动基础表获取),输入工作日天数,返回在开始日期之后、与该日期相隔指定工作日的某一日期的日期值。
2、解决思路
在子表单中列出开始日期之后的每一天,判断当天是否为节假日,之后得出这一天于开始日期之间的工作日天数,将这个工作日天数于主表输入的工作日对比,若天数一致,则返回对应的日期为最终的日期。
3、知识库外链
https://t6ixa9nyl6.jiandaoyun.com/sharedoc/21WYRI4Xvt3GRHuk1eQbPK
4、应用安装链接
https://jiandaoyun.com/a/6051ba39c53e6d000735e884
二、设计说明
1、表单及功能说明
计算表:去除节假日及周末后返回对应的工作日日期;
辅助表1:基础联动表,用于子表单序号联动;
辅助表2:休息日基础表,用于联动开始日期当月和下月所有的休息日。
2、具体设置
(1)辅助表1
分别在主表和子表单中新建一个数字字段,并在数据管理录入数据。
根据输入的最大工作日天数来录入一个固定天数对应的序号记录,比如最大工作日天数为10,考虑加上中间的节假日的情况,可以录入20,如果最大工作日天数为20,可以录入40对应的记录。
(2)辅助表2
年月:录入年月,例如202103;
休息日:在子表单中录入这个月的所有休息日;
(3)计算表
开始日期、工作日天数:由填写人员手动输入;
默认联动辅助:辅助的基础联动表中固定天数录入的是多少,这里就设置默认值为多少;
子表单整体:添加右侧的6个字段,并对子表单整体设置数据联动,通过默认联动辅助,将基础联动表中的子表单序号联动到本表中;
子表单.日期时间:公式为 DATEDELTA(开始日期(手动输入),子表单.序号) ,意思是将主表的开始日期依次加上子表单序号显示每一天,(比如开始时间为4月1日,子表单从4月2日开始一直显示到4月21日),目的是为了判断每一行的日期和开始时间相差的工作日天数,判断是否和主表的工作日一致;
子表单.是否为休息日:公式为 IF(SEARCH(TEXT(VALUE(子表单.日期时间)),2个月休息日汇总)!=0,1,0) 判断当前这个日期是否可以在2个月休息日汇总里面找到,找到返回1,没找到返回0;
不去除休息日的天数差:公式为 IF(子表单.日期时间<=开始日期(手动输入),0,DAYS(子表单.日期时间,开始日期(手动输入))) 意思是如果这条记录的日期小于主表的开始时间,就返回0,否则返回这2个日期的天数差;
是否为休息日汇总:公式为 TEXT(子表单.是否为休息日) 意思是将子表单中是否为休息日的数据全部列出,并用逗号隔开,最终效果为1,1,0,0,0这种格式,其中1和0的顺序不定由是否为休息日的公式判断输出0还是1;
去除休息日的天数差:公式为 子表单.不去除休息日天数差-SUMPRODUCT(SPLIT(LEFT(是否为休息日汇总,子表单.序号*2),',')) 意思是取出当前这条记录之前所有的休息日组合,然后求和,得到休息日的天数和,然后用不去除休息日的天数差扣除总的休息日,得到最终的天数差;
子表单最终日期:公式为 IF(子表单.去除休息日天数差==工作日天数(手动输入),子表单.日期时间,) 判断子表单取出休息日的天数差是否等于主表的工作日天数,如果等于,返回子表单的日期,否则返回空;
最后工作日:公式为 MIN(子表单.最终日期) 获取子表单最终日期里面最小的那一天,就是在开始日期之后、与该日期相隔指定工作日的那个日期。
本月休息日明细、下月休息日明细:这2个子表单记录开始时间近2个月的所有休息日期,设置子表单整体联动,通过本月和下月联动休息日基础表;
2个月休息日汇总:公式为 CONCATENATE(TEXT(本月休息日明细.日期时间),',',TEXT(下月休息日明细.日期时间)) 将2个子表单的休息日组合在一起,用逗号隔开显示;
本月:公式为 TEXT(DATE(开始日期(手动输入)),'yyyyMM') 获取开始日期所在年月;
下月:公式为 TEXT(DATE(YEAR(开始日期(手动输入)),MONTH(开始日期(手动输入))+1,1),'yyyyMM') 获取开始日期下个月的年月。
(4)最终效果
编辑于 2021-8-16 15:20
|