Mi è stato proposto il problema di calcolare la differenza di giorni fra due date considerando però i soli giorni lavorativi, la soluzione immediata è utilizzare la funzione =GIORNI.LAVORATIVI.TOT (in excel è disponibile aggiungendo gli "strumenti di analisi") ma escude sia il sabato e la domenica sia bisogna specificare le festività.
La funzione che uso io, riprtata sotto, permette di: scegliere se considerare o meno il sabato lavorativo, escludere le festività nazionali, specificare un eventuale giorno per il santo patrono (all'interno della macro). Le festività considerate sono le nove a data fissa più il lunedì dell'angelo che viene calcolato per tutti gli anni necessari.
La funzione viene richiamata così (inserendola com macro appare fra le "definte dall'utente")
=GiorniLavorativiFraDate( Dal , Al, ggSett)
Per il parametro ggSett i valori permessi sono:
- 5: per settimane dal lunedì al venerdì
- 6: fino al sabato
- 7: esclude dal calcolo solo le festività
La funzione nella macro da inserire è:
Function DiffDate(
Dal,
Al,
ggSett)
SantoPatrono =
Array(0, 0)
'indicare giorno e mese es. per il 10 apile = array(10,4)
'calcola il giorno della settimana delle due date
Gsd = WeekDay(
Dal, 2)
Gsa = WeekDay(
Al, 2)
' porta il giorno di partenza al lunedì sccessivo se nel fine settimana
If (Gsd >
ggSett)
Then
Dal =
Dal + (7 - Gsd) + 1
Gsd = 1
End If
' porta la data di fine al venerdì o sabato precedente se nel fine settimana
If (Gsa >
ggSett)
Then
Al =
Al - (Gsa -
ggSett)
Gsa =
ggSett
End If
If (
Dal >
Al) Or (
ggSett < 5 Or
ggSett > 7)
Then
Ris = 0
' i valori negativi non vengono considerati
Else
' calcola la differenza complessiva fra le date senza
Ris =
Al -
Dal
' toglie i fine settimana per le sttimane intere
Ris = Ris -
Int((
Al -
Dal) / 7) * (7 -
ggSett)
' toglie l'eventuale fine settimana residuo: ad esempio fra un giov. e il lun succ.
If (Gsa < Gsd)
Then Ris = Ris - (7 -
ggSett)
' definizione delle festività nazionali fisse
FestivNaz =
Array(
Array(1, 1),
Array(6, 1),
Array(25, 4),
Array(1, 5), _
Array(15, 8),
Array(1, 11),
Array(8, 12),
Array(25, 12),
Array(26, 12))
For anno = Year(
Dal)
To Year(
Al)
' festività nazionali
For F = 0
To 8
DataFestiv =
DateSerial(anno, FestivNaz(F)(1), FestivNaz(F)(0))
If (
Dal < DataFestiv) And (DataFestiv <=
Al) And (WeekDay(DataFestiv, 2) <=
ggSett)
Then
Ris = Ris - 1
End If
Next F
' eventuale santo patrono
If (SantoPatrono(0) <> 0)
Then
DataFestiv =
DateSerial(anno, SantoPatrono(1), SantoPatrono(0))
If (
Dal < DataFestiv) And (DataFestiv <=
Al) And (WeekDay(DataFestiv, 2) <=
ggSett)
Then
Ris = Ris - 1
End If
End If
' lunedì dell'angelo
DataFestiv =
DataPasqua(anno) + 1
If (
Dal < DataFestiv) And (DataFestiv <=
Al) And (WeekDay(DataFestiv, 2) <=
ggSett)
Then
Ris = Ris - 1
End If
Next anno
End If
DiffDate = Ris
End Function