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
Tag:     

Come creare un calendarietto in Excel

LoginRegistrati
Stai vedendo 4 articoli - dal 1 a 4 (di 4 totali)
  • Autore
    Articoli
  • #9489 Risposta

    vecchio frac
    Senior Moderator
    • Sfida #1
      157 pts

      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.

      [Leggi tutto al seguente link: https://www.excelvba.it/forumexcel/come-creare-un-calendarietto-in-excel/]

      #9530 Risposta
      Marius44
      Marius44
      Moderatore
      • Sfida #4
        11 pts

        Ciao V.F.

        Complimenti per l'ottimo lavoro     

         

        Un'altra opportunità potrebbe essere quella di sfruttare l'Evento Worksheet_Change della cella B1 del Foglio (evitando così il pulsante e l'InputBox)

        Ciao,

        Mario

        #9533 Risposta

        vecchio frac
        Senior Moderator
        • Sfida #1
          157 pts

          Yessa, infatti mi son divertito a espandere un pochino la proposta altrimenti era scialba 😀

          Il cuore del carciofo, pardon del codice è solo la routine del modulo crea_calendar che potrebbe anche stare da sola, senza parametri, prendendo la data da una cella qualsiasi.

          Massima personalizzazione, ed è lo scopo di questi articoli... fornire lo spunto   

          #9589 Risposta
          Luca73
          Luca73
          Partecipante
            14 pts

            Aggiungerei il seguente pezzettino se interessa evidenziare il giorno corrente

            Private Sub Workbook_Open()
            Dim CellaW As Range
            With Sheets(1)
            .Range(.Range("A4"), .Range("A4").End(xlToRight).End(xlDown)).Interior.Pattern = xlNone
                If Date >= .Range("A4") And Now <= .Range("A4").End(xlToRight).End(xlDown) Then
                    For Each CellaW In .Range(.Range("A4"), .Range("A4").End(xlToRight).End(xlDown))
                        If CDate(CellaW) = Date Then
                            CellaW.Interior.Color = 5296274
                            Exit For
                        End If
                    Next
                End If
            End With
            End Sub
            
          LoginRegistrati
          Stai vedendo 4 articoli - dal 1 a 4 (di 4 totali)
          Rispondi a: Come creare un calendarietto in Excel
          Gli allegati sono permessi solo ad utenti REGISTRATI
          Le tue informazioni:



          vecchio frac - 2388 risposte

          albatros54
          albatros54 - 670 risposte

          patel
          patel - 541 risposte

          Marius44
          Marius44 - 448 risposte

          Luca73
          Luca73 - 432 risposte