sabato 22 gennaio 2022

Google Sheets - Formula per trovare l'ultimo (o penultimo o primo, o secondo, etc) venerdì (o giovedì, o martedì etc.) di un dato mese

 Vorrei creare un "date picker" multiplo, che all'occorrenza possa anche accogliere delle indicazioni come "ogni ultimo mercoledì del mese", per inviare una email ad esempio.

Ho provato a cercare una formula per individuare l'ultimo giorno (lunedì, martedì, mercoledì, giovedì, venerdì, sabato o domenica) in un mese.

Non ho trovato nulla di interessante e ho prodotto qualcosa. La formula può valere per "l'ultimo venerdì del mese", "il secondo mercoledì del mese", il quarto giovedì ecc.

Per "primo", "secondo", "terzo" e "quarto" occorre indicare in una cella 1, 2, 3, 4; per "ultimo", "penultimo", "terzultimo", "quartultimo" occorre indicare -1, -2, -3, -4 

Il risultato si trova in un nuovo foglio "Weekdays" che ho aggiunto al calendario condiviso (che è in sola lettura ma può essere copiato):

https://docs.google.com/spreadsheets/d/1W1Z9JkUb58wDi8LRxS4XcrKcwWbTFWxmNxUq_cHx8BA/edit?usp=sharing

La formula ha bisogno di tre dati:
E2 un giorno di un certo mese (nel formato data di Google Sheet)

C5 il giorno della settimana desiderato (da 1 per domenica a 7 per sabato)

C6 un valore di 1, 2, 3 o 4 oppure di -1, -2, -3, -4 (a significare primo, secondo... penultimo, terzultimo...

Il valore riportato è la data richiesta.

La formula è:

=(FINE.MESE(E2; (-1 + (C6 < 0))) + 1) + RESTO((C5 - GIORNO.SETTIMANA((FINE.MESE(E2; (-1 + (C6 < 0))) + 1))); 7) + (C6 * 7)

I comandi in inglese sono:

=(EOMONTH(E2; (-1 + (C6 < 0))) + 1) +
  MOD((C5 - WEEKDAY((EOMONTH(E2; (-1 + (C6 < 0))) + 1))); 7) +
  (C6 * 7
 )

I seguenti esempi sono forse superflui ma li metto perché forse mi aiuteranno a ritrovare questo post quando mi servisse.

Con C5 = 1 e C6 = 1 si troverà la prima domenica del mese
Con C5 = 2 e C6 = 1 si troverà il primo lunedì del mese
Con C5 = 3 e C6 = 1 si troverà il primo martedì del mese
Con C5 = 4 e C6 = 1 si troverà il primo mercoledì del mese
Con C5 = 5 e C6 = 1 si troverà il primo giovedì del mese
Con C5 = 6 e C6 = 1 si troverà il primo venerdì del mese
Con C5 = 7 e C6 = 1 si troverà il primo sabato del mese
Con C5 = 1 e C6 = -1 si troverà l'ultima domenica del mese
Con C5 = 2 e C6 = -1 si troverà l'ultimo lunedì del mese
Con C5 = 3 e C6 = -1 si troverà l'ultimo martedì del mese
Con C5 = 4 e C6 = -1 si troverà l'ultimo mercoledì del mese
Con C5 = 5 e C6 = -1 si troverà l'ultimo giovedì del mese
Con C5 = 6 e C6 = -1 si troverà l'ultimo venerdì del mese
Con C5 = 7 e C6 = -1 si troverà l'ultimo sabato del mese

Altri esempi:
Con C5 = 3 e C6 = 4 si troverà il quarto martedì del mese
Con C5 = 5 e C6= -3 si troverà il terzultimo giovedì del mese

Per il funzionamento vedere il foglio.
Indicativamente:
Se la variabile che indica primo/ultimo etc. ha valore positivo (si cerca il primo, secondo terzo o quarto giorno nel mese) si parte dal primo giorno del mese, al quale si somma una correzione che cambia in base a che giorno è il primo del mese e quale giorno si sta cercando. Se il primo del mese è martedì e si sta cercando il giovedì, allora il giovedì sarà il 3 del mese. Determinato quello, si aggiunge un multiplo di 7 (0, 7, 14, 21) e si trova il primo o secondo etc. 
Se la variabile è negativa, si parte dal primo giorno del mese successivo e si trova il primo giorno del mese successivo, poi si sottrare un multiplo di 7 (7, 14, 21, 28).
Per trovare il primo giorno del mese si usa FINE.MESE() + 1. Quindi per il primo giorno del mese corrente occorre fare FINE.MESE(precedente)+1 e per il primo del mese successivo occorre fare FINE.MESE(corrente)+1.
Nella funzione FINE.MESE(), l'espressione (-1 + (C6 < 0))  genere -1 o 0. Vale -1 quando si cerca il primo, secondo... giorno del mese mentre vale 0 (mese corrente) quando si cerca l'ultimo, il penultimo... giorno del mese.



Nessun commento:

Posta un commento

NOTA: Attualmente i commenti sono moderati, vale a dire che non compariranno immediatamente. Questo mi consente sia eliminare eventuale spam sia di leggere i messaggi e eventualmente rispondere.