【问题标题】:Excel VBA - OT Hours span two pay periods - how to auto calculateExcel VBA - 加班时间跨越两个支付期 - 如何自动计算
【发布时间】:2017-03-21 22:13:30
【问题描述】:

我在解决此问题的已回答问题的档案中找不到任何内容。 我很擅长 Excel,但这让我很沮丧。 我的任务是改进我们办公室工作人员用来跟踪正常工作时间、加班时间和各种带薪休假的工具。 我在整个事情上都有一个很好的开始,但是因为公司的支付周期是双月的(第 1 到第 15 和第 16 到 EOM)我遇到了困难自动计算工作周时支付的加班时间(对于 OT)跨越两个支付期。 我有一列显示一周中的哪一天(星期一 = 2、星期二 = 3 等),我试图弄清楚如何查看 Day 列并计算 Day2-Day6 小时的所有实例以获得 OT 小时(如果有的话 - 我有一个公式)在当前支付期间支付。如果新的支付期不是在星期一开始,我需要在新的支付期开始时向后看。 电子表格列出了之前的支付期以及当前的支付期。
我一定会很感激任何建议。 祝你有美好的一天 - 琳达

这是数据:

DayofWeek; Date; StartTime; EndTime; Lunch; Hours@Work; FringeType; FringeHours; TotalPayHours; WeeklyOTHrs (these are the column headers)
5 Thursday, March 16, 2017 7:30 17:00 1 8.50 8.50 
6 Friday, March 17, 2017 8:00 16:30 0.5 8.00 8.00 12.00 
2 Monday, March 20, 2017 7:30 17:00 1 8.50 H 8 16.50 
3 Tuesday, March 21, 2017 8:10 16:30 1 7.33 7.33 
4 Wednesday, March 22, 2017 8:00 17:00 1 8.00 V 8 16.00 
5 Thursday, March 23, 2017 8:00 17:30 0.5 9.00 9.00 
6 Friday, March 24, 2017 7:40 17:00 1 8.33 8.33 1.17 

我现在在 OT 单元格中有一个公式:

=IF($B30=6,IF(SUM(G26:G30)>40,SUM(G26:G30)-40,""),"") 

【问题讨论】:

  • 嗨,Lynda,您能否在问题中包含一些数据以及您希望输出的样子?如果我们可以重现您的问题,那么我们应该能够提供帮助:)
  • 星期几 日期 开始时间 结束时间 午餐时间 @ 工作边缘类型 边缘时间 每周总工资时间 OT Hrs 5 2017 年 3 月 16 日星期四 7:30 17:00 1 8.50 8.50 6 3 月星期五2017 年 17 月 17 日 8:00 16:30 0.5 8.00 8.00 12.00 2 2017 年 3 月 20 日星期一 7:30 17:00 1 8.50 H 8 16.50 3 2017 年 3 月 21 日星期二 8:10 16:30 1 7.33 7.33 4 星期三2017 年 3 月 22 日 8:00 17:00 1 8.00 V 8 16.00 5 2017 年 3 月 23 日星期四 8:00 17:30 0.5 9.00 9.00 6 2017 年 3 月 24 日星期五 7:40 17:00 1 8.33 8.33 1.17 我有现在 OT 单元格中的公式: =IF($B30=6,IF(SUM(G26:G30)>40,SUM(G26:G30)-40,""),"")
  • 抱歉,我不知道如何粘贴到表格中。
  • 只需编辑您的原始问题以添加数据 - 如果需要,我可以对其进行编辑以更好地格式化:)

标签: excel excel-formula vba


【解决方案1】:

这里有两个可能有用的选项,它们都使用 SUMIFS 函数。第一个选项需要较少的代码,但要求在数据表之外的单元格中定义各个时期的开始和结束日期。

选项 1。 如果您对每个支付期的总数感兴趣,则可以跳过 OT 列,而是在数据表之外计算总数。这是一个只有 3 列的示例。在屏幕截图中,B5 包含以下公式:

    =SUMIFS($C$12:$C$33,$A$12:$A$33,">="&$B$3,$A$12:$A$33,"<="&$B$4)

如果 C 列中的所有值在单元格 B3 和 B4 中指定的上一期间的日期内,则 SUMIFS 会将这些值求和。

同样,B9 包含当前期间的公式,由单元格 B7 和 B8 定义:

   =SUMIFS($C$12:$C$33,$A$12:$A$33,">="&$B$7,$A$12:$A$33,"<="&$B$8)

选项 2。 如果您想跟踪每个期间的累计 OT 小时数,您可以保留 OT 列并添加上述公式的变体。在此示例中,我添加了两个额外的列来定义句点的开始和结束(这使公式更漂亮;如果您不想要额外的列,可以将这些公式合并到 D 列的公式中)。

在此屏幕截图中,D3 包含以下公式:

=SUMIFS($C$3:$C3,$A$3:$A3,">="&E3,$A$3:$A3,"<="&F3)

这与选项 1 中的公式基本相同,但范围每行都会增加,因此 D4 包含:

=SUMIFS($C$3:$C4,$A$3:$A4,">="&E3,$A$3:$A4,"<="&F3)

此外,期间的开始日期和结束日期是动态的,包含在 E 列和 F 列中。公式会检查当前日期是在该月的上半月还是下半月,并相应地调整开始日期和结束日期。

开始日期(单元格 E3):

=IF(A3<=DATE(YEAR(A3),MONTH(A3),15),DATE(YEAR(A3),MONTH(A3),1),DATE(YEAR(A3),MONTH(A3),16))

结束日期(单元格 F3):

=IF(A3<=DATE(YEAR(A3),MONTH(A3),15),DATE(YEAR(A3),MONTH(A3),15),EOMONTH(A3,0))

注意:如果您想避免多余的列,可以将列 E 和 F 合并到 D 中,这样单元格 D3 将包含:

=SUMIFS($C$3:$C3,$A$3:$A3,">="&IF(A3<=DATE(YEAR(A3),MONTH(A3),15),DATE(YEAR(A3),MONTH(A3),1),DATE(YEAR(A3),MONTH(A3),16)),$A$3:$A3,"<="&IF(A3<=DATE(YEAR(A3),MONTH(A3),15),DATE(YEAR(A3),MONTH(A3),15),EOMONTH(A3,0)))

【讨论】:

  • 非常感谢您的快速回复。我会看看这两个选项,让你知道我的表现!
  • 请注意,我只在非英文版的 Excel 上进行了测试;上面的公式是手动翻译的,所以如果遇到麻烦,请注意可能的拼写错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
  • 2013-03-06
  • 2010-09-15
  • 1970-01-01
相关资源
最近更新 更多