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

Login Registrati
Stai vedendo 12 articoli - dal 1 a 12 (di 12 totali)
  • Autore
    Articoli
  • #9489 Score: 0 | Risposta

    vecchio frac
    Senior Moderator
      246 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 Score: 0 | Risposta

      Marius44
      Moderatore
        52 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 Score: 0 | Risposta

        vecchio frac
        Senior Moderator
          246 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 Score: 0 | Risposta

          Luca73
          Partecipante
            56 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
            
            #38115 Score: 0 | Risposta

            cl161097
            Bloccato

              si ma arriva a febbraio mica a dicembre

              #38116 Score: 0 | Risposta

              vecchio frac
              Senior Moderator
                246 pts

                Sì, infatti è un calendario mensile. Nel senso che mostra un mese, quello inserito nella cella gialla.
                Con la particolarità che mostra in grigio i giorni che non appartengono al mese scelto (perchè il calendario mostra la settimana dal lunedì alla domenica, e può darsi che il mese scelto non inizi di lunedì e non finisca di domenica), e mostra in rosso i giorni del fine settimana.

                Tutto personalizzabile e modificabile a piacere 🙂

                #38117 Score: 0 | Risposta

                cl161097
                Bloccato

                  no no le macro non fanno per me tutto quel papiro con stringhe improponibli, per carità

                  #38883 Score: 0 | Risposta

                  DeletedUser
                  Bloccato
                    13 pts

                    Se volete un calendario che vi fa vedere solo il mese corrente, ve lo passo volentieri.  Non si tratta di un mio progetto. Eccolo in allegato, senza nulla togliere al calendario del GRANDE  vecchio frac

                    Allegati:
                    You must be logged in to view attached files.
                    #38886 Score: 0 | Risposta

                    GiuseppeMN
                    Partecipante
                      19 pts

                      Buona sera a Tutti.
                      Per ringraziare @vecchio frac e @luca73 è pronta una birra fatta in casa; ha un retrogusto di liquirizia (Glycyrrhizza Glabra), per questo da un Chef mio Amico è stata definita "Birra da meditazione!"    

                      Per la proposta di @M.Paolo sinceramente non non sono riuscito ad apprezzare il Foglio di lavoro protetto da password; Excel non ha delle protezioni eccellenti quindi, appena avrò 10 (dieci) minuti di tempo, sarà mia premura sproteggerlo e condividerlo in Forum.

                      Giuseppe 

                       

                      #38887 Score: 0 | Risposta

                      GiuseppeMN
                      Partecipante
                        19 pts

                        Scusate il ritardo, ma ho dovuto rispondere al telefono.
                        Non è certo mia abitudine sproteggere un File EXCEL ma, a beneficio di chi può essere interessato, come promesso, allego il File sprotetto con buona pace di @M.Paolo.

                        Buon fine settimana a Tutti.

                        Giuseppe

                        Allegati:
                        You must be logged in to view attached files.
                        #38889 Score: 0 | Risposta

                        vecchio frac
                        Senior Moderator
                          246 pts

                          GiuseppeMN ha scritto:

                          è pronta una birra fatta in casa; ha un retrogusto di liquirizia

                          Dimmi dove       

                          M.Paolo ha scritto:

                          Eccolo in allegato, senza nulla togliere al calendario del GRANDE  vecchio frac

                          Grazie ma io di grande ho solo due cose: l'età e la formula di Excel   

                          GiuseppeMN ha scritto:

                          Scusate il ritardo, ma ho dovuto rispondere al telefono

                          Ci hai messo davvero troppo... era solo una protezione di foglio e non c'era nemmeno una riga di codice   

                          #38890 Score: 0 | Risposta

                          GiuseppeMN
                          Partecipante
                            19 pts

                            Dimmi dove

                            Per una birra non credo valga la pena fare tanta strada; però se aggiungiamo anche uno spiedo bresciano/bergamasco possiamo organizzare, magari assieme a qualche altro Amico.

                            Che non ci fosse VBA lo si capiva dall'estensione .xlsx .

                             

                            Giuseppe

                          Login Registrati
                          Stai vedendo 12 articoli - dal 1 a 12 (di 12 totali)
                          Rispondi a: Come creare un calendarietto in Excel
                          Gli allegati sono permessi solo ad utenti REGISTRATI
                          Le tue informazioni: