Ciao Stefano,
Prova qualcosa del genere:
- Alt+F11 per aprire l'editor di VBA
- Alt+IM per inserire un nuovo modulo di codice
- Nel nuovo modulo vuoto, incolla il seguente codice:
'=========>>
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 - 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
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
'<<=========
- Alt+Q per chiudere l'editor di VBA e tornare a Excel
- Salva il file con l’estensione xlsm
Per testare questo codice, scarica il mio file di prova Stefano20171027.xlsm

La formula nella cella B5 è
=OreStraordinario(B2;B3;B1;0,5 )
La formula nella cella B6 è
=OreMaggiorazioni(B2;B3;B1)
Se tu volessi aggiungere altre condizioni, potrò facilmente modificare il codeice,
Nel frattempo, verifica che i risultati ottenuti siano on acordo con quelli aspettati da te.
===
Regards,
Norman
