Quando si sviluppa un foglio di lavoro, potrebbe essere necessario conoscere l’ultimo giorno lavorativo di un determinato mese. Supponendo che i tuoi giorni lavorativi siano dal lunedì al venerdì, la seguente formula restituirà la data desiderata:

=DATE(YEAR(A1),MONTH(A1)+1,0)-(MAX(0,WEEKDAY (DATE(YEAR(A1),MONTH(A1)+1,0),2)-5))

Questa formula restituisce una data che va solo dal lunedì al venerdì e sempre l’ultimo giorno del mese rappresentato dalla data in A1. Per alcuni scopi, potrebbe essere necessario sapere qual è l’ultimo venerdì di un dato mese. Questo è facilmente determinabile con questa formula:

=DATE(YEAR(A1),MONTH(A1)+1,0)-WEEKDAY(DATE (YEAR(A1),MONTH(A1)+1,0))+(WEEKDAY(DATE (YEAR(A1),MONTH(A1)+1,0))>5)*7-1

Questa formula calcola l’ultimo giorno del mese per la data nella cella A1 e, in base al giorno della settimana in cui si trova quella data, sottrae il numero appropriato di giorni per restituire il venerdì precedente.

Se vuoi prendere in considerazione le vacanze di lavoro, la complessità della formula diventa piuttosto alta, abbastanza rapidamente. Per questo motivo, è meglio creare una funzione definita dall’utente (una macro) che determinerà l’ultimo giorno lavorativo e compenserà le festività.

La macro seguente restituisce una data, dal lunedì al venerdì, che rappresenta l’ultimo giorno lavorativo. La data viene confrontata con un elenco delle festività (HolidayList), che dovrebbe essere un intervallo denominato nella cartella di lavoro. Se si trova che la data è una festività, il giorno lavorativo di fine viene diminuito fino a quando non viene individuato un giorno adatto.

Function LastWorkDay(lRawDate As Long, _     Optional rHolidayList As Range, _     Optional bFriday As Boolean = False) As Long

LastWorkDay = DateSerial(Year(lRawDate), _       Month(lRawDate) + 1, 0) - 0     If bFriday Then         LastWorkDay = MakeItFriday(LastWorkDay)

Else         LastWorkDay = NoWeekends(LastWorkDay)

End If

If Not rHolidayList Is Nothing Then         Do Until myMatch(LastWorkDay, rHolidayList) = 0             LastWorkDay = LastWorkDay - 1             If bFriday Then                 LastWorkDay = MakeItFriday(LastWorkDay)

Else                 LastWorkDay = NoWeekends(LastWorkDay)

End If         Loop     End If End Function
Private Function myMatch(vValue, rng As Range) As Long     myMatch = 0     On Error Resume Next     myMatch = Application.WorksheetFunction _         .Match(vValue, rng, 0)

On Error GoTo 0 End Function
Private Function NoWeekends(lLastDay As Long) As Long     NoWeekends = lLastDay     If Weekday(lLastDay) = vbSunday Then _       NoWeekends = NoWeekends - 2     If Weekday(lLastDay) = vbSaturday Then _       NoWeekends = NoWeekends - 1 End Function
Private Function MakeItFriday(lLastDay As Long) As Long     MakeItFriday = lLastDay     While Weekday(MakeItFriday) <> vbFriday         MakeItFriday = MakeItFriday - 1     Wend End Function

Si noti che sono incluse tre funzioni private. Queste funzioni vengono chiamate dall’interno della funzione LastWorkDay principale. Il primo, myMatch, è un “wrapper” per il normale metodo Match. Questo utilizzo è incluso a causa della gestione degli errori richiesta.

La seconda funzione, NoWeekdends, viene utilizzata per eseguire il backup di una data fino al venerdì precedente se si tratta solo di sabato o domenica. La funzione MakeItFriday viene utilizzata per garantire che una data sia sempre venerdì.

Per usare questa funzione definita dall’utente dal tuo foglio di lavoro, la usi in una formula, come questa:

=LastWorkDay(A1, HolidayList, TRUE)

Il primo parametro (A1) è la data da valutare. Il secondo parametro (HolidayList) è un elenco facoltativo di date delle festività. Come mostrato qui, si presume che HolidayList sia un intervallo denominato nel foglio di lavoro.

Se viene fornito questo parametro, la funzione si assicura che qualsiasi data restituita non sia nell’elenco delle date in HolidayList.

Anche il parametro finale è facoltativo; può essere VERO o FALSO.

(L’impostazione predefinita, se non specificata, è FALSE.) Se questo parametro è impostato su TRUE, la funzione restituisce sempre l’ultimo venerdì del mese. Se questo parametro è TRUE e viene fornito l’HolidayList, la funzione restituisce l’ultimo venerdì non festivo del mese.

_Nota: _

Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.

ExcelTips è la tua fonte di formazione economica su Microsoft Excel.

Questo suggerimento (10085) si applica a Microsoft Excel 2007 e 2010. Puoi trovare una versione di questo suggerimento per la vecchia interfaccia del menu di Excel qui: