Gestione dei turni 7: estendere la visuale del mese

Ci sono situazioni durante la programmazione della turnistica in cui il normale “campo di vista” mensile può risultare limitato. In questo post vedremo come estendere questa consueta visuale con un clic del mouse.

Davanti al tabellone del mese, alle volte ho bisogno di dare un’occhiata ai primi giorni del mese successivo o agli ultimi giorni del mese precedente. Alle volte semplicemente per vedere lo sviluppo del calendario, oppure durante la programmazione dei primi giorni del mese in cui devo tener conto per forza dei turni svolti negli ultimi giorni del mese precedente oppure quando la fine del mese si accavalla a periodi particolari, come il periodo Natale – Epifania.

In questo post prendo in esame quest’ultimo caso per mostrare il sistema che ho implementato per estendere la vista pre/post mese con due periodi di 7 giorni ciascuno. Per far questo riprendo il file visto nella parte 5 di questa serie a cui si riferiranno gli intervalli e le formule che seguiranno.

Il formato del file

La soluzione che illustro usa codice VBA per cui il formato del file deve permettere il salvataggio di tale codice. Il formato di file corretto è .xlsm:

Aggiungere le nuove celle

Prima di aggiungere le celle che conterranno il calendario e gli eventuali turni copiati da altri fogli, bisogna fare in modo di controllare che l’inserimento delle celle non vada a distorcere il lavoro delle formule poste alla destra del tabellone. Nel mio caso queste formule calcolano la situazione ore, la situazione ferie ed il conteggio dei turni effettuati dai vari dipendenti. Per il controllo, è necessario copiare l’intero blocco (AI4:BO22) e incollarlo come valori in un nuovo foglio:

Ora, con il comando Inserisci Colonne Foglio bisogna aggiungere a tutti i fogli dei mesi sette colonne prima del primo giorno del mese e sette colonne dopo l’ultimo giorno del mese (il 31° giorno per non complicarsi la vita).

Dopo l’inserimento, è necessario copiare di nuovo l’intero blocco posto alla destra del tabellone (diventato AW4:C22), incollarlo come valori sotto il precedente e confrontarlo visualmente o con una formula: nella cella A41 ho inserito la formula “=SE(VAL.NUMERO(A21);A21-A1;”TESTO”)” che da zero se incontra due numeri uguali e scrive “TESTO” quando incontra valori non numerici e l’ho trascinata su tutto l’intervallo.

Se il risultato della formula è diverso da zero bisogna tornare alla situazione precedente all’inserimento delle nuove celle e modificare le formule in modo che non ci siano riferimenti statici che Excel non riesce a modificare durante l’inserimento delle nuove celle. Sotto il risultato corretto:

Formattazione delle celle del mese precedente

Ora bisogna ridimensionare le colonne e formattare il testo e i bordi del nuovo intervallo come più vi piace, io ho ripreso la formattazione del mese.

Per inserire il calendario si può comodamente usare la formula che scala un giorno dal giorno precedente: in I4 > “=J4-1” e trascinare a sinistra. Per i giorni è sufficiente trascinare a sinistra la cella J5. Questa porta nel nuovo intervallo la formattazione condizionale per cui non rimane che cambiare gli intervalli di validità e includere tutte le nuove celle:

Formattazione delle celle del mese successivo

Per com’è strutturato il foglio di partenza, il periodo relativo al mese successivo non può essere considerato come la continuazione del mese corrente, ma va trattato come un intervallo a se stante. In comune ci sono solo le regole di FC che bisogna adattare stando attenti che le regole che mascherano con il bianco le celle non appartenenti al mese corrente si fermino al 31° giorno del mese corrente.

Per il calendario, la formula per il primo giorno è ripresa da quella usata per il primo giorno del mese corrente a cui si somma 1 mese: “=DATA(Anno;B4+1;1)”. Per le altre celle è sufficiente aggiungere un’unità ogni giorno e completare i 6 giorni successivi. Aggiungendo la formattazione del testo e dei bordi il risultato è questo:

Il mese di gennaio dell’anno seguente

Come abbiamo detto all’inizio, uno delle situazioni in cui questo sistema torna utile è sul mese di dicembre: se però la cartella contiene già un foglio GEN, è necessario che il gennaio dell’anno successivo abbia un nome diverso: il codice che segue presuppone che il nome del foglio sia GEN + il numero dell’anno successivo (tipo GEN2021). Se le vostre esigenze sono diverse è sufficiente adattare il codice.

Per fare in modo che il pulsante di commutazione mese presente nel mio file arrivi a gennaio dell’anno successivo bisogna impostare il limite massimo a 13 (clic destro sul tasto > formato controllo):

Serve anche inserire nell’elenco delle festività Capodanno e Epifania dell’anno successivo e allargare l’estensione del intervallo denominato FEST per comprenderle facendo in modo che Excel riconosca queste festività (foglio Calen).

I tasti mese precedente e mese successivo

Qui ho usato due pulsanti activeX che fanno parte dei controlli che sembrano simili ai controlli modulo ma (non in questo caso) in realtà sono più difficili da usare ma offrono maggiori possibilità rispetto a quelli di modulo. Il comando per inserirli si trova nella scheda Sviluppo > Controlli > Inserisci > Pulsante di comando (controllo activeX). È sufficiente trascinare il cursore per disegnare i due tasti a cui verranno assegnati in automatico i nomi CommandButton1 e CommandButton1.

Nello screenshot sotto si vede l’inserimento del primo tasto, la Modalità progettazione è attiva e questo permette di fare doppio clic sul tasto per l’inserimento del codice VBA, lo spostamento del tasto, la modifica delle sue dimensioni e altro:

Facendo doppio clic sul tasto si apre il Visual Basic Editor (VBE) con il cursore già predisposto per l’inserimento del codice associato al tasto CommandButton1. In questo caso è sufficiente copiare e incollare il codice che segue sovrascrivendo le righe già presenti. Se inserite il codice nell’editor di VBA è più facile da leggere perché i commenti che specificano l’azione fatta da ogni riga vengono colorati in verde. Per i dettagli sulle sintassi e sulle funzionalità potete far riferimento alla guida in linea che è realizzata molto bene.

In poche parole il codice, dopo una serie di verifiche, va a copiare un intervallo di celle dal foglio del mese precedente o successivo e lo incolla nella relativa posizione. Nascondendo o scoprendo le opportune colonne fa in modo che il calendario appaia senza soluzione di continuità.

Se non è già stata implementata la funzione SheetExists() vista nel post precedente che controlla la presenza di un foglio di lavoro in una cartella, è necessario copiare e incollare queste righe in un modulo:

Function SheetExists(nomefoglio As String) As Boolean
    On Error Resume Next
    SheetExists = Worksheets(nomefoglio).Name = nomefoglio
    On Error GoTo 0
End Function

Questo è il codice per i due tasti, sovrascrivete tutto quello che trovate nella finestra e se usate una strutturazione del foglio differente adattate il codice alle vostre esigenze:

Private Sub CommandButton1_Click()
'mostra calendario e eventualmente riporta ultimi 7 gg del mese precedente
'
Dim data As Long    'la variabile è un numero
Dim dataMP As Long
Dim ggMP As Long
Dim MP As String    'la variabile è testo
Application.ScreenUpdating = False    'disattiva l'aggiornamento del display
data = Cells(4, 10).Value    'valore data da J4
dataMP = DateAdd("M", -1, data)    'valore 1° giorno mese prec
MP = UCase(Format(dataMP, "mmm"))    'nome abbrev maiuscolo del mese prec
ggMP = Day(data - 1)    'nr gg mese prec
If data = 0 Then    'SE variab data è zero...
MsgBox "Data non trovata"    'messaggio
Exit Sub    'esci dalla routine
End If    'fine ciclo SE
If CommandButton1.Caption = "Mostra" Then    'SE il testo sul tasto è "Mostra"...
CommandButton1.Caption = "Nascondi"    'imposta il testo sul tasto a "Nascondi"
Columns("C:I").Hidden = False    'mostra le colonne da C a I
If SheetExists(MP) = False Then    'SE il foglio con il nome del mese prec non esiste...
MsgBox "Foglio " & MP & " non trovato"    'dimmelo
Exit Sub
End If
Sheets(MP).Cells(6, ggMP + 9 - 6).Resize(17, 7).Copy    'copia intervallo ultimi 7 gg mese da mese prec
Cells(6, 3).PasteSpecial Paste:=xlPasteValues    'incollalo in C6
ElseIf CommandButton1.Caption = "Nascondi" Then    'altrimenti, se il testo è "Nascondi"...
CommandButton1.Caption = "Mostra"    'imposta il testo sul tasto a "Mostra"
Columns("C:I").Hidden = True    'nascondi le colonne da C a I
Range("C6:I22").ClearContents    'cancella il contenuto dell'intervallo C6:I22
Else
CommandButton1.Caption = "Mostra"
End If    'fine ciclo SE
Cells(1, 1).Select    'seleziona A1
Application.CutCopyMode = False    'disattiva la modalità di copia
Application.ScreenUpdating = True    'attiva l'aggiornamento del display
End Sub
Private Sub CommandButton2_Click()
'mostra calendario e eventualmente riporta primi 7 gg del mese successivo
'
Dim data As Long
Dim dataMS As Long
Dim ggMC As Long
Dim MS As String
Dim d As Long
Application.ScreenUpdating = False
data = Cells(4, 10).Value
dataMS = DateAdd("M", 1, data)
MS = UCase(Format(dataMS, "mmm"))
ggMC = Day(dataMS - 1)    'nr gg mese corrente
d = Year(data)    'anno mese corrente
If data = 0 Then
MsgBox "Data non trovata"
Exit Sub
End If
If MS = "GEN" Then
MS = "GEN" & (d + 1)    'nome foglio GEN + anno successivo
End If    'fine ciclo SE
If CommandButton2.Caption = "Mostra" Then
CommandButton2.Caption = "Nascondi"
Range(Columns(10 + ggMC), Columns(47)).Hidden = False
If ggMC < 31 Then
Range(Columns(40), Columns(40 - 30 + ggMC)).Hidden = True
End If
If SheetExists(MS) = False Then
MsgBox "Foglio " & MS & " non trovato"
Exit Sub
End If
Sheets(MS).Cells(6, 10).Resize(17, 7).Copy
Cells(6, 41).PasteSpecial Paste:=xlPasteValues
ElseIf CommandButton2.Caption = "Nascondi" Then
CommandButton2.Caption = "Mostra"
Columns("AO:AU").Hidden = True
Columns("AL:AN").Hidden = False
Cells(6, 41).Resize(17, 7).ClearContents
Else
CommandButton2.Caption = "Mostra"
End If
Cells(1, 1).Select
Application.CutCopyMode = False
Application.ScreenUpdating = True
End Sub

Verifiche

Prima di dare per assodato che il codice funzioni, provate a fare tutte le prove possibili: cambiate mese, provate entrambi i tasti, fategli cercare mesi non esistenti, ecc. In caso di problemi probabilmente il vostro file differisce da quello usato qui.

Sotto, lo screenshot del mese di dicembre 2020 con la visuale allargata (clic sopra) pronto per la stesura della programmazione:

Qui potete scaricare il file usato nell’articolo: Turni-Post7.zip (1 download)

Buon lavoro!

Questa voce è stata pubblicata in Excel e contrassegnata con , , , , , , , . Contrassegna il permalink.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *