'--- Was ist ein Konstruktionsmakro? ----------------------------------------
'
'Du baust Dir Deine Datei beliebig oft selbst, indem Du diesen Code ausführst!
'
'Wie funktioniert es?
'- Mit Strg-A, Strg-C diesen Text, den Du hier gerade liest, komplett kopieren
'- Aus Excel heraus den VBA-Editor aufrufen: Alt-F11
'- Ein Modul anlegen: Alt-E M
'- Den Code dort einfügen: Strg-V
'- Den Code ausführen: F5
'
'Den Code brauchst Du danach nicht mehr! Was entsteht, ist eine Datei ohne VBA. Sie wird hiermit einfach nur gebaut.
'
'Welche Lohnzuschlags-Version wird erstellt?
'--- Die von MacGyver, mit 10% Zuschlag von 23:-6: und sonntags/feiertags ---
'--- http://www.clever-excel-forum.de/thread-14941.html (Mai 2018) ----------
'
'Was kann das Modell schon?
'- Wochentage einzeln mit verschiedenen Zuschlagszeiten versehen
'- Feiertage (sind - bis auf Neujahr - hier nicht automatisch eingetragen)
'- gesetzliche Pausen 6:-6:30 und 9:-9:15 genau in der richtigen Zuschlagszeit abziehen
'- die Zeit-Summe wird für die Lohnberechnung erstellt, also inklusive 10% oder 0% Zuschlag abz. ges. Pausen
'- alles ist anpassbar! Du kannst sogar die gesetzlichen Pausen manipulieren, bspw. auf 6:30-7: und 9:15-9:30 (ist aber nicht zulässig!)
'
'Was kann es noch nicht?
'- Überstunden mit eigenem und gleichzeitigem Zuschlagssystem verwalten (das wird noch ein wenig schwierig werden!)
'- halbe Feiertage HlgAbd und Silv berücksichtigen (ist aber kein großer Aufwand)
'- es ist noch nicht geschwindigkeitsoptimiert, indem nur 2 Tage maximal ausgewertet werden, statt 366 (kein Problem)
'- klassische weitere Lohnbelange, wie U, K, F, Zeitsaldo (ist aber kein großer Aufwand)
'
'Wie bediene ich es?
'- In Spalte B und C einen Arbeitsbeginn und -ende eintragen (nach Zeile 371), nachdem Du die letzte Zeile nach unten ausgefüllt hast (wegen Formeln)
'- In H3 den 1.1. des Jahres eintragen, also z.B. 1.1.2018
'- In O3:O20 die Feiertage des Jahres eintragen (wird später noch automatisiert)
'
''Bitte um Rückmeldung, falls bei Deiner Excel-Version etwas nicht richtig läuft. Ich kann sie nicht alle testen. Getestet: 2000 und 365 (Mai2018)
'
'Na dann: Viel Erfolg!

Sub Lohnzuschlagsberechnung() 'Konstruktionsmakro: xl365: getestet, xl2000: getestet. Stand: 9.5.2018
Workbooks.Add xlWorksheet: Columns(16).Resize(, Columns.Count - 15).Hidden = True: [B:C].NumberFormat = "DDD DD/MM/YYYY hh:mm"
[D:G].NumberFormat = "hh:mm": [O2] = "F-Tage": [D2] = "Pausen": [A:M].Interior.Color = 14474460: [D:G,N:O,H1:M2,H6:M7].Interior.Color = 10526880
[H:M].NumberFormat = "[h]:mm;;": [H1:M6].NumberFormat = "h:mm": [H7:L7].NumberFormat = "0%": [H7:M7] = Array(0.1, 0, 0.1, 0.1, "", "Zuschlag")
[A8:O8] = Split("lfdNr von bis Pause1B Pause1E PauseNB PauseNE früh Tag spät WE-FT (unused) Sum StdLohn Lohn")
[8:8].HorizontalAlignment = xlRight: [A:O].ColumnWidth = 7: [B:C].ColumnWidth = 17: [N:O].NumberFormat = "0.00;-0.00;"
[B9] = 43101.05: [C9] = 43101.43: [D9] = "=(R[0]C2+R3C)*(RC2+R3C<RC3)": [E9] = "=MIN(RC[-1]+R3C,RC3)*(RC[-1]>0)"
[M9] = "=SUMPRODUCT(1+R7C[-5]:R7C[-1],RC[-5]:RC[-1])": [N9] = 9.35: [O9] = "=ROUND(RC[-1]*RC[-2]*24,2)"
a = Array("=(b9<=c9)", "=(b9<=d9)*(d9<=c9)", "=($d9<=e9)*(e9<=$c9)", "=(INDEX(9:9,COLUMN()-1)<=f9)*(f9<=$c9)", "=($d9<=g9)*(g9<=$c9)")
[D9:E9].Copy [F9:G9]: [D3:G3] = Array("6:", "0:30", "9:", "0:15"): [H9:L9] = "=Dauer": For i = 3 To 7: Cells(9, i).Validation.Add 7, Formula1:=a(i - 3)
Next: Names.Add "XX", "=IF(R3C[1]:R5C[1]-RC3:RC7<0,R3C[1]:R5C[1],RC3:RC7)-IF(R3C:R5C-RC2:RC6>0,R3C:R5C,RC2:RC6)": [9:10].FillDown
Names.Add "Dauer", "=SUM((1-2*(COLUMN(R[0]C2:RC6)>3))*(MOD(COLUMN(RC2:RC6),2)=0)*(XX>0)*XX)": [B10:C10] = "=R[-1]C+0.31": [10:58].FillDown
[H1:N1] = Array(0, 0, 0, 0, 1, 1, "WE-FT"): [H2:N2] = Array(0, "6:", "23:", 1, 1, 1, "WT"): [H4] = "=R[-1]C+1"
[H3,O3] = 43101: [5:367].Insert: [N3:N4] = "=(LOOKUP(RC[-6],R3C[1]:R22C[1])<>RC[-6])*(MOD(RC[-6],7)<>1)+1"
[I3:M4] = "=RC8+INDEX(R1C:R2C,RC14)": [H4:N368].FillDown: [5:366].EntireRow.Hidden = True: [O2:O22].Interior.Color = 14474460
[H3:H368,O3:O22].NumberFormat = "DDDMMDD": [D372].Select: ActiveWindow.FreezePanes = True
End Sub

