Vba 需要Excel表格来计算复杂的假期累计和假期时间的使用

Vba 需要Excel表格来计算复杂的假期累计和假期时间的使用,vba,excel,excel-formula,Vba,Excel,Excel Formula,我已经做了一段时间,尝试不同的风格。。。我需要开发一个跟踪电子表格(针对50名员工),根据以下参数计算累计休假时间和使用的休假时间: *在公司工作不到3年但已过90天周年纪念日的员工(在该日开始累计)(还有一个警告……应计日是该月90天之后的第一个月)[我在excel工作表中计算出这90天的项目]应在以下时间累计: -每月4小时,在月底,他们可以存储的最大上限为72小时(但如果他们使用休假时间并低于72小时,他们可以继续累积72小时…) *在本公司工作3年以上但不足6年的员工将其之前的假期结转,

我已经做了一段时间,尝试不同的风格。。。我需要开发一个跟踪电子表格(针对50名员工),根据以下参数计算累计休假时间和使用的休假时间:

*在公司工作不到3年但已过90天周年纪念日的员工(在该日开始累计)(还有一个警告……应计日是该月90天之后的第一个月)[我在excel工作表中计算出这90天的项目]应在以下时间累计: -每月4小时,在月底,他们可以存储的最大上限为72小时(但如果他们使用休假时间并低于72小时,他们可以继续累积72小时…)

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

*在公司工作6年及以上的员工将其先前的假期结转,并从此处开始累积: -每月10小时,在月末,他们可以存储的最大上限为180小时(但如果他们使用休假时间并低于180小时,他们可以继续累积到180小时……)

&是的,我需要能够扣除使用的假期时间

是否有人对布局或公式有任何建议,可以实现这些功能的一部分?我很感激任何关于我还能用什么的建议

我已经创建了一个测试表,并根据第一个测试表的这些条件进行累积,然后从第二组规则开始(3年以上)

然而,当我在第一份保单上累积到72小时的最大值时,如果他们使用假期,并且再次处于72小时上限之下,则不再正确累积

我知道这是一项过于复杂的政策,但这正是公司想要的,他们不会让步。。。。任何帮助或建议都将不胜感激。我知道我的床单不太好。。但我正在尝试各种选择


以下是我在90天内使用的方程式:

=IF(F2<TODAY()-90, F2+90, "90 Day Period")
我尝试使用第一条规则的累积(但有问题…):

=IF(N2=“N/A”,“N/A”,IF(N236,N2Let

  • 列名称
  • B列入口日期
  • 列C当前月份的DaysPent
  • D列月末的应计缓冲区上限
  • 逐月重复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个嵌套的
要比表中92个字符长、没有空格、没有注释等的公式更容易。如果业务逻辑发生变化,则需要检查一个代码块,而不是一张表中的几十个/数百个已增长了3x12个月x 50个月的公式卢比

上述功能可能需要以下人员的帮助:

Function EndOfMonth(MyDate) as Date
Function BeginOfNextMonth(MyDate) as Date
所以在床单上你只需要

  • 手动输入每月花费的小时数
  • 将新缓冲区计算为
    =MIN([oldbuffer]-[spend]+GetMonthly(…)、GetCap(…)
  • 小心地使用相对/绝对寻址使公式跨列/行“可复制”,例如
    • 向下复制时从标题获取的
      ThisDate
      上的绝对行
    • 向右复制时,每个Emp的
      EntryDate
      上的绝对列
当然,您可以直接在工作表的单元格中使用
=GetCap(…)
=GetMonthly(…)
,以显示中间结果并进行调试

比较日期时要小心

提示

  • 3年后并不总是365x3天后

  • 检查VBA DateSerial()函数在月数>12和月数<0时的功能

  • 下个月底总是前两个月的第一天减去1…即使是闰年ggg的二月

    如果你在这些功能上遇到困难,可以发布更多的问题

                        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
Function GetCap(EntryDate, ThisDate) As Single
Function GetMonthly(EntryDate, ThisDate) As Single
Function EndOfMonth(MyDate) as Date
Function BeginOfNextMonth(MyDate) as Date