Grazie.
Ciao Mario
premesso che sarebbe meglio non aprire un nuovo tread ma continuare
quello precedente potresti provare a scaricare dal sito del *mitico*
Fernando il suo file Excel (molto completo) ed adattarlo alle tue
esigenze sommando e sottraendo gli elementi che ti interessano.
Riporto quanto linkato da Fernando nella sua precedente risposta.
vedi:
http://www.prodomosua.eu/zips/delledate.xls
.f
Roberto (IW1ERL)
Ciao Mario
Proviamoci passo passo. 2 soluzioni: quella di Fernando e quella mia.
Preliminarmente creati degli intervalli denominati ( Inserisci >> Nome
>> Definisci...ecc ).
una cella : inizio . Qui ( nel senso cella corrispondente sul foglio
di lavoro ) inserisci data inizio
una cella : fine . Qui inserisci data fine
una cella: patrono ( opzionale ) . Qui inserisci un'eventuale festa
patronale
undici celle: festività . ( solo per soluzione Fernando ) Qui
inserisci manualmente le feste relative all'anno di pertinenza.
Nell'eventualità il periodo copra più di un anno devi eventualmente
allargare il numero di celle dell'intervallo a comprendere tutte le
feste relative.
Soluzione Fernando:
dove vuoi, da inserire come matriciale ( Maiusc + Ctrl + Invio ):
=INT((6*fine)/7)-INT((6*inizio+1)/7)+1-
SOMMA(1*((festività*(1*RESTO(festività;7)<>1))>=inizio))
+SOMMA(1*((festività*(1*RESTO(festività;7)<>1))>fine))
Soluzione personale ( non richiede la lista inserita nell'intervallo
festività che può, pertanto, essere eliminata): formula definita
dall'utente *non matriciale* ( da inserire solo dopo aver incollato il
codice alla fine del post in un modulo standard)
=DiffGiorniLavorativi(inizio;fine;FALSO;patrono)+1
oppure, se non interessa, festa patronale
=DiffGiorniLavorativi(inizio;fine;FALSO)+1
Se il terzo parametro è passato come VERO verrano calcolati come non
lavorativi anche i sabato ( al posto di VERO o FALSO puoi mettere
rispettivamente 1 oppure 0 ).
La formula restituisce un valore nullo se la data di fine è
antecedente a quella di inizio.
Inserisci il codice con:
Alt F11 >> Inserisci Modulo >> Doppio click su Modulo1 >>Incollare il
codice nella finestra codice >> tornare a Excel con Alt F11 >>
Inserire la formula DiffGiorniLavorativi ( manualmente oppure con la
finestra Inserisci Funzione >> Categoria Definite dall'utente >>
DiffGiorniLavorativi)
Vantaggi soluzione Fernando: non richiede VBA
Vantaggi soluzione personale: non richiede alcuna preparazione
preliminare di una lista delle feste sul foglio di lavoro e della
consultazione di un calendario per il lunedì di Pasqua.
Ciao Elio
Option Explicit
' Elio Buonocore elib...@tin.it : 9 feb 2005
Function GiornoNonLavorativo(dtmMiaData As Date, _
Optional SabatoNonLav As Boolean = False, _
Optional dtmPatrono As Date = "1-gen") As Boolean
GiornoNonLavorativo = False
Select Case Format(dtmMiaData, "d-mmm")
Case Is = "1-gen", "6-gen", "25-apr", _
"1-mag", "2-giu", "15-ago", _
"1-nov", "8-dic", "25-dic", "26-dic", _
Format(dtmPatrono, "d-mmm")
GiornoNonLavorativo = True
Exit Function
End Select
Select Case WorksheetFunction.Weekday(dtmMiaData, 2)
Case Is = 7
GiornoNonLavorativo = True
Exit Function
Case Is = 6
If SabatoNonLav = True Then
GiornoNonLavorativo = True
Exit Function
End If
End Select
If WorksheetFunction.Weekday(dtmMiaData, 2) = 1 Then
If Month(dtmMiaData) = 3 Or Month(dtmMiaData) = 4 Then
If dtmMiaData = EASTER(Year(dtmMiaData)) + 1 Then
GiornoNonLavorativo = True
Exit Function
End If
End If
End If
End Function
Function DiffGiorniLavorativi(Inizio As Date, _
Fine As Date, Optional SabatoNonLav _
As Boolean = True, Optional Patrono _
As Date = "1-gen") As Long
Dim lngGiorniLavorativi As Long
Dim dtmMiaData As Date
If Fine >= Inizio Then
For dtmMiaData = Inizio To Fine
If GiornoNonLavorativo(dtmMiaData, _
SabatoNonLav, Patrono) = False Then
lngGiorniLavorativi = _
lngGiorniLavorativi + 1
End If
Next dtmMiaData
DiffGiorniLavorativi = lngGiorniLavorativi - 1
Else
'MsgBox "La data iniziale non" _
'&"può essere successiva alla finale"
DiffGiorniLavorativi = Null
End If
End Function
Function EASTER(Yr As Integer) As Long
' Dal sito: http://longre.free.fr/pages/
'form/dateheure.htm#Jours_fériés.
Dim Century As Integer
Dim Sunday As Integer
Dim Epact As Integer
Dim Golden As Integer
Dim LeapDayCorrection As Integer
Dim SynchWithMoon As Integer
Dim N As Integer
Golden = (Yr Mod 19) + 1
Century = Yr \ 100 + 1
LeapDayCorrection = 3 * Century \ 4 - 12
SynchWithMoon = (8 * Century + 5) \ 25 - 5
Sunday = 5 * Yr \ 4 - LeapDayCorrection - 10
Epact = (11 * Golden + 20 + SynchWithMoon _
- LeapDayCorrection) Mod 30
If Epact < 0 Then Epact = Epact + 30
If (Epact = 25 And Golden > 11) Or _
Epact = 24 Then Epact = Epact + 1
N = 44 - Epact
If N < 21 Then N = N + 30
N = N + 7 - ((Sunday + N) Mod 7)
EASTER = DateSerial(Yr, 3, N)
End Function