Giorni lavorativi fra due date
Info
Esempi
Linguaggio
Librerie
Formule
Ultimi Inseriti

 Login

 Password

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:
  1. 5: per settimane dal lunedì al venerdì
  2. 6: fino al sabato
  3. 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
 

data4idea srls - PIva 01881000937 - info@data4idea.it