如何在excel中计算小时数

时间:2015-12-22 14:45:28

标签: excel excel-vba excel-formula vba

我有以下格式的xls文件

Name    1              2             3            4
John    09:00-21:00                  09:00-21:00
Amy                    21:00-09:00                09:00-21:00

1,2,3,4等代表当月的天数, 09:00-21:00-工作时间。

我想根据以下条件计算工资:

09:00-21:00 - 10$/hour
21:00-00:00 - 15$/hour
00:00-03:00 - 20$/hour
etc.

依此类推(每小时可以拥有它自己的费用,例如03:00-04:00 - 20 $ /小时,04:00-05:00 - 19 $ /小时等。)

如何仅使用Excel(函数或VBA)实现此目的?

P.S。简单方法:导出到csv并在python / php / etc中处理。

3 个答案:

答案 0 :(得分:1)

在VBA中执行此操作!它本身就是excel,易于学习。从功能上讲,我会遍历表格,编写一个函数来根据给定的信息计算获得的美元。如果您希望结果是实时更新(如excel中的公式),您可以编写user defined function。有用的功能可能是HoursIntersect功能,如下所示:

Public Function HoursIntersect(Period1Start As Date, Period1End As Date, _
                               Period2Start As Date, Period2End As Date) _
                               As Double
Dim result As Double

' Check if the ends are greater than the starts.  If they are, assume we are rolling over to
' a new day
If Period1End < Period1Start Then Period1End = Period1End + 1
If Period2End < Period2Start Then Period2End = Period2End + 1

With WorksheetFunction
result = .Min(Period1End, Period2End) - .Max(Period1Start, Period2Start)
HoursIntersect = .Max(result, 0) * 24
End With

End Function

然后,您可以通过在“ - ”字符上拆分值来确定开始和结束时间。然后将每个付款时间表乘以该时间内的工作小时数:

DollarsEarned = DollarsEarned + 20 * HoursIntersect(StartTime, EndTime, #00:00:00#, #03:00:00#)
DollarsEarned = DollarsEarned + 10 * HoursIntersect(StartTime, EndTime, #09:00:00#, #21:00:00#)
DollarsEarned = DollarsEarned + 15 * HoursIntersect(StartTime, EndTime, #21:00:00#, #00:00:00#)

答案 1 :(得分:1)

这是一个非VBA解决方案。这是一个非常讨厌的公式,但它的工作原理。我相信它可以更容易使用和理解更多的聪明才智:

假设电子表格设置如下:

Data Grid

在单元格G1中输入此公式,然后向下拖动数据集:

=IF(ISBLANK(B2),"",IF(LEFT(B2,2)<MID(B2,FIND("-",B2)+1,2),SUMIFS($P$2:$P$24,$Q$2:$Q$24,">="&LEFT(B2,2),$Q$2:$Q$24,"<="&MID(B2,FIND("-",B2)+1,2)),SUMIF($Q$2:$Q$24,"<="&MID(B2,FIND("-",B2)+1,2),$P$2:$P$24)+SUMIF($Q$2:$Q$24,">="&LEFT(B2,2),$P$2:$P$24)))

详细解释公式:

    如果给定的人/天组合没有时间,
  1. IF(ISBLANK(B2),""将返回一个空字符串。
  2. LEFT(B2,2)将开始时间提取为一小时。
  3. Mid(B2,Find("-",B2)+1,2)将结束时间提取为一小时。
  4. IF(LEFT(B2,2)<MID(B2,FIND("-",B2)+1,2)将检查开始时间是否小于结束时间(意味着没有过夜工作)。如果开始时间小于结束时间,则会使用此公式计算每小时的总费用:SUMIFS($P$2:$P$24,$Q$2:$Q$24,">="&LEFT(B3,2),$Q$2:$Q$24,"<="&MID(B3,FIND("-",B3)+1,2))
  5. 如果开始时间高于结束时间(意味着隔夜工作),则会使用此公式计算:SUMIF($Q$2:$Q$24,"<="&MID(B3,FIND("-",B3)+1,2),$P$2:$P$24)+SUMIF($Q$2:$Q$24,">="&LEFT(B3,2),$P$2:$P$24)
  6. 使用Find("-",[cell])将开始和结束时间拆分为值excel可用于对时间/成本表进行数学运算。
  7. 时间/费用表的第Q列中的公式为=VALUE(MID(O2,FIND("-",O2)+1,2)),并将结束时间转换为Excel可用于添加的值,而不是使用原始源格式的文本。< / LI>

答案 2 :(得分:1)

我有一个只使用公式的方法。首先创建一个查找表,其中包含列K&amp;列中的每小时和每个小时。 L,像这样:

K       L
08:00   15
09:00   10
10:00   10
11:00   10
12:00   10
13:00   10
14:00   10
15:00   10
16:00   10
17:00   10
18:00   10
19:00   10
20:00   10
21:00   15
22:00   15
23:00   15

请务必在数字前输入单引号,以小时为单位输入小时数。

然后,如果您的小时数在B2单元格中,那么您可以使用此公式计算总数:     = SUM(INDIRECT( “L” &安培; MATCH(LEFT(B2,5),K2:K40,0)及 “:L” &安培; MATCH(RIGHT(B2,5),K2:K40,0)))

所有公式都是获取工作时间的左右文本,使用MATCH在查找表中查找它们的位置,该表用于创建范围地址,然后通过INDIRECT函数传递给SUM。 / p>

如果你需要担心分钟,你需要做的就是创建一个更大的查找表,它可以保存一天中的每一分钟。如果您的工作日跨越午夜,您可能需要添加一些额外的逻辑。