Scusa, tu disponi i dati in tutt'altro ordine e vieni a chiedere che cosa devi modificare nella macro affinche' funzioni anche su quel tracciato?
Poi speravo che il file aiutasse a capire la richiesta, ma la frase "Esempio nella riga 33 colonna AO e BA E BN E BY E BZ E CK venga colorata di rosso se la somma (sempre come esempio) il turno dalla cella AU33 alla BE33se la somma dei turni e 6 si evidenzi BA E AO e ovviamente il turno nelle celle tenendo presente che le celle da saltare sono AW33 AX33 AY33 AZ33 BA33" mi rimane ancora ininterpretabile (anche perche' priva di punti, virgole, punti e virgole e forse anche di accenti).
Mi limito quindi a guardare il nuovo tracciato e ad adottare su questo tracciato le regole che ricordo dal vecchio quesito, cioe' evidenziare sul mese i periodi consecutivi di lavoro lunghi 6 o piu' turni.
Per fare questo utilizzero' le date scritte su riga 29, skippando quindi le celle che in riga 29 non hanno una data e skippando anche le celle che non contengono nessun turno (queste celle saranno ignorate, come non esistessero).
Do' per scontato che l'inizio e' in colonna AP=42, e il calcolo sara' fatto su 5 settimane che si esauriscono in colonna CR=96; ma questi limiti sono impostabili nel codice
Do' per scontato che una riga corrisponde sempre allo stesso nominativo.
La macro interverra' se in colonna AN e' presente la sigla C.T., Sorv. Oppure VVF (comunque l'elenco e' definito nella macro, e quindi puo' essere variato nel codice), e se la colonna e' compresa tra la minima (42) e la massima (96), e se la riga e' superiore a quella con la data (29), e se la cella non e' vuota.
In caso di sequenze di 6 o piu' giorni lavorativi (non interrotti da una sigla di Riposo):
-tutti i turni lavorativi consecutivi sono colorati in rosso
-lo sfondo del nominativo (che immagino sia in colonna AO) viene colorato in rosso
Nel calcolo vengono ignorate le celle che in riga 29 non hanno una data valida o che comunque siano celle vuote.
In caso di turno "di riposo" la cella viene colorata in giallino; questa prestazione puo' essere eliminata cancellando nel codice successivo la riga marcata ***
Tutto cio' viene realizzato dalla seguente macro di Worksheet_Change:
- Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myC As Range, I As Long, WDCnt As Long, J As Long, rDate As Long
Dim pTitle, iCol As Long, eCol As Long, tCol As Long, K As Long, rCnt As Long
'
pPausa = Array("R", "F", "P", "A") '<<< Le sigle che interrompono la sequenza lavorativa
pTitle = Array("C.T.", "Sorv.", "VVF") '<<< Le sigle dei lavoratori
tCol = 40 '<<< La colonna con le sigle, AN=40
rDate = 29 '<<< La riga con le date
iCol = 42 '<<< La colonna di inizio, AN=42
eCol = 96 '<<< La colonna di fine, CR=96
'
For Each myC In Target
'Sigla valida in AN, colonna tra Min e Max, riga oltre riga data?
If Not IsError(Application.Match(Cells(myC.Row, tCol).Value, pTitle, False)) And _
myC.Column >= iCol And myC.Column <= 96 And myC.Row > rDate Then
I = myC.Row 'Riga di lavoro
Cells(I, iCol - 1).Interior.Color = xlNone 'Scolora area nominativo
Range(Cells(I, iCol), Cells(I, eCol)).Interior.Color = xlNone 'Scolora area dei turni
Range(Cells(I, iCol), Cells(I, eCol)).Font.Color = RGB(0, 0, 0) 'Scolora Font turni
WDCnt = 0 'Azzera contatore gg lavorati
For J = iCol To eCol
If Cells(I, J) <> "" And IsDate(Cells(rDate, J).Value) Then 'Data + Turno presente
mymatch = Application.Match(Cells(I, J), pPausa, False)
If IsError(Application.Match(Cells(I, J), pPausa, False)) Then
Cells(I, J).Interior.Color = xlNone 'Se giorni lavorativi
WDCnt = WDCnt + 1
If WDCnt >= 6 Then 'Se >= 6 gg lavorativi:
RepCnt = RepCnt + 1
Cells(I, tCol).Offset(0, 1).Interior.Color = RGB(255, 0, 0) 'Colora Nominativo
rCnt = 0
For K = 0 To 100 'colora all'indietro
'Considera solo le celle "Con data" e "Con turno":
If IsDate(Cells(rDate, J - K)) And Cells(I, J - K) <> "" Then
Cells(I, J).Offset(0, -K).Font.Color = RGB(255, 0, 0)
rCnt = rCnt + 1
If rCnt >= WDCnt Then Exit For 'Fine dopo N celle
End If
Next K
End If
Else 'Se giorni di riposo
Cells(I, J).Interior.Color = RGB(255, 255, 150) '*** Evidenzia in giallino
WDCnt = 0 'Azzera contatore
End If
End If
Next J
End If
Next myC
End Sub
Va inserita nel modulo vba del foglio su cui si lavora, che puo' essere raggiunto (partendo da Excel) con Tasto dx sul tab col nome del foglio, scelta "Visualizza Codice"
Ovviamente da questa posizione vanno rimosse eventuali macro di Worksheet_Change gia' presenti.
Le righe marcate <<< consentono delle personalizzazioni come detto nel commento.
I ricchi commenti ti aiuteranno a fare le dovute variazioni nel caso che in futuro cambiassi ancora "qualche piccolo dettaglio".
Il file su cui ho provato e' scaricabile qui:
https://www.dropbox.com/s/quix1c752k6d7 ... .xlsm?dl=0Ciao