Ciao Stefano,
Norman ora che ho riaperto i tuo file gli errori sono scomparsi
non saprei perchè

Forse, prima volta, non avevi abilitate le macro.
per le ore di pausa dipendono dalle esigenze di cantiere
posso fare due pause di 0,5h ciascuna o di 1h
posso andare e poi rientrare di notte se mi chiamano
l'orario è molto variabile ma va sempre a 0,5h
cioè
8,00 - 8,30 - 9,00 etc etc
mai 8,15 o 8,45 o 8,25
per questo mi servirebbero i tre campi perchè in una giornata posso lavorare un minimo di 8 ore ed un massimo di 16
Nota che le funzioni già impostano automaticamente due pause di 0,5 ora: una pausa dopo 4 ore del primo turno di 8 ora e una seconda pausa nel caso di un secondo turno di 8 ore,
Tuttavia, per impostare una seconda pausa dopo 12 ore di lavoro, prova a sostiruire il codice con la seguente leggera modifica:
'=========>>
Option Explicit
'--------->>
Public Function OreStraordinario(Inizio As Date, _
Fine As Date, _
dDate As Date, _
Optional OrePausa As Double = 0.5, _
Optional OreStandard As Long = 8)
Dim WB As Workbook
Dim arrFeste As Variant
Dim Res As Variant
Dim dOreLavorati, dOreStraordinario As Double
Dim dOre As Double, dOreStandard As Double, dUplift As Double
Dim bWeekend As Boolean, bFeste As Boolean
Dim dOreLavorati2 As Double
Dim I As Long
Set WB = ThisWorkbook
bWeekend = Weekday(dDate, vbMonday) > 5
arrFeste = WB.Names("Feste").RefersToRange.Value
For I = 1 To UBound(arrFeste)
Res = dDate = arrFeste(I, 1)
If Res Then
bFeste = True
Exit For
End If
Next I
If Hour(Fine) > Hour(Inizio) Then
dOreLavorati = (Fine - Inizio) * 24
ElseIf Fine > 0 Then
dOreLavorati = (1 + Fine - Inizio) * 24
End If
dOreLavorati = dOreLavorati - Round(dOreLavorati / 8.25) * 0.5
If Not bFeste Then
If bWeekend Then
dOreStraordinario = dOreLavorati
Else
dOre = dOreLavorati - OreStandard
If dOre > 0 Then
dOreStraordinario = dOre
End If
End If
Else
dOreStraordinario = dOreLavorati
End If
OreStraordinario = dOreStraordinario
End Function
'--------->>
Public Function OreMaggiorazioni(Inizio As Date, _
Fine As Date, _
dDate As Date, _
Optional OrePausa As Double = 0.5, _
Optional OreStandard As Long = 8)
Dim WB As Workbook
Dim arrFeste As Variant
Dim Res As Variant
Dim dOreLavorati, dOreStraordinario As Double
Dim dOre As Double, dOreStandard As Double, dUplift As Double
Dim dOreNotturne As Double, dStraordinarioResto As Double
Dim bWeekend As Boolean, bFeste As Boolean
Dim dOreLavorati2 As Double
Dim I As Long
Set WB = ThisWorkbook
bWeekend = Weekday(dDate, vbMonday) > 5
arrFeste = WB.Names("Feste").RefersToRange.Value
For I = 1 To UBound(arrFeste)
Res = dDate = arrFeste(I, 1)
If Res Then
bFeste = True
Exit For
End If
Next I
If Hour(Fine) > Hour(Inizio) Then
dOreLavorati = (Fine - Inizio) * 24
ElseIf Fine > 0 Then
dOreLavorati = (1 + Fine - Inizio) * 24
End If
dOreLavorati = dOreLavorati - Int(dOreLavorati / 8) * 0.5
If Not bFeste Then
If bWeekend Then
dOreStraordinario = dOreLavorati
Else
dOre = dOreLavorati - OreStandard
If dOre > 0 Then
dOreStraordinario = dOre
End If
End If
End If
If bFeste Then
Select Case Fine
Case Is < Inizio '\ Dopo mezzanotte
dOreNotturne = Fine * 24
dStraordinarioResto = dOreLavorati - dOreNotturne
OreMaggiorazioni = dStraordinarioResto * 1.5 + dOreNotturne * 1.55
Case Else
OreMaggiorazioni = dOreLavorati * 1.5
End Select
End If
If Not bFeste Then
Select Case dOreStraordinario
Case Is > 2
OreMaggiorazioni = 2 * 1.25 + (dOreStraordinario - 2) * 1.3
Case Else
OreMaggiorazioni = dOreStraordinario * 1.25
End Select
End If
End Function
'--------->>
Public Function LunediDiPasqua(year As Long, Optional Orthodox As Boolean) As Date
'\ Based on Claus Tondering algorithm interpretation.
'\ See http://www.tondering.dk/claus/cal/node3
'\ Norman Harker 10-Jul-2004
'\ https://goo.gl/sGWMfy
Dim G As Long, C As Long, H As Long
Dim I As Long, J As Long, L As Long
Dim EM As Long, ED As Long
Dim Adj1904 As Long
Dim AdjJul As Long
G = year Mod 19
C = Int(year / 100)
H = (C - Int(C / 4) - Int((8 * C + 13) / 25) + 19 * G + 15) Mod 30
If Orthodox = False Then
I = H - Int(H / 28) * (1 - Int(29 / (H + 1)) * Int((21 - G) / 11))
J = (year + Int(year / 4) + I + 2 - C + Int(C / 4)) Mod 7
AdjJul = 0
End If
L = I - J
EM = 3 + Int((L + 40) / 44)
ED = L + 28 - 31 * Int(EM / 4)
If ActiveWorkbook.Date1904 = True Then
Adj1904 = 365 * 4 + 2
End If
LunediDiPasqua = DateSerial(year, EM, ED) - Adj1904 + AdjJul + 1
End Function
'<<=========
Ho aggiornato il mio file di prova Stefano20171027.xlsm
===
Regards,
Norman
