Całkiem niedawno napisałem o formule, która w prosty sposób pozwala obliczyć dniówkę, w sytuacji, gdy mamy do czynienia z różnymi stawkami godzinowymi.
Pełne Godziny
Sporym ułatwieniem zadania było założenie, że czas pracy liczony jest w pełnych godzinach roboczych. W takiej sytuacji nie liczyliśmy faktycznie przepracowanego czasu – rozpoczęcie pracy i fajrant podane były w zaokrągleniu do konkretnych godzin.
Z punktu widzenia pracodawcy takie rozwiązanie jest korzystne – nie zaokrąglamy czasu pracy lecz płacimy pracownikowi za pełną liczbę przepracowanych godzin (nawet jeżeli pracownik przepracował 8 godzin i 50 minut to faktycznie pełnych godzin jest 8 i za to mu płacimy).
Z punktu widzenia pracownika takie rozwiązanie może być nieco krzywdzące, ale nie ma tutaj możliwości oszukania pracodawcy przez fikcyjne zwiększanie czasu pracy.
Czas Pracy Do Minuty
Z punktu widzenia arkusza kalkulacyjnego wprowadzenie rozliczenia “co do minuty” mocno utrudnia skonstruowanie odpowiedniej formuły.
Postanowiłem zmierzyć się z problemem i napisałem funkcję VBA, która oblicza dniówkę pracownika biorąc pod uwagę dwie rzeczy: jego dokładny czas pracy co do minuty, a także zmienność stawek zależnie od godziny.
Funkcja VBA
Ideę rozwiązania podsunął mi kolega Darek Jabłoński (Hurgadion z Excelforum). Ja to oprogramowałem i uzyskałem taki wynik:
' Funkcja oblicza dzienne wynagrodzenie pracownika z dokładnością
' co do minuty przy różnych stawkach godzinowych.
' Godziny muszą być podane jako liczby ułamkowe tj. 24h = 1, 6h = 0.25
Function ObliczWyplate(dblStart As Double, _
dblKoniec As Double, _
rngGodziny As Range, _
rngStawki As Range)
Dim dblWyplata As Double ' Kwota do wypłaty za całą dniówkę
Dim dblMinuty As Double ' Każda minuta w dobie licząc od północy
Dim dblStawkaGodzinowa As Double ' Stawka godzinowa dla konkretnej minuty
Dim iPozycja As Integer ' Pozycja godziny dla konkretnej minuty
Dim iLicznik As Integer ' Licznik pętli
' 24h = 1 -> 1min = 0.000694444444444
Const dblJEDNA_MINUTA As Double = 0.000694444444444
' Przelicz funkcję na wypadek zmian w arkuszu
' zmienić się mogą np. stawki godzinowe
Application.Volatile
' Pętla po wszystkich minutach w dobie (1 doba = 1440 minut)
For iLicznik = 1 To 1440
' Sprawdź czy minuta mieści się w obszarze roboczogodzinnym
dblMinuty = dblJEDNA_MINUTA * iLicznik
If (dblMinuty >= dblStart) And (dblMinuty <= dblKoniec) Then
' Sczytaj pozycję w zakresie godzin i stawką godzinową
iPozycja = WorksheetFunction.Match(dblMinuty, rngGodziny, 1)
dblStawkaGodzinowa = WorksheetFunction.Index(rngStawki, iPozycja)
'Dodaj stawkę minutową do wyniku
dblWyplata = dblWyplata + (dblStawkaGodzinowa / 60)
End If
Next iLicznik
' Przypisz funkcji wynik
ObliczWyplate = dblWyplata
End Function
Screen
Dla pracownika, który rozpoczął pracę o 7:40, a skończył ją o 16:25 formuła zwróciła prawidłowy wynik 114zł (101zł za pracę w godz. 8:00-16:00 + 4,67zł za pracę w godz. 7:40-8:00 + 8:33zł za pracę w godz. 16:00-16:25).
Formuła zawarta w komórce G4 to:
=ObliczDniowke(Start; Koniec; Godziny; Stawki)