Piccola premessa
Excel lavora molto bene con i numeri e si sa che anche le date sono trattate internamente, da Excel, come numeri. Inoltre questa applicazione sa gestire bene anche l’incolonnamento e la formattazione in tabelle.
Prendendo spunto dall’esigenza di uno dei nostri utenti del forum, ecco una soluzione semplice e carina per realizzare una vista mensile di un calendario, posizionabile poi a piacere nel foglio e ulteriormente formattabile, non fa uso di formule nè di formattazioni condizionali, tiene conto dei sabati e delle domeniche colorandole di rosso.
La piccola routine si preoccupa di visualizzare i dati lungo una settimana, dal lunedì alla domenica. Basta precisare il mese e l’anno da visualizzare: la macro chiede una data iniziale, da inserire nella forma 01/mese/anno oppure per esteso (quindi vanno bene sia “01/12/2018” che “dicembre 2018”).
Il codice è abbastanza intelligente da capire se un certo giorno appartiene o no al mese desiderato; poichè il calendarietto espone la settimana intera, se il primo del mese non capita di lunedì, i giorni antecedenti verranno visualizzati in grigio per differenziarli dal mese in corso. Analogo discorso vale per la fine del mese.
Le possibilità di personalizzazione sono tante: per esempio la previsione di una “tabella delle festività” da agganciare alla generazione della vista mensile del calendario, o ancora la possibilità di visualizzare o meno i giorni che non appartengono al mese indicato.
L’esempio
In questo articolo presento la routine, che di per sè è semplice, corredata di alcuni accorgimenti per renderla fruibile e gradevole anche esteticamente. Il file di esempio risultante è scaricabile dal link posto in fondo all’articolo.
Lo scenario prevede una cella in cui inserire la data desiderata, un pulsante che scatena gli eventi e la zona di output, in cui si posizionerà la tabella contenente le date del mese indicato. La tabella si troverà nel range A3:F9.
Ecco una immagine del prodotto finito:
Vogliamo vedere il codice!
Nell’esempio il codice è diviso in due parti. Una breve procedura per il pulsante che avvia la generazione del calendario:
Codice del foglio1:
Option Explicit
Private Sub CommandButton1_Click()
Dim d As String
Range("B1").Select
d = Application.InputBox("Immetti una data nella forma ""01/mese/anno"", ad esempio ""01/12/2018""", "Data iniziale", Format(Date, "\0\1/mm/yyyy"), Type:=1)
If CBool(d) = False Then Exit Sub
Range("B1") = CDate(d)
Call create_calendar(CDate(d))
End Sub
E la seconda procedura, non molto più lunga, che rappresenta il cuore del sistema:
Codice del modulo1:
Option Explicit
Sub create_calendar(start_date As Date)
Dim first_date As Date
Dim last_date As Date
Dim iRow As Long
Dim iCol As Long
Dim aDay As Date
Range("4:10").Clear
Range("4:10").Font.Size = 10
first_date = start_date - Weekday(start_date, vbMonday) + 1
last_date = DateSerial(Year(start_date), Month(start_date) + 1, 0)
iRow = 4
Do
For iCol = 0 To 6
aDay = first_date + iCol + (iRow - 4) * 7
Cells(iRow, iCol + 1) = aDay
If Weekday(Cells(iRow, iCol + 1), vbMonday) > 5 Then
Cells(iRow, iCol + 1).Font.Color = vbRed
End If
If Month(aDay) <> Month(start_date) Then
Cells(iRow, iCol + 1).Font.Color = 10855845 'grigio
End If
Next
iRow = iRow + 1
Loop Until aDay > last_date
End Sub
Un breve commento
La partita si gioca sul ciclo settimanale a partire dal primo lunedì prima del 1° del mese indicato, infatti la tabella parte di lunedì. Tutti i giorni anteriori al 1° del mese (quando questo non sia esso stesso un lunedì) vengono colorati di grigio. Lo stesso accade per i giorni del mese dopo l’ultimo del mese, se il mese in questione non termina proprio di domenica.
Il primo lunedì prima del 1° del mese si calcola con una semplice sottrazione tra la data del 1° del mese e il numero del giorno della settimana corrispondente al 1° del mese. Se il 1° del mese è mercoledì, la data iniziale viene anticipata a due giorni prima del 1° del mese, e questi due giorni verranno indicati in grigio.
E’ quindi importante la funzione Weekday(data) che restituisce il numero del giorno della settimana di una data passata in argomento.
Scaricate il file di esempio e lasciate i vostri commenti!
› Come creare un calendarietto in Excel