Festivi e finesettimana italia



  • Festivi e finesettimana italia
    di Mik (utente non iscritto) data: 19/01/2011

    Apro questa discussione per postare lo sviluppo del riconoscimento di date festive e fine settimana nel calendario italiano:

    avevamo già discusso su come procedere attraverso alcune funzioni al riconoscimento delle date se cadono in una festività o fine settimana..dato che gli applicativi di office non supportano queste formule di default, ce le creiamo noi attraverso il codice vba e possono ritornare utili in qualsiasi progetto di office e vba.

    le ho raccolte e divise in tre funzioni principali:
    (pasqua poteva essere implementata in isfestività(), ma ho preferito isolarla per un miglior ordine di lettura)

    1.la funzione pascqua(): calcola la festività di pasqua (e pasquetta) di un determinato anno (passato come argomento nei parametri della funzione).

    2.la funzione isfestivo() passandoli come parametro una qualsiasi data, restituisce 'vero' se appartiene a una festività italiana, 'falso' se non appartiene ad alcuna festività;

    3.la funzione isweekend() passandoli come argomento una qualsiasi data, restituisce 'vero' se appartiene ad un fine settimana, 'falso' se non appartiene ad un fine settimana (e quindi infrasettimanale)..

    di seguito le 3 funzioni. copiare tutto e incollare (così come sono) in un modulo di vba (se non ne esiste, crearne uno nuovo).

     
    Public Function Pasqua(ByVal Anno As Integer) As Date
        'Il metodo è valido per tutti gli anni nel Calendario Gregoriano,
        'ossia dal 1583 in poi
        
        Dim A%, B%, C%, P%, Q%, R%
        
        A = Anno% Mod 19: B = Anno%  100: C = Anno% Mod 100
        P = (19 * A + B - (B  4) - ((B - ((B + 8)  25) + 1)  3) + 15) Mod 30
        Q = (32 + 2 * ((B Mod 4) + (C  4)) - P - (C Mod 4)) Mod 7
        R = (P + Q - 7 * ((A + 11 * P + 22 * Q)  451) + 114)
        Pasqua = DateSerial(Anno%, R  32, (R Mod 31) + 1)
        
    End Function
    
    Public Function IsFestivo(ByVal Data As Date) As Boolean 'Riferito ai festivi del calendario italiano
        Dim Giorni_Festivi() As Variant, Data_Pasqua As Date, Festivo
        
        Data_Pasqua = Pasqua(Year(Data))
        
        Giorni_Festivi = Array("1-1", "6-1", "25-04", "1-5", "2-6", "15-8", "1-11", "8-12", "25-12", "26-12", Data_Pasqua, Data_Pasqua + 1)
        
        IsFestivo = False
        For Each Festivo In Giorni_Festivi
            If Day(Data) = Day(Festivo) And Month(Data) = Month(Festivo) Then
                IsFestivo = True
                Exit For
            End If
        
        Next Festivo
        
    End Function
    
    Public Function IsWeekEnd(ByVal Data As Date) As Boolean 'Fine Settimana In Italia (Sabato e Domenica)
        If Weekday(Data, vbMonday) < 6 Then
            IsWeekEnd = False
        Else
            IsWeekEnd = True
        End If
    End Function
    
    


  • Sviluppo
    di Mik (utente non iscritto) data: 19/01/2011

    Ora date queste tre funzioni base, possiamo sbizzarirci come meglio si crede..

    in questo esempio ho buttato giù due righe di codice per sviluppare una nuova funzione 'calcola_lavorativi()', che conta i giorni lavorativi (escudendo dal conteggio i finesettimana e festivi) da un intervallo di data ipotetico, dove:
    data1= data inizio conteggio
    data2= data fine conteggio (compresa)

    copiate e incollate questo codice e mettetere come formula questa funzione...come una qualsiasi formula di excel passandoli come parametri le due celle dove memorizzere la data inizio e fine conteggio (separate dal ';' (punto e virgola))..vi restituirà il numero di giorni lavorativi in quell'arco di tempo:
     
    Public Function Calcola_Lavorativi(Data1 As Date, Data2 As Date) As Long
        Dim Conta As Long, D As Date
        Conta = 0
        
        For D = Data1 To Data2
        
            If Not IsFestivo(D) And Not IsWeekEnd(D) Then Conta = Conta + 1
            
        Next D
        Calcola_Lavorativi = Conta
    End Function
    


  • Sviluppo_2_ festivi infrasettimanali
    di Mik (utente non iscritto) data: 19/01/2011

    Oppure: contare i festivi che cadono nei giorni infrasettimanali..(quindi escude dal conteggio quelli che cadono di sabato e domenica)
     
    Public Function Calcola_Festivi_Infrasettimanale(Data1 As Date, Data2 As Date) As Long
        Dim Conta As Long, D As Date
        Conta = 0
        
        For D = Data1 To Data2
        
            If IsFestivo(D) and Not IsWeekEnd(D) Then Conta = Conta + 1
            
        Next D
        Calcola_Festivi_Infrasettimanale = Conta
    End Function
    


  • Esempio di festivi infrasettimanali
    di Mik (utente non iscritto) data: 19/01/2011

    Per esempio:
    se vogliamo sapere nell'anno 2011 quante sono le festivita che cadono nella settimana (e quindi non di sabato e domenica), basta mettere come data iniziale 01/01/2011 e data finale 31/12/2011 (1° e ultimo giorno dell'anno 2011)..
    ci restituierà che quest'anno sono solo 7

    ci andrà meglio nel 2014 quando saranno ben 10 festività (quasi tutte se non tutte tranne pasqua che è sempre di domenica)

    ciauu