楼主 wjc2090742 |
Q:如何根据一个月中周日的单双号条件,周日是单号的休假1天,双号的休假2天,求月休假总天数? A:如下图,在A1输入年,B1输入月,C1得出结果。 C1:
建议一楼一楼的看下去。自己非常喜欢这个帖,尤其是公式演变的过程。从1楼中规中矩的日期函数的思路,一路到草版44个字符的表演。 休假天数.rar |
2楼 gouweicao78 |
1、A1&-B1&-ROW(1:31)构建31天日期,如果没有31天的月份,后几个日期是错误的; 2、MOD(日期,7)——等于1时是星期天,等于0是星期六 3、三个条件:条件1+条件2*条件3,即条件1或者(条件2且条件3),也就是:要么这一天是周日(肯定休息),要么这一天是周六且是单号(则周日是双号) 问题:如果某月最后一天X是单号、周六,而下月1号是周日、双号,那么X是否休息?这一点题目没有明确,我的答案是休息的,算到当月。 |
3楼 kevinchengcw |
问题:如果某月最后一天X是单号、周六,而下月1号是周日、双号,那么X是否休息?这一点题目没有明确,我的答案是休息的,算到当月。 我这里是要上班的,只有当月双数日期的星期天前的星期六才能休 |
4楼 gouweicao78 |
嗯,刚才我的公式也有个小问题,题意应该是某月“某日”day是双号日期,而不是转换为日期序列号后是双数: =COUNT(1/(MOD(A1&-B1&-ROW(1:31),7)=1))+COUNT(1/(MOD(DAY(A1&-B1&-ROW(1:31)),2)+MOD(A1&-B1&-ROW(1:31),7)=0)) 根据这个条件,那么只有2~31号是双号且1~30号是周六的情况补休1天:
|
5楼 gouweicao78 |
第2个MOD判断2~32号日期是否双号,并结合IF({1,0}返回第1列是1第2列是MOD判断的数组,与第一个MOD返回的2列数组相乘。 此处常量数组让公式简化,利用同样维度、尺寸(2列31行)数组运算时,各回各家各找各妈的“分别”计算方式,也就是说:第一个MOD是周日的,都乘以1;是周六的,都乘以第2个MOD判断双号。互不干扰。 最终,利用COUNT忽略错误,将可能存在的:日期不足31天(更不可能有32天)导致的错误去除掉,这是用DATE函数做不到的,呵呵,“错”有“错”的妙用。 |
6楼 wjc2090742 |
草版的思路真是漂亮,研究了好久。我的是1列*1列*1列,草版的是2列*2列。所以不一定非要用时间函数去纠错,可以用别的办法规避错误值。受启发,改写了一下自己的公式,仍然是1列求和的思路,但是excel的sum不能像count那样忽略错误值,没有办法写出2003版也适用的通式。 改写的公式:
kevinchengcw的这个题目真的好赞,也是我非常喜欢日期函数的原因,excel中的日期真是太神奇了,日期、数值、文本,太好玩了。 休假天数.rar |
7楼 gouweicao78 |
DAY(A1&-B1&-ROW(1:31))——实际上就是ROW(1:31),呵呵,还可以再简化:
|
8楼 gouweicao78 |
也就是说,day用了2种情况,第一种是1~31都判断周日的,第二种是仅判断2、4、……30日是否周日 |
9楼 gouweicao78 |
反正都不怕32号了,也就不怕62号了,都是“错”,就豁出去了,再短一次:
|
10楼 kevinchengcw |
呵呵,这个问题被各位研究的这么深入啊,厉害,可惜了,公式我看不太懂,慢慢消化 |
11楼 donghan |
还是草版的功力深厚呀 |
12楼 wjc2090742 |
表扬下自己,赞美一下kevinchengcw,能引出这么精彩的表演。 我很喜欢这个过程,在我看来,5楼甚至比9楼更重要。补上完整的附件。 休假天数.rar |
13楼 mjgdxx |
好难 |
14楼 蒸蒸日上 |
我也看不懂,我能在这里做个记号吗,留着慢慢理解和消化! |