我有以下格式的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中处理。
答案 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解决方案。这是一个非常讨厌的公式,但它的工作原理。我相信它可以更容易使用和理解更多的聪明才智:
假设电子表格设置如下:
在单元格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)))
详细解释公式:
IF(ISBLANK(B2),""
将返回一个空字符串。LEFT(B2,2)
将开始时间提取为一小时。Mid(B2,Find("-",B2)+1,2)
将结束时间提取为一小时。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))
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)
Find("-",[cell])
将开始和结束时间拆分为值excel可用于对时间/成本表进行数学运算。=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>
如果你需要担心分钟,你需要做的就是创建一个更大的查找表,它可以保存一天中的每一分钟。如果您的工作日跨越午夜,您可能需要添加一些额外的逻辑。