My apologies for such a long post, but this is a long formula and I would like to see if anyone can make suggestions to shorten it.
I would post the entire spreadsheet, but I do not have any public space. It is a year-long timesheet consisting of 13 tabs - 12 months (Jan-Dec) & and 1 Months tab (with holiday calculations).
Where I work I am not allowed to use Macros or VBS so I created a spreadsheet using only formulas to perform the calculations to track my time and to accrue/use CompTime & Leave
This cell has 2 purposes,
1) if R33 has a 'U' (for Use Leave) then calculate how much leave to use to reach the maximum hours for the day (determined by $P$1)
A. if total hours worked for the week < 40 hours then determine if hours worked "Today" < $P$1 - Yes? $P$1 - O33 (Week Total Time)
Example: If I worked 4 hours today, I will need 4 hours of leave to get 8 hours ($P$1) for the day
B. if total hours worked for the week > 40 hours then reduce Used Leave hours to make weekly total 40
Example: If I worked 4 hours on Tuesday, I need 4 hours of leave to get 8 hours. But if I worked 9 hours on Monday & Wednesday and 8 hours on Thursday & Friday then the week's total is 42 hours, so Tuesday's leave has to be reduced to 2 hours instead of 4 hours so the result is 40 hours for the week.
2) if > 40 hours have been worked, then accrue Comp Time.
This is Cell S33 - Accrue/Use CompTime
Here is the formula in string format...below the formula I break it out for easier reading
=IF(C33="Sunday",0,IF(AND(C33<>"Saturday",R33="U"),IF(ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+7>IF($C$33="",IF($C$32="",IF($C$31="",30,31),32),33),IF(SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P$33)<40,IF(40-SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P$33)-SUMPRODUCT((INDIRECT("R"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$R32="U")*INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32)>$P$1*24,($P$1*24)-$P33,IF(40-SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P$33)-SUMPRODUCT((INDIRECT("R"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$R32="U")*INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32)+P33>$P$1*24,($P$1*24)-$P33,40-SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P$33)-SUMPRODUCT((INDIRECT("R"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$R32="U")*INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32))),0),IF(SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+7))<40,IF(40-SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+7))-SUMPRODUCT((INDIRECT("R"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$R32="U")*INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32)>$P$1*24,($P$1*24)-$P33,40-SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+7))-SUMPRODUCT((INDIRECT("R"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$R32="U")*INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32)),0)),IF(P33=0,0,IF(SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P33)>40,SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P33)-40-SUM(INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32),0))))
Cell S33 - Accrue/Use CompTime
I would post the entire spreadsheet, but I do not have any public space. It is a year-long timesheet consisting of 13 tabs - 12 months (Jan-Dec) & and 1 Months tab (with holiday calculations).
Where I work I am not allowed to use Macros or VBS so I created a spreadsheet using only formulas to perform the calculations to track my time and to accrue/use CompTime & Leave
This cell has 2 purposes,
1) if R33 has a 'U' (for Use Leave) then calculate how much leave to use to reach the maximum hours for the day (determined by $P$1)
A. if total hours worked for the week < 40 hours then determine if hours worked "Today" < $P$1 - Yes? $P$1 - O33 (Week Total Time)
Example: If I worked 4 hours today, I will need 4 hours of leave to get 8 hours ($P$1) for the day
B. if total hours worked for the week > 40 hours then reduce Used Leave hours to make weekly total 40
Example: If I worked 4 hours on Tuesday, I need 4 hours of leave to get 8 hours. But if I worked 9 hours on Monday & Wednesday and 8 hours on Thursday & Friday then the week's total is 42 hours, so Tuesday's leave has to be reduced to 2 hours instead of 4 hours so the result is 40 hours for the week.
2) if > 40 hours have been worked, then accrue Comp Time.
This is Cell S33 - Accrue/Use CompTime
Here is the formula in string format...below the formula I break it out for easier reading
=IF(C33="Sunday",0,IF(AND(C33<>"Saturday",R33="U"),IF(ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+7>IF($C$33="",IF($C$32="",IF($C$31="",30,31),32),33),IF(SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P$33)<40,IF(40-SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P$33)-SUMPRODUCT((INDIRECT("R"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$R32="U")*INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32)>$P$1*24,($P$1*24)-$P33,IF(40-SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P$33)-SUMPRODUCT((INDIRECT("R"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$R32="U")*INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32)+P33>$P$1*24,($P$1*24)-$P33,40-SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P$33)-SUMPRODUCT((INDIRECT("R"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$R32="U")*INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32))),0),IF(SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+7))<40,IF(40-SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+7))-SUMPRODUCT((INDIRECT("R"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$R32="U")*INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32)>$P$1*24,($P$1*24)-$P33,40-SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+7))-SUMPRODUCT((INDIRECT("R"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$R32="U")*INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32)),0)),IF(P33=0,0,IF(SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P33)>40,SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P33)-40-SUM(INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32),0))))
Cell S33 - Accrue/Use CompTime
Code:
=
IF(C33="Sunday", [COLOR=#EF2929]' If it's Sunday, there is no chance for comp time (Comp Time > 40 hours)[/color]
0,
IF(AND(C33<>"Saturday",R33="U"), [COLOR=#EF2929]' You can't USE CompTime on Saturday (but you can accrue CompTime)[/color]
IF(ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+7> [COLOR=#EF2929]' If the Row() of the first day of the week (Sunday) is > 33 or 32 or 31 or 30[/color]
IF($C$33="", [COLOR=#EF2929]' Row 33 is the 31st day of the month,[/color]
IF($C$32="", [COLOR=#EF2929]' Row 32 is the 30th day of the month[/color]
IF($C$31="", [COLOR=#EF2929]' The last day of February is either Row 30 or 31[/color]
30,
31
),
32
),
33
),
IF(SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P$33)<40, [COLOR=#EF2929]' If less than 40 hours worked[/color]
IF(40-SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P$33)-SUMPRODUCT((INDIRECT("R"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$R32="U")*INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32)>$P$1*24,[COLOR=#EF2929]' if 40 - HrsWork - HrsUsed > DailyMaxHrs[/color]
($P$1*24)-$P33, [COLOR=#EF2929]' calculate DailyMaxHours - TodayHrs[/color]
IF(40-SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P$33)-SUMPRODUCT((INDIRECT("R"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$R32="U")*INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32)+P33>$P$1*24, [COLOR=#EF2929]' Else if 40 - HrsWork - HrsUsed + TodayHrs > DailyMaxHrs[/color]
($P$1*24)-$P33, [COLOR=#EF2929]' calculate DailyMaxHours - TodayHrs[/color]
40-SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P$33)-SUMPRODUCT((INDIRECT("R"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$R32="U")*INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32) [COLOR=#EF2929]' Else 40 - HrsWork - HrsUsed[/color]
)
),
0 [COLOR=#EF2929]' If >= 40 hours, HrsUsed is = 0[/color]
),
IF(SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+7))<40, [COLOR=#EF2929]' if HrsWork < 40[/color] IF(40-SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+7))-SUMPRODUCT((INDIRECT("R"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$R32="U")*INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32)>$P$1*24,[COLOR=#EF2929]' if 40 - HrsWork - HrsUsed > DailyMaxHrs[/color]
($P$1*24)-$P33,[COLOR=#EF2929]' DailyMaxHrs - TodayHrs[/color]
40-SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+7))-SUMPRODUCT((INDIRECT("R"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$R32="U")*INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32)[COLOR=#EF2929]' Else 40 - HrsWork - HrsUsed[/color]
),
0 [COLOR=#EF2929]' if >= 40 hours, HrsUsed is = 0[/color]
)
), [COLOR=#EF2929]' Else If the Row() of the first day of the week (Sunday) is < 30[/color]
IF(P33=0, [COLOR=#EF2929]' If TodayHrs = 0[/color]
0, [COLOR=#EF2929]' Then HrsUsed = 0[/color]
IF(SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P33)>40, [COLOR=#EF2929]' Else if HrsWork > 40[/color]
SUM(INDIRECT("P"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$P33)-40-SUM(INDIRECT("S"&ROW()-WEEKDAY(DATE($B$1,MONTH(1&$A33),B33))+1):$S32),[COLOR=#EF2929]' HrsWork - 40 - AccruedHrs[/color]
0
)
)
)
)