› Sviluppare funzionalita su Microsoft Office con VBA › Creazione tabella perpetua turni di lavoro
-
AutoreArticoli
-
Buongiorno, avrei necessità di un aiuto riguardo una tabella realizzata in Excel che va a gestire i turni di lavoro durante le festività (estate, natale/capodanno e pasqua) di un ufficio composto da 14 persone.
Sto lavorando su un vecchio file realizzato da altra persona quindi alcune funzionalità sono state implementate da me altre invece già esistenti.
Vado nello specifico:
Il file è composto da 2 fogli di lavoro (Inizio e Prospetto). Nel foglio Inizio la cella C10 gestisce la scelta del periodo (Estate, Natale/Capodanno, Pasqua). La cella E12 invece gestisce il mese di partenza del periodo festivo mentre la cella E15 gestisce l'anno di riferimento.
Attraverso queste scelte si va a determinare, grazie a delle formule, un calendario di 2 mesi posto nel foglio di lavoro Prospetto.
Infatti se verrà scelto ad esempio: Periodo ESTIVO - Mese di partenza LUGLIO - Anno di riferimento 2022, nel foglio di lavoro Prospetto mi compariranno 2 tabelle che si riferiscono una al mese di Luglio, l'altra al mese di Agosto. In entrambe avverrà il calcolo dei giorni della settimana, cioè 01/07/2022 corrisponde a Venerdì e così via per tutti gli altri giorni. Verranno inclusi nel calcolo anche le festività comandate (15 agosto, 2 giugno, 25 dicembre, ecc...), evidenziate tramite una formattazione condizionale.
Fin qui funziona tutto bene. Adesso arrivo al mio problema...
Le 14 persone che lavorano in questo ufficio sono suddivise in coppie e ogni coppia in turni di lavoro. Cioé su 14 persone, 10 sono accoppiate 2 a 2 e ogni coppia forma un turno, esempio:
Salvatore e Vicenzo = 1° turno
Francesco e Nicola = 2° turno
Marco e Eustachio = 3° turno
Domenico e Luca = 4° turno
Alessandro e Flavio = 5° turno
Le altre 4 persone sono definite Jolly, cioè non hanno un turno fisso e riposano sempre e solo la Domenica.
Chi è in turno segue una turnazione perpetua. Cioè già si sa da oggi a data infinita che tipo di turno capiterà, perché si ripete nel tempo. Mi spiego meglio...il 4° turno oggi fa Pomeriggio, domani fa la Mattina, il giorno dopo fa Notte, quello ancora dopo fa Riposo, quello ancora dopo nuovamente Riposo (dopo la notte 2 Riposi). Poi il turni riparte con il Pomeriggio, Mattina, Notte, RS, RS.....e così via come indicato prima. Quindi segue una turnazione definita in TERZA (Pomeriggio, Mattina, Notte, Rip., Rip.).
Gli altri turni seguiranno la stessa turnazione ma sfalsata. Questo serve per garantire che l'ufficio sia sempre aperto h24 e 7/7 gg.
Infatti ogni giorno ci sarà chi fa il Pomeriggio, chi la Mattina, chi la Notte e chi riposerà.
Ora io vorrei automatizzare il calendario dei 2 mesi dato che già so che il personale segue questa turnazione. La mia richiesta infatti si basa proprio su questa problematica. Vorrei mettere giù un codice che mi crea la compilazione automatica dei turni nei giorni relativi al periodo scelto.
Quinidi se vado a scegliere ESTATE - LUGLIO - 2022 e sapendo che oggi chi appartiene al 4° turno fa il Pomeriggio, automaticamente nel foglio Prospetto alla data del 01/07/2022 dovrà corrispondere il turno di Notte (indicato con la lettere N), proprio perché nella realtà è così. Ovviamente il giorno 02/07/2022 dovrà comparire Riposo (RS) e così via in modo perpeturo per tutti gli altri giorni.
Nel foglio di lavoro Inizio ho realizzato uno schemino di riferimento con nomi e turni di una settimana che dovrebbe servire come appoggio.
Ci sarebbe però da considerare una variabile. Cioè quando capita che il secondo Riposo Settimanale (RS) cade di lunedì o martedì, non è più riposo ma RIENTRO. Quindi nelle 2 tabelle bisognerebbe tener conto di questa variabile e far comparire la parola Rie proprio quando capita che il secondo RS cade di lunedì o martedì.
Spero di non aver chiesto la luna, in ogni caso ringrazio chi mi concede un po' del suo tempo. Allego il file di esempio.
Grazie.
Allegati:
You must be logged in to view attached files.Formule oppure VBA?
In base al Tuo ragionamento e calcoli...
Il 1/7/2022 farà la "N", pertanto il 18/07/2022 sarà un "RIE"
EX: N-RS-RS-P-M-N-RS-RS-P-M-N-RS-RS-P-M-N-RS-RIE e dopo ricomincia con P-M-N-RS-RS ecc eccCosa intendi per rientro? In pratica è un "Riposo camuffato"?
Ps. Quale versione d'Excel usi?
Buongiorno Raffaele53, attualmente utilizzo Excel 2019 ma come dicevo questo file fu creato anni fa (credo da almeno 10 anni) e quindi fu utilizzata una versione diversa.
Per RIENTRO intendo dire che il dipendente dopo la notte ha 2 Riposi però se il secondo Riposo cade di lunedì o di martedì non farà Riposo ma dovrà lavorare....quindi RIENTRO. Questa cosa avviene per raggiungere il numero di ore che il dipendente deve fare per il mese in corso. Altrimenti, usufruendo sempre del doppio riposo, risulta che lavora meno ore rispetto a quante ne deve fare.
In realtà fino a qualche mese fa i due riposi venivano classificati in questo modo: il primo in Riposo Compensativo (RC) mentre il secondo in Riposo Settimanale (RS). Quindi se per una questione di programmazione dovesse risultare più semplice, è possibile utilizzare queste diciture (ovvero RC e RS). In questo modo si potrebbe trattare il discorso in questo senso:
Quando nella cella in corrispondenza del lunedì e del martedì compare "RS" allora trasforma la stringa in "Rie"
Preferire in VBA perché nelle due tabelle avrei cmq la necessità di manipolare i turni. Cioè è vero che mi servirebbe il planning dei turni di tutti i dipendenti per quei due mesi in modo automatizzato, ma è pur vero che poi a ognuno di essi verranno concesse le ferie e quindi i turni P-M-N verranno sostituiti da X-X-X (che stanno ad indicare che il dipendente in quel periodo a preso ferie). Tale sostituzione verrà fatta manualmente.
>>>In pratica è un "Riposo camuffato"?
Sembra di NO, allora come deve continuare la striscia scritta?Scusami continuo a non capire, ci riprovo spiegandomi meglio...
Usando l'esempio della Tua tabella + le date 15/05/2022 ecc ecc
---Do-Lu-Ma-Me-Gi-Ve-Sa
1°-RS-RS-P -M -N -RS-RS
2°-RS-P -M -N -RS-RS-P
3°-N -RS-RS-P -M -N -RS
4°-P -M -N -RS-RS-P -M
5°-M -N -RS-RS-P -M -N
Come noterai sul 1° turno (Lunedi 16/05/2022), bisogna sostituire RS con un turno di lavoro (OK, mà con quale?). Cosa ci devo scrivere al suo posto se P-M-N sono già presenti nella giornata di Lunedi?Ciao e ancora grazie. Si la tabella è giusta, ma il riposo settimanale del 1° turno del lunedì deve comparire come "RIE" (sarà poi cura del capo ufficio attribuire un turno che sia Mattina o Pomeriggio). Però come ripeto, solo il secondo RS deve essere cambiato con RIE solo se capita di Lunedì o Martedì.
VBA e Formule similari. Tento di spiegare la formula in modo che capisci cosa farà il VBA. Per i Turni-perpetui di norma uso il =Resto(data+il turno;Turni) = 0,1,2,3,4
Striscia= P-M-N-RS-RS, pertanto se resto(1/7/2022 + 1 ;5)=4 devo modificare la striscia così RS-P-M-N-RS
Ora con una semplice verifica (resto=0) e se data=(Lun o Mar) metto "Rie" oppure seguo la striscia sopra. Spero vada bene (sarebbe da rifare completamente, anche se 65000 righe penso siano sufficenti). Ps. Troppe righe vuote, adesso se aggiungi altre righe-colonne, sarà complicato modificare il VBAAllegati:
You must be logged in to view attached files.Ciao Raffaele , sei stato gentilissimo. Il risultato è più che soddisfacente. Credo che utilizzerò la Sub Turni del VBA perché ho necessità di manipolare le celle dei turni e quindi cancellerei le formule. Cmq anche le formule sono interessanti. Io bazzico molto poco su Excel e quindi tante cose le reperisco dal Web ma cose così specifiche non si trovano. Servono persone come te che aiutano uno come me. Ho un po' di difficoltà però a capire come funziona la matrice: {0\"RS".1\"P".2\"M".3\"N".4\"RS"}
.1, .2, .3, .4 a cosa servono? Perché dalla funzione RESTO viene restituito un numero che poi va ad indicare a quale posto cercare in matrice. Cioè se restituisce 2 allora va a cercare "M" perché il punto di partenza è "R.S" che risulta posto zero per tanto "M" risulterà posto 2. Giusto? Funziona così? Ma quindi a cosa servono .1, .2, .3, .4?
Grazie mille.
Come scritto (una su 5) la formula Resto(data;5)=0
Ora se metto P-M-N-RS-"RS"-P-M-N-RS-"RS" in modo consecutivo...
Noto il secondo "RS", dato che su questo ci devo fare un test lo metto sul posto (Resto=zero) = "RS"-P-M-N-RS
Adesso mi basta fare un controllo (se resto=0 + il giorno = LU o MA) metti "Rie"
>>>come funziona la matrice: {0\"RS".1\"P".2\"M".3\"N".4\"RS"}
Apri un file nuovo metti in A=0,1,2,3,4 ed in B=RS,P,M,N,RS
Ora in C1 (cerchiamo il 2) la formula =CERCA.VERT(2;A1:B5;2;FALSO) che risponde "M" = Tutto OK..., se adesso vai sulla formula e selezioni il range ..A1:B5.. e premi F9, cosa succede??? Che non Ti serve più la tabella ..A1:B5.. eliminandola.Ahhh....perfetto ora ho capito. In pratica gli .1, .2, .3, .4 sono dei segnaposti. Quante cose si imparano. Grazie mille per il tuo aiuto
Scusami ma ho controllato meglio ma c'è un errore nei calcoli dei turni. Se seguo questo ragionamento RS-P-M-N-RS mi capita che il 01/07/2022 mi risulta la Notte (N) al Turno nr. 5 ma cmq anche tutti gli altri turni sono sbagliati. In realtà il turno numero 5 quel giorno farà il suo primo RS. Sto provando a modificare la formula ma mi sto perdendo. Help.
A meno ché quei numeri 1, 2, 3, 4, 5 non sono riferiti ai turni bensì servono a fare semplicemente il calcolo. Perché se così fosse posso decidere di nascondere quella colonna dove sono indicati i numeri 1, 2, 3, 4, 5 e di fianco aggiungercene una che non ha funzioni interattive e che va ad indicare esattamente la turnazione di quel dipendente
>>>oggi chi appartiene al 4° turno fa il Pomeriggio, automaticamente nel foglio Prospetto alla data del 01/07/2022 dovrà corrispondere il turno di Notte
Modificando la striscia precedente ho creato confusione P-M-N-RS-RS
DOMENICO e LUCA appartengono al 4°Turno =RESTO(DATA+4;5)
=RESTO(15/05/2022+4;5)=0 risultato posizione 0,1,2,3,4 = P
=RESTO(01/07/2022+4;5)=2 risultato posizione 0,1,2,3,4 = NSpostando la striscia in RS-P-M-N-RS dovevo aggiungere un + 1
=RESTO(15/05/2022+1+4;5)=1 risultato posizione 0,1,2,3,4 = P
=RESTO(01/07/2022+1+4;5)=3 risultato posizione 0,1,2,3,4 = NNB Che nella colonna inserita (le celle gialle sono i turni prelevati dal foglio INIZIO). Questo il codice con più 1
Ps. Togli >>>Unload UFMsg<<< e solo un vecchio refuso
`Option Explicit Function GiorniInMese(dDate As Date) As Long GiorniInMese = Day(DateSerial(Year(dDate), Month(dDate) + 1, 0)) End Function Sub Turni() Dim X As Long, Y As Long, M1 As Long, M2 As Long, DData As Date, Myarray As Variant Sheets("Prospetto").Activate Range("E14:AI32") = "" Range("E50:AI68") = "" Myarray = Array("RS", "P", "M", "N", "RS") DData = Cells(10, 5).Value M1 = GiorniInMese(DData) DData = Cells(46, 5).Value M2 = GiorniInMese(DData) For X = 14 To 32 Step 2 For Y = 5 To (M1 + 4) DData = Cells(10, Y) + Cells(X, 4) + 1 If DData Mod 5 = 0 And (Cells(9, Y) = "LU" Or Cells(9, Y) = "MA") Then Cells(X, Y) = "Rie" Else Cells(X, Y) = Myarray(DData Mod 5) End If Next Y Next X '------------------ For X = 50 To 68 Step 2 For Y = 5 To (M2 + 4) DData = Cells(46, Y) + Cells(X, 4) + 1 If DData Mod 5 = 0 And (Cells(45, Y) = "LU" Or Cells(45, Y) = "MA") Then Cells(X, Y) = "Rie" Else Cells(X, Y) = Myarray(DData Mod 5) End If Next Y Next X Unload UFMsg MsgBox "Fatto" End Sub`No no...il 4° turno il 01/07/2022 fa Mattino. Ricapitolando il primo luglio del 2022
Il 1° fa la notte
Il 2° fa il pomeriggio
Il 3° fa il primo riposo
Il 4° fa il Mattino
Il 5° fa il secondo riposo
>>>No no...il 4° turno il 01/07/2022 fa Mattino ... ecc ecc
Il primo giorno che hai creato questi turni hai sbagliato. Per me sarebbe stato più lineare se usavi il N° dei Turni per differenziarLi. Presumo che ora variare i turni agli operatori sia impossibile, l'unico rimedio è togliere dalla colonna D (i numeri che rappresentavano i Turni e metterne altri). Sempre con la striscia precedente = R2°-P-M-N-R1°
Ps. Quei numeri non andranno mai cambiati.
Allegati:
You must be logged in to view attached files.Ciao Raffaele53, come al solito grazie per le tue risposte. Purtroppo però devo sottolineare che l'allegato che ho caricato il primo giorno è corretto, mentre questa tuo ultimo allegato no. Però non voglio soffermarmi troppo altrimenti non ce ne usciamo più
.Per me va bene il codice così come l'hai creato, faccio in modo da far corrispondere solo i numeri esatti così come devono essere nella colonna D, andando ad interagire ogni volta in cui ho bisogno di farlo.
Se poi vuoi approfondire meglio il discorso allora fammi sapere che ti mando una descrizione più dettagliata.
Grazie
Nel 1° post hai scritto
>>>alla data del 01/07/2022 dovrà corrispondere il turno di Notte
Prima era Notte e ora è Mattino, comunque l'ultimo allegato sul giorno 1/7/2022, i turni corrispondono al post del 22/05/2022 alle 14:37>>> fammi sapere che ti mando una descrizione più dettagliata.
Si, vorrei capire dove esiste un errore? Di sicuro la formula Resto(data+turni;5) per me è il metodo più lineare. Ex Per il turno-4
01/07/2022 = M
01/08/2022 = N
01/09/2022 = R1
01/10/2022 = R1
01/11/2022 = R2
01/12/2022 = R2
01/01/2023 = P
01/02/2023 = MOk...spero di fare chiarezza....
Il primo post l'ho inviato il 15 maggio e proprio quella data era il punto di partenza dei miei esempi.
Mi spiego meglio...il 4° turno oggi fa Pomeriggio, domani fa la Mattina, il giorno dopo fa Notte, quello ancora dopo fa Riposo, quello ancora dopo nuovamente Riposo (dopo la notte 2 Riposi).
Infatti nel foglio di lavoro INIZIO è riportata una tabella con tutti i turni dei dipendenti in modo reale dal 15 (che è stato DOMENICA al 21 maggio che è stato SABATO).
Prendendo in esempio il 4° turno (Domenico e Luca) se il 15/05/2022 (come da primo esempio) fanno il POMERIGGIO allora il 01/07/2022 faranno la NOTTE (così come ho indicato sempre nel primo post):
Quinidi se vado a scegliere ESTATE - LUGLIO - 2022 e sapendo che oggi chi appartiene al 4° turno fa il Pomeriggio, automaticamente nel foglio Prospetto alla data del 01/07/2022 dovrà corrispondere il turno di Notte (indicato con la lettere N), proprio perché nella realtà è così.
Ora la formula RESTO(data+turno;5) va bene ma nel caso specifico del 4° turno (che confermo e garantisco che il 01/07/2022 farà mattina), la formula RESTO(01/07/2022+4;5) da come risultato 2. Quindi se voglio cercare il 2 in un CERCA.VERT di una matrice:
0=R.S.
1=P
2=M
3=N
4=RS
avrò come risultato M perciò è sbagliato....almeno rispetto alla turnazione che il 4° turno segue nel mio ufficio.
Questo è quanto nel primo post. Poi dopo un po' ho notato un errore che ti ho evidenziato:
Scusami ma ho controllato meglio ma c'è un errore nei calcoli dei turni. Se seguo questo ragionamento RS-P-M-N-RS mi capita che il 01/07/2022 mi risulta la Notte (N) al Turno nr. 5 ma cmq anche tutti gli altri turni sono sbagliati. In realtà il turno numero 5 quel giorno farà il suo primo RS. Sto provando a modificare la formula ma mi sto perdendo. Help.
A meno ché quei numeri 1, 2, 3, 4, 5 non sono riferiti ai turni bensì servono a fare semplicemente il calcolo. Perché se così fosse posso decidere di nascondere quella colonna dove sono indicati i numeri 1, 2, 3, 4, 5 e di fianco aggiungercene una che non ha funzioni interattive e che va ad indicare esattamente la turnazione di quel dipendente
Infatti è un errore dato che RESTO(01/07/2022+5;5)=4 e seguendo l'ordine della matrice il posto 4 corrisponde a Notte ma come ripeto nel mio ufficio il 5° turno farà il primo riposo il giorno 01/07/2022
A tutto ciò rileggendo bene i post a seguire mi sono reso conto di aver fatto confusione e di aver saltato la tua correzione. Per tanto aggiungendo il +1 alla formula del RESTO tutta fila liscio.
Penso si aver risolto finalmente...
>>>Penso si aver risolto finalmente...
Bene se hai risolto, tutto questo casino perchè ho cambiato la striscia>>> 4° turno (che confermo e garantisco che il 01/07/2022 farà mattina)
Mi spisce deluderTi, mà il 4°Turno il 1/1/2022 farà la NOTTEAllegati:
You must be logged in to view attached files.Io cmq credo di aver capito dov'è l'inghippo: dal tuo ragionamento (e corretto tra l'altro) la turnazione deve essere (facendo un esempio di data zero):
1° turno = P
2° turn0 = M
3° turno = N
4° turno = 1° Riposo
5° turno = 2° Riposo
Invece ora che noto purtroppo da me non segue questa logica (e la cosa è al quanto strana) perché nel mio ufficio i turni sono (rispetto alla stessa data zero riportata su):
1° turno = P-m-n-rs-rs-p
2° turno = M-n-rs-rs-p-m
3° turno = 2° Riposo-p-m-n-rs-rs
4° turno = N-rs-rs-p-m-n
5° turno = 1° Riposo-rs-p-m-n-rs
Perciò ci sono dei problemi con la formula, o meglio è il mio turno che ha problemi.
-
AutoreArticoli
