Calcoliamo la quantità di turni fatti nel mese.
A quanto ho capito, non interessa sapere quanti turni di giorno o di notte siano stati fatti, e questo facilita le cose.
Possiamo risistemare il modulo formattaFoglio togliendo la tabella dei turni di giorno e nominando soltanto i turni fatti di notte (la quantità relativa di diurni e notturni sarà un problema che dovranno scornarsi a livello di reparto).
Bene.
Mi salvo il modulo, però...
Ecco la routine copiaLista rimaneggiata:
Private Sub copiaLista() Dim elemento As Range Dim k As Integer, z As Integer z = 15 '(posizione iniziale della lista dei nomi del mese) For k = 1 To Range("ListaNomi").Rows.Count ActiveSheet.Cells(z, 6).FormulaR1C1 = Range("ListaNomi").Cells(k, 1).FormulaR1C1 ActiveSheet.Cells(z, 7).FormulaR1C1 = Range("ListaNomi").Cells(k, 2).FormulaR1C1 z = z + 1 Next k ActiveWorkbook.Names.Add Name:="ListaNomiMese", RefersTo:="=" & Range(Cells(15, 6), Cells(z - 1, 6)).Address(True, True) Griglia Range("ListaNomiMese") ActiveWorkbook.Names.Add Name:="ListaReparti", RefersTo:="=" & Range(Cells(15, 7), Cells(z - 1, 7)).Address(True, True) Griglia Range("ListaReparti") ActiveWorkbook.Names.Add Name:="NumeroTurni", RefersTo:="=" & Range(Cells(15, 8), Cells(z - 1, 8)).Address(True, True) Griglia Range("NumeroTurni") For Each elemento In Range("NumeroTurni") elemento.HorizontalAlignment = xlCenter elemento.Formula = 0 Next With ActiveSheet With .Cells(Range("ListaNomiMese").Row - 1, 6) .FormulaR1C1 = "NOME" .HorizontalAlignment = xlCenter End With Griglia Cells(Range("ListaNomiMese").Row - 1, 6) With .Cells(Range("ListaNomiMese").Row - 1, 7) .FormulaR1C1 = "REP." End With Griglia Cells(Range("ListaNomiMese").Row - 1, 7) With .Cells(Range("ListaNomiMese").Row - 1, 8) .FormulaR1C1 = "GIORNO" End With Griglia Cells(Range("ListaNomiMese").Row - 1, 8) .Columns(6).ColumnWidth = 26 Exit Sub With .Columns(7) .ColumnWidth = 6 .HorizontalAlignment = xlCenter .Font.Bold = True End With With .Columns(8) .ColumnWidth = 6 .HorizontalAlignment = xlCenter .Font.Bold = True End With End With End SubPraticamente ho tolto la colonna dei turni di mattina, rinominando la colonna NumeriNotti in NumeroTurni e basta.
Inoltre ho aumentato un po' l'altezza delle righe.
Adesso cerchiamo di calcolare il numero di turni come avevo fatto precedentemente.
Il principio che avevo usato era:
Conservare in una variabile la stringa eliminata dalla cella;
Considerare la nuova stringa della cella come Bersaglio.Formula;
Cercare nella lista la stringa eliminata dalla cella e ridurre di 1 il numero dei turni;
Cercare nella lista la stringa nuova della cella e aumentare di 1 il numero dei turni.
In fondo è semplicissimo!
Proviamo...
Sub calcola() Dim x As Range Set x = Range("ListaNomiMese").Find(lastcaption) If x Is Nothing = False Then x.Offset(0, 2).Formula = x.Offset(0, 2).Formula - 1 Set x = Range("ListaNomiMese").Find(Bersaglio.Formula) If x Is Nothing = False Then x.Offset(0, 2).Formula = x.Offset(0, 2).Formula + 1 End SubEccola: dovrebbe essere perfetta.
Se vado su una cella vuota, lastcaption è vuota, quindi il range Find di lastcaption è Nothing.
In questo caso, però, non succede nulla perché si agisce sui punteggi solo se il range Find non è Nothing. Quindi si provvererà soltanto a sistemare il punteggio della nuova caption di Bersaglio.
Analogamente, se io vado su una cella con un nome e ci voglio trascrivere il menu vuoto, prima trovo lastcaption, e aggiusto il suo punteggio, quindi il range Find della stringa vuota è Nothing, quindi non succede niente al punteggio.
Dovrebbe funzionare alla perfezione. Molto semplice ed evita i casini di contare ogni volta i nomi, che è di un lento e di un dispendioso pazzesco!
Nessun commento:
Posta un commento