如何在Excel中计算小时数

我有以下格式的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)?

PS简单的方法:导出到csv和进程在Python / PHP /等。

这是一个非VBA解决scheme。 这是一个非常讨厌的公式,但它的作品。 我相信,用更聪明的方式可以更容易地使用和理解:

假设电子表格是这样设置的:

数据网格

在单元格G1中input此公式并向下拖动以获取数据集:

 =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),""如果没有给定的人/天组合的时间,将返回一个空string。
  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可以用来对时间/成本表进行math运算的值。
  7. 时间/成本表Q列中的公式是=VALUE(MID(O2,FIND("-",O2)+1,2)) ,并将结束小时数视为Excel可以用来添加的值,而不是从原始源格式的文本。

在VBA中做到这一点! 它是原生的,很容易学习。 在function上,我会遍历表格,写一个函数来计算根据给定的信息赚取的美元。 如果你希望你的结果是实时更新的(就像在Excel中的公式),你可以编写一个用户定义的函数 。 一个有用的函数可能是一个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#) 

我有一个方法只使用公式。 首先创build一个查询表,其中包含每个小时和比率说专栏K&L,如下所示:

 KL 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 

确保在数字前面input单引号来input小时数。

那么如果你的小时在B2单元中,那么你可以用这个公式来计算总和:= SUM(INDIRECT(“L”&MATCH(LEFT(B2,5),K2:K40,0)&“:L”&MATCH(RIGHT (B2,5),K2:K40,0)))

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

如果您需要担心几分钟,您只需创build一个更大的查找表,即可保存一天中的每一分钟。 如果您的工作日午夜,您可能需要添加一些额外的逻辑。