|
原帖由 曦妈 于 2009-6-9 16:45 发表
另外,请问30楼的高手,那个单元格如何输入可以使它显示的时候是“2008年休假”字样,但单元格的值是“2008”?
能否解释一下你那个超美的表里面如下公式的意思?没有完全看明白。。。用evaluate分析了一下,还是 ...
想偷懒都不行呐,原以为“wangtx218”兄和“Jackeroo”版主会详细解释一下这个公式的,呵呵^_^
公式原理:
假设A员工于日期X刚好工作满1年,那么X所在年份全部按照12天来算年假的话,从1月1日起至X的这些日子Y天里,实际多算了(12-6)×Y/365天。因此,只要用12-[(12-6)×Y/365]就可以得出X所在年份可以享受的年休假是多少天了。
计算步骤:
一、最外层是一个IF()
嵌套,用来判断入职年份是否在E$1年度之后,如果是的话,年假为0,否则计算应该享受的年休假。
=IF(YEAR($D2)>E$1,0,CEILING(LOOKUP(E$1-YEAR($D2),{0,1,10},{6,12,15})-TEXT(E$1-YEAR($D2),"[<2]6;[=10]3;!0")*(DATE(E$1,MONTH($D2),DAY($D2))-DATE(E$1,1,1))/365,0.5))
二、用Lookup()函数来找出E$1年度可以享受年休假数的上限,要么6天,要么12天,要么15天。
LOOKUP(E$1-YEAR($D2),{0,1,10},{6,12,15})
三、算出需要折算年假天数的年份里多算的年假天数,如上述“公式原理”中的“(12-6)×Y/365天”
TEXT(E$1-YEAR($D2),"[<2]6;[=10]3;!0")*(DATE(E$1,MONTH($D2),DAY($D2))-DATE(E$1,1,1))/365
TEXT(E$1-YEAR($D2),"[<2]6;[=10]3;!0"),这个函数跟下面这个是等同的:
IF(E$1-YEAR($D2)<2,6,IF(E$1-YEAR($D2)=10,3,0))
计算的是如“(12-6)”的常数,入职不满一年的是(6-0)=6,满一年是(12-6)=6,满十年的是(15-12)=3
TEXT()函数的作用是按照第二个参数中的格式化条件去格式化第一个参数,其作用等同于设置单元格格式。只不过TEXT()处理过的数据还可以直接参加运算。第二个参数里的完整条件应该包括:“正数;负数;零;文本”四块,用“;”分隔,分别表示当第一个参数是“正数”、“负数”、“零”、“文本”时显示的格式。利用这个原理,可以来简化IF()函数,尤其是IF()函数的第一个参数是一个很长的表达式的时候,能有效缩短公式字符,简洁易维护。
在Text()函数的第二个参数里,还可以用表达式来表示条件,上面的公式就用到了这个:"[<2]6;[=10]3;!0",意思就是第一个参数小于2时,TEXT()函数返回6,等于10时返回3,其余的情况就返回0(因为0在格式文本字符串中表示一个数字的占位,所以要显示“0”这个值,就要用“!”界定符来特别标志一下),和上面的这个IF()公式是不是一个意思呢?!
四、计算多数年休假部分的天数,也就是上述“公式原理”中的“Y”,这个比较简单,就不作说明了。
(DATE(E$1,MONTH($D2),DAY($D2))-DATE(E$1,1,1))/365 |
评分
-
1
查看全部评分
-
|