Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Calcolo dei giorni feriali tra due date

604 views
Skip to first unread message

Mario

unread,
Nov 15, 2007, 6:03:03 AM11/15/07
to
ripropongo la domanda fatta già in precedenza in quanto non è
stata ben compresa.
Ho necessità di una formula per il calcolo dei giorni feriali (inclusi i
sabati ed escluse le fstività nazionali e le domeniche) tra due date.
La funzione giorni.lavorativi.tot non mi è utile in quanto salta i sabati.

Grazie.


IW1ERL

unread,
Nov 15, 2007, 6:30:18 AM11/15/07
to

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)

elby

unread,
Nov 16, 2007, 8:35:48 PM11/16/07
to
On 15 Nov, 12:03, Mario <Ma...@discussions.microsoft.com> wrote:

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

Andrea22

unread,
Oct 13, 2013, 10:40:48 AM10/13/13
to
Ciao ho smanettato un po’ ed ho trovato questo interessante post, che adotto volentieri!

Vorrei sapere se è possibile implementarlo in base al file del quale allego il collegamento:
https://skydrive.live.com/redir?resid=5E856AF67A873B3E!308&authkey=!AN3-Y1jQHD-6y8Y


Mi servirebbe per calcolare esattamente i giorni lavorativi divisi tra servizio del mattino e della sera di un ristorante.

In determinati periodi dell’anno non sempre siamo aperti sia a pranzo che a cena e quindi questo porta inevitabilmente a ricavi diversi e soprattutto a costi diversi!

Ti chiedo quindi se hai voglia di aiutarmi:

- Non ho modificato la tua macro
- I parametri in giallo sono quelli che andrò ad inserire (fatte salve le festività nella macro che, per comodità, solamente riporto nel foglio1)
- Poi dovrò inserire per ogni servizio, mattina o sera, i periodi dell’anno che non lavoro. Questo non significa che non lavorerà la sera e/o viceversa. Ho considerato tre periodi, penso bastino. Nota bene le celle B8 e B9, che comprendono ferie/chiusura per entrambi i servizi comandano, sono prioritarie.

A questo punto dovrò cercare di ottenere dei totali, tenendo conto dei parametri sopra esposti, divisi tra giornate lavorative: mi interessa sapere quanti, ad esempio,lunedì avrò nell’arco di quel periodo e/o dell’anno.

Lo stesso vale però diviso per i singoli mesi!

Secondo te è possibile?

Grazie infinite

Andrea

rivap...@gmail.com

unread,
Oct 16, 2013, 10:57:09 AM10/16/13
to
Ci vedo poca relazione tra la tua esigenza e il post richiamato del 2007. Considerato che lavori il sabato e la domenica converrebbe avere un altro approccio. Farei un calendario annuale ( per es a sviluppo orizzontale ) con righe di appoggio che restituiscono un valore 0 o 1 in base a determinati criteri: la data corrisponde ad una festa nazionale? è inclusa nel periodo di chiusura totale o di chiusura parziale per quel giorno? ecc. Ovviamente il set di righe di appoggio dovrebbero essere, almeno in parte, duplicato per mattino e sera. Il calendario annuale può poi essere reso perpetuo con formule.
È comunque un intero applicativo e non una semplice task. Conviene che cominci a strutturare il file con il calendario di appoggio ed eventualmente richiede spiegazioni su singoli aspetti. Qui uno spunto per iniziare.
https://groups.google.com/forum/#!topic/microsoft.public.it.office.excel/yxqOecVJ9vs
Ciao
Elio
0 new messages