Nachtschicht-Zeitberechnung für Zuschlag

Berechnung der Zeit, welche in eine Nachtschicht fällt (hh:mm)

In man­chen Be­trie­ben wird für die Arbeit­szeit, wel­che in die Nacht­schicht fällt, ein Zu­schlag be­zahlt. Wird die kom­plette Nacht­schicht, also von An­fang bis Ende gear­beit­et, dann ist das leicht zu berech­nen. Auch wenn die ge­sam­te Arbeit­szeit nur we­ni­ge Stun­den um­fasst aber kom­plett in der Nacht­schicht liegt, ist das kein Prob­lem.

Inter­es­sant wird es, wenn ein Teil der Arbeit­szeit im nor­mal be­zahl­ten Bere­ich liegt und ein ander­er Teil in der Nacht­schicht. Hier wird na­tur­ge­mäß nur jen­er Teil, welch­er in der Nacht­schicht liegt, hö­her be­zahlt. Und die gle­ich vor­ge­stell­te Funk­tion wird auch nur den bess­er zu ent­lohnen­den Zeit­bere­ich aus­rech­nen.

 Was Sie be­den­ken soll­ten, nein was Sie beacht­en müs­sen:

  • Der Code ge­hört in ein all­ge­meines Mod­ul. Tipps dazu find­en Sie hier.
  • Die Rei­hen­folge der Zeit­en muss stim­men, erst Be­ginn dann Ende.
  • Eine Schicht hat max­i­mal 23:59:59 h, muss also un­ter 24 Stun­den lie­gen.
  • Die An­fangs- und Endezeit­en müs­sen als ech­te Zeit ein­ge­ge­ben wer­den.
  • Den Be­ginn und das Ende der Nacht­schicht müs­sen Sie im Code erforder­lichen­falls an­pas­sen. Vor­ge­ge­ben ist 20:00 h bis 6:00 h in der Frü­he.
Option Explicit

Function NachtZeit(Beginn As Date, Ende As Date) As Date
   Dim NsStart As Date, NsEnde As Date
   Dim Ns As Boolean, ZweiTage As Boolean
   Dim Rc As Variant
   
   NsStart = CDate("20:00")   'Beginn der Nachtschicht
   NsEnde = CDate("6:00")     'Ende der Nachtschicht
   If Ende < Beginn Then ZweiTage = True
   If ZweiTage Then Ns = True
   If Beginn >= NsStart Or Beginn <= NsEnde Then Ns = True
   If Ende <= NsEnde Or Ende >= NsStart Then Ns = True
   If Ns Then
      If ZweiTage Then  'Beginn vor Mitternacht
         If Beginn >= NsStart Then  'Beginn in der Nachtschicht
            Rc = 1 - Beginn
         Else  'Beginn vor der Nachtschicht
            Rc = 1 - NsStart
         End If
         Rc = Rc + WorksheetFunction.Min(Ende, NsEnde)
      Else  'Nur an 1 Tag
         If Beginn < NsEnde Then 'Beginn ab Mitternacht
            Rc = WorksheetFunction.Min(NsEnde, Ende) - Beginn
         Else  'Beginn vor Mitternacht
            Rc = WorksheetFunction.Min(1, Ende) - WorksheetFunction.Max(NsStart, Beginn)
         End If
      End If
   End If
   NachtZeit = Rc
End Function

Sie kön­nen den Code hier­über ko­pie­ren und dann per Hand in Ihr Mod­ul ein­fü­gen oder in ein­er *.zip-gepack­ten Da­tei als Text bzw. importier­bare Da­tei hier her­un­ter la­den. Der Auf­ruf der Funk­tion erfol­gt so:
=Nacht­Zeit(Be­ginn; Ende)
wo­bei bei­de Argu­mente Be­ginn und Ende zwin­gend ein­ge­ge­ben wer­den müs­sen. Das ist ja auch lo­gisch, denn die Arbeit­szeit hat ja nun ein­mal eine Be­ginn- und eine En­de-Zeit. Ide­al­er­weise ver­weisen die bei­den Argu­mente auf eine Zel­le mit ein­er Uhr­zeit. Es ist aber auch mög­lich, eine Zeit in der Form "17:30" (ja, mit den Anführungsze­ichen) oder als Funk­tion wie z.B. ZEIT(17; 30; 0) als Argu­ment ein­zu­ge­ben.

Die­se Funk­tion gibt im­mer eine Uhr­zeit zu­rück. Es ist auss­chließlich die Zeit­span­ne, wel­che in der Nacht­schicht geleis­tet wur­de, also hö­her be­zahlt wer­den muss. Soll die Zeit als Grund­lage für eine Ent­gelt­berech­nung die­nen, dann muss das Ergeb­nis mit 24 mul­ti­pliziert und soll­te dann der Deut­lichkeit we­gen als Dez­i­malzahl dar­ge­stellt wer­den.

Um die Funk­tion mög­lichst ein­fach hand­hab­bar zu ma­chen, sind nur die bei­den unbe­d­ingt erforder­lichen Para­me­ter bei dem obi­gen Code eingear­beit­et. Möcht­en Sie das Gan­ze flex­i­bler gestal­ten, in­dem Sie bei jed­er Berech­nung den Be­ginn und das Ende der Nacht­schicht in den Funk­tion­saufruf als Argu­ment ein­ge­ben, dann muss der Code leicht geän­dert wer­den. Sie kön­nen ihn als gepack­te Text­datei an die­ser Stel­le herun­ter­laden. Der Auf­ruf er­gibt sich aus dem Funk­tion­sna­men, alle vier Argu­mente sind Pflicht-Ein­ga­ben. Die bei­den let­zten Argu­mente sind der Be­ginn und das Ende der Nacht­schicht und müs­sen (natür­lich) so über­ge­ben wer­den, dass Ex­cel sie als Zeit inter­pretieren kann.

[NachOben­Let­zte Ver­weis=„ML: Nacht­schicht ex­tra­hie­ren”]
Dieser Beitrag wurde unter Datum und Zeit, Mit VBA/Makro, Musterlösungen, Rechnen & Zahlen, Zeit-Funktionen abgelegt und mit , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.