Sviluppare funzionalita su Microsoft Office con VBA Creazione tabella perpetua turni di lavoro

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

    alexps81
    Moderatore
      58 pts

      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.
      #34039 Score: 0 | Risposta

      Raffaele53
      Partecipante
        23 pts

        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 ecc

        Cosa intendi per rientro? In pratica è un "Riposo camuffato"?

        Ps. Quale versione d'Excel usi?

        #34040 Score: 0 | Risposta

        alexps81
        Moderatore
          58 pts

          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. 

          #34041 Score: 0 | Risposta

          Raffaele53
          Partecipante
            23 pts

            >>>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?

            #34042 Score: 0 | Risposta

            alexps81
            Moderatore
              58 pts

              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ì.

              #34045 Score: 0 | Risposta

              Raffaele53
              Partecipante
                23 pts

                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 VBA

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

                alexps81
                Moderatore
                  58 pts

                  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.

                  #34050 Score: 0 | Risposta

                  Raffaele53
                  Partecipante
                    23 pts

                    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.

                    #34058 Score: 0 | Risposta

                    alexps81
                    Moderatore
                      58 pts

                      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

                      #34061 Score: 0 | Risposta

                      alexps81
                      Moderatore
                        58 pts

                        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

                        #34095 Score: 0 | Risposta

                        Raffaele53
                        Partecipante
                          23 pts

                          >>>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 = N

                          Spostando 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 = N

                          NB 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`
                          #34099 Score: 0 | Risposta

                          alexps81
                          Moderatore
                            58 pts

                            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

                            #34108 Score: 0 | Risposta

                            Raffaele53
                            Partecipante
                              23 pts

                              >>>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.
                              #34119 Score: 0 | Risposta

                              alexps81
                              Moderatore
                                58 pts

                                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 

                                #34122 Score: 0 | Risposta

                                Raffaele53
                                Partecipante
                                  23 pts

                                  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 = M

                                  #34124 Score: 0 | Risposta

                                  alexps81
                                  Moderatore
                                    58 pts

                                    Ok...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 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...  

                                     

                                     

                                     

                                     

                                    #34128 Score: 0 | Risposta

                                    Raffaele53
                                    Partecipante
                                      23 pts

                                      >>>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 NOTTE

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

                                      alexps81
                                      Moderatore
                                        58 pts

                                        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.

                                         

                                      Login Registrati
                                      Stai vedendo 18 articoli - dal 1 a 18 (di 18 totali)
                                      Rispondi a: Creazione tabella perpetua turni di lavoro
                                      Gli allegati sono permessi solo ad utenti REGISTRATI
                                      Le tue informazioni: