2

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

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

*在公司工作超过 3 年但不到 6 年的员工可以结转之前的假期,并从这里开始累积: - 每月 6.8 小时,在月底,MAX 上限为 122.4他们可以存储的小时数(但如果他们使用休假时间并低于 122.4 小时,他们可以继续累积到 122.4 小时......)

*在公司工作 6 年及以上的员工可以结转之前的假期,并在以下时间开始累积: - 每月 10 小时,在月底,他们可以存储的 MAX 上限为 180 小时(但如果他们使用休假时间并低于 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)
4

1 回答 1

0

  • 列 A EmpName
  • B 列 EntryDate
  • C 列当月花费的天数
  • 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

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

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

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

这样你就可以在工作表中

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

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

比较日期时要小心

提示

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

  • 检查 VBA DateSerial() 函数对月 > 12 和月 < 0 的作用

  • 下个月的月底总是提前 2 个月的第一天 - 1 ... 即使在闰年的 2 月ggg

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

于 2013-10-09T17:29:04.593 回答