需要Excel表来计算复杂假期应计和休假时间的使用

时间:2013-10-09 05:41:50

标签: excel vba excel-vba excel-formula

我已经研究了一段时间并尝试了不同的风格......我需要开发一个跟踪电子表格(50名员工),它将根据以下参数计算累计休假时间和休假时间:

*在公司工作不到3年但已超过90周年的员工(他们开始累计)(还有一点需要注意......应计日是本月的第1天超过90天的那个月)[我在我的excel表上找到这个90天的项目]它将在以下时间累积: - 每个月4个小时,月末,最大上限为72小时,他们可以存储(但如果他们使用休假时间并且低于72小时,他们可以继续累积最多72小时.. 。)

*在公司工作超过3年但不满6年的员工将结束其之前的假期并从此处开始累积: - 每月6.8小时,月末,最大上限为122.4小时,他们可以存储(但如果他们使用休假时间并且低于122.4小时,他们可以继续累积至122.4小时.. 。)

* 6岁及以上的员工继续他们的假期,并从此开始累积: - 每个月10个小时,在月底,他们可以存储180小时的MAX上限(但如果他们使用休假时间并且低于180小时,他们可以继续累积长达180小时.. ..)

&安培;是的,我需要能够减少使用的休假时间。

是否有人对布局或可以执行这些功能的公式有任何建议?我很欣赏任何有关我可以使用的建议或建议!

我已经创建了一个测试表,并且基于这些条件为第一组开始累积,并从第二组规则开始(3年以上)。

然而,当我在第一项政策中累积最多72小时时,如果他们使用假期并再次低于72小时上限,则不再正确累积。

我知道这是一个过于复杂的政策,但这是公司想要的,他们不会让步......任何帮助或建议都表示赞赏。我知道我的表格并不好......但我正在尝试选择。


以下是我90天使用的公式:

=IF(F2<TODAY()-90, F2+90, "90 Day Period")

然后在我使用后获得该月的第一天:

=IF(G2="90 Day Period","N/A",DATE(YEAR(G2),MONTH(G2)+1,1))

我尝试使用第一条规则的累计(但它有问题......):

=IF(N2="N/A","N/A",IF(N2<=36,MIN(72,((N2*4)-P2),72),(72-P2)))

第二条规则:

=IF(AND(N2>36,N2<=72),MIN(122.4,((N2-36)*6.8)+Q2-S2),0)

1 个答案:

答案 0 :(得分:0)

  • 列A EmpName
  • B栏EntryDate
  • 当月的C列DaysSpent
  • D栏上的D栏加盖Accruel缓冲区
  • 每月重复C和D列

例如

                        01-Sep-2013        01-Oct-2013
    EmpName EntryDate   spent       buffer spent       buffer ... etc ...
   .-------.-----------.-----------.------.-----------.------.
    me      01-Jan-2010           0     12           0   18.8
    you     01-Jun-2013           0      4           0      4

为了不获得意大利面配方,我建议在VBA中创建一些用户定义的函数,比如

Function GetCap(EntryDate, ThisDate) As Single
Function GetMonthly(EntryDate, ThisDate) As Single

根据经验,在VBA中调试/维护2-3个嵌套IfSelect Case比在表中没有空格,没有注释等的92个字符长的公式更容易。如果业务逻辑发生变化,则需要检查一个代码块 - 而不是在一个已经增长3x12个月x 50个用户的工作表中的数十个/数百个公式。

上述功能可能需要帮助,例如

Function EndOfMonth(MyDate) as Date
Function BeginOfNextMonth(MyDate) as Date

所以在你只是

的表格中
  • 手动输入月复一月的小时数
  • 将新缓冲区计算为= MIN([oldbuffer] - [Spent] + GetMonthly(...), GetCap(...))
  • 小心使用相对/绝对寻址使公式跨列/行“可复制”,例如
    • 向下复制时,
    • ThisDate上的行 - 绝对值从标题中获取
    • 当向右复制时每个Emp的EntryDate列绝对值

您当然可以直接在工作表的单元格中使用=GetCap(...)=GetMonthly(...)来显示中间结果并进行调试。

比较日期时要小心

<强>提示

  • 3年后并不总是365x3天后
  • 检查VBA DateSerial()函数在几个月内执行的操作&gt; 12个月&lt; 0
  • 下个月末总是提前2个月的第一天减1 ...即使在闰年的2月 ggg

    如果您遇到这些功能,可以发布更多问题。