Domanda Nel caso che in un turno si superano le 3 notti.

NikiDiluccio

Utente abituale
14 Agosto 2016
182
1
18
Agropoli
2013
0
Buongiorno.
Spero che qualcuno mi possa aiutare perché non so proprio da dove iniziare, mi spiego.
Mi servirebbe che nella colonna C in corrispondenza del turno,
nel caso che il turno mi supera le 3 notti consecutive senza l’intervallo di un riposo mi dovrebbe segnalare
appunto nella colonna C il numero 3 con la cella rossa. Le notti consecutive possono essere interrotte da RM, RC, R, C e da Rise.
Il file allegato espone i veri casi, così è più facile da capire.
Vi ringrazio.
 

Allegati

NikiDiluccio

Utente abituale
14 Agosto 2016
182
1
18
Agropoli
2013
0
Immagini bene che M = Mattino, N = Notte, P= Pomeriggio, C=Congedo, R=Riposo, e Rise=Riposo arretrato.
La barra significano che invece di fra il turno sotto la barra, fanno quello sopra.
 
Ultima modifica:

alfrimpa

VBA Expert
Supermoderatore
Expert
18 Dicembre 2015
16.019
525
113
65
Napoli
2013
234
NikiDiluccio @NikiDiluccio

Eppure il regolamento dovresti conoscerlo

Regola nr. 13 Nessun obbligo di risposta

Nessuno - né utenti, né moderatori - è in alcun modo obbligato a rispondere ai messaggi, né tantomeno a farlo entro stringenti limiti temporali arbitrariamente imposti da terzi. Nessuna motivazione di "urgenza" verrà minimamente tenuta in considerazione, se non in negativo.

Regola nr. 17 "Evitare di scrivere UP"

In questo forum è vietato l'utilizzo del testo UP (o di un qualsiasi messaggio di sollecito) per mettere in rilievo la propria domanda, il forum ha i suoi tempi e ovviamente non c'è nessun obbligo da parte di nessuno a rispondere. Ogni abuso verrà tenuto in considerazione in futuro.
 

Marius44

VBA Expert
Moderatore
Expert
9 Settembre 2015
5.111
143
63
75
Catania
Excel2010
91
Ciao
1°) - evita le celle unite;
2°) - imposta la tua griglia come ho fatto io (la tua griglia l'ho spostata più a destra - ma puoi toglierla);
3°) - non barrare le celle in quel modo ma metti una slash in mezzo a quello che vuoi scrivere
4°) - modifica la tua sigla Rise in RS
5°) - assegna il codice seguente ad un pulsante Modulo (non ActiveX)

Visual Basic:
Sub Interrompi()
ur = Cells(Rows.Count, 2).End(xlUp).Row
Range("C3:C" & ur).Interior.ColorIndex = xlNone
For i = 3 To ur
  uc = Cells(i, Columns.Count).End(xlToLeft).Column
  For j = 4 To uc
    tn = Cells(i, j).Value
    If tn = "N" Then
      ctn = ctn + 1
    ElseIf tn = "RM" Or tn = "RC" Or tn = "R" Or tn = "C" Or tn = "RS" Then
      ctn = 0
    End If
    If Len(tn) > 2 Then
      cel = Split(tn, "/")
      For k = 0 To UBound(cel)
        If cel(k) = "N" Then
          ctn = ctn + 1
        ElseIf cel(k) = "RM" Or cel(k) = "RC" Or cel(k) = "R" Or cel(k) = "C" Or cel(k) = "RS" Then
          ctn = 0
        End If
      Next k
    End If
    If ctn = 3 Then
      Cells(i, 3).Interior.ColorIndex = 3
    End If
  Next j
Next i
End Sub
Dovrebbe fare quello che chiedi. Attento ad una cosa: la tua terza segnalazione (nominativo GALLO) mi sembra errata, o meglio, sembra errata ad Excel.

Fai sapere. Ciao,
Mario
 

Allegati

NikiDiluccio

Utente abituale
14 Agosto 2016
182
1
18
Agropoli
2013
0
Scusa @ Marius44 @Marius44 mi ero allontanato un attimo. Comunque in riferimento alla macro che mi hai posta, il problema è che il file del turno che ho allegato è una prova. Il programma del turno è impostato in quel modo in uso già da molto tempo ed è molto grande quindi impossibile cambiarlo. Se puoi fare qualcosa in quel modo altrimenti ti ringrazio comunque per il tempo che mi hai dedicato.
Grazie.
 

NikiDiluccio

Utente abituale
14 Agosto 2016
182
1
18
Agropoli
2013
0
Mi dispiace @ alfrimpa @alfrimpa ma io non ho portato fretta ne ho chiesto di essere risposto per forza, ho chiesto solo se ce qualche modo per farsi rispondere dagli utenti o dai moderatori.
Scusami ancora per l'inconveniente non succederà più.
 

NikiDiluccio

Utente abituale
14 Agosto 2016
182
1
18
Agropoli
2013
0
Come dicevo a Marius44 @Marius44 il problema è che il file del turno che ho allegato è una prova. Il programma del turno che non ho fatto io è impostato in quel modo in uso già da molto tempo ed è molto grande quindi impossibile cambiarlo. Io volevo solo apportare delle modifiche. Volevo aggiungere il fatto di non fare 3 notti consecutive senza un intervallo di un riposo. La macro mi dovrebbe segnalare nella colonna C il numero 3 con la cella rossa. Le notti consecutive possono essere interrotte da RM, RC, R, C e da Rise. Vi posto la macro che è in funzione nel programma che segnala se si superano i sei giorni consecutivi di lavoro senza interruzione di un riposo.
Io adesso vado a dormire perchè domani mattina mi alzo alle 6 per andare a lavoro. Se qualcuno può fare le ore piccole e divertirsi a risolvere il quesito, io domani mattina a lavoro ne prendo visione.
Grazie per adesso, a domani.

Qui posto il programma che segnala se si superano i sei giorni consecutivi di lavoro senza interruzione di un riposo.


Visual Basic:
Sub conta_gg_consecutivi()
Application.ScreenUpdating = False
Application.EnableEvents = False
If (ActiveCell.Row Mod 2) <> 1 Then Exit Sub
Dim r As Long
Dim ng As Long
Dim gg As Long
Dim i As Long
Dim y As String
r = ActiveCell.Row
gg = 0
ng = 0
Cells(r, 2).Value = 0
For i = 5 To 35
    If ActiveSheet.Cells(r + 1, i).Borders(xlDiagonalUp).LineStyle = xlNone Then
        If ActiveSheet.Cells(r + 1, i).Value = "" _
            Or ActiveSheet.Cells(r + 1, i).Value = "R" _
            Or ActiveSheet.Cells(r + 1, i).Value = "RC" _
            Or ActiveSheet.Cells(r + 1, i).Value = "RM1" _
            Or ActiveSheet.Cells(r + 1, i).Value = "RM2" _
            Or ActiveSheet.Cells(r + 1, i).Value = "RM3" _
            Or ActiveSheet.Cells(r + 1, i).Value = "o" Then
             gg = 0
             If gg > ng Then
                ng = gg
             End If
        Else
            gg = gg + 1
            If gg > ng Then
                ng = gg
            End If
        End If
    Else
        y = ActiveSheet.Cells(r, i).Value
        Select Case y
        Case y = "AG1", "AG1", "AG2", "AG3", "AG4", "AG5", "AG6", "AG7", "C", "o", "CP", _
        "DS", "F", "M3", "Mal", "Rng", "SPc", "SPn", "SPs", "Tra", "VS", ""
              gg = 0
              If gg > ng Then
                ng = gg
              End If
        Case Else
            gg = gg + 1
             If gg > ng Then
                ng = gg
             End If
        End Select
    End If
Next i
ActiveSheet.Cells(r, 2).Value = ng
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub



Il file allegato espone i veri casi, così è più facile da capire.
 

Allegati

Marius44

VBA Expert
Moderatore
Expert
9 Settembre 2015
5.111
143
63
75
Catania
Excel2010
91
Ciao
Non è possibile adattare quella macro alle nuove esigenze.
Ho riadattato la mia precedente alle nuove necessità e, mi sembra, risponde alle esigenze.
Ancora una volta ti segnalo che la riga riguardante il nominativo GALLO non risulta come da te indicato.
Ecco il codice e il file (clicca sul pulsante)
Visual Basic:
Option Explicit

Sub Tre_Notti()
Dim ur As Long, uc As Long, i As Long, j As Long
Dim tn As String, tot As Integer
ur = Cells(Rows.Count, 2).End(xlUp).Row
Range("C2:C" & ur + 1).Interior.ColorIndex = xlNone
For i = 3 To ur Step 2
  uc = Cells(i + 1, Columns.Count).End(xlToLeft).Column
  For j = 4 To uc
    If Cells(i, j).Borders(xlDiagonalUp).LineStyle = xlNone Then 'se la cella NON è barrata
      tn = Cells(i, j).Value
      If tn = "RM" Or tn = "RC" Or tn = "R" Or tn = "C" Or tn = "Rise" Then
        tot = 0
      ElseIf tn = "N" Then
        tot = tot + 1
      End If
    ElseIf Cells(i, j).Borders(xlDiagonalUp).LineStyle = xlContinuous Then 'se la cella è barrata
      tn = Cells(i, j).Value
      If tn = "RM" Or tn = "RC" Or tn = "R" Or tn = "C" Or tn = "Rise" Then
        tot = 0
      ElseIf tn = "N" Then
        tot = tot + 1
      End If
      tn = Cells(i - 1, j).Value
      If tn = "RM" Or tn = "RC" Or tn = "R" Or tn = "C" Or tn = "Rise" Then
        tot = 0
      ElseIf tn = "N" Then
        tot = tot + 1
      End If
    End If
    If tot = 3 Then
      Range(Cells(i - 1, 3), Cells(i, 3)).Interior.ColorIndex = 3
      tot = 0
    End If
  Next j
  tot = 0
Next i
End Sub
Fai sapere. Ciao,
Mario
 

Allegati

NikiDiluccio

Utente abituale
14 Agosto 2016
182
1
18
Agropoli
2013
0
Ciao @ Marius44 @Marius44

La riga riguardante il nominativo GALLO e una condizione che invece di fare RM cioè un riposo lavora come straordinario. Quindi fa 3 notti consecutive e dovrebbe segnalarmelo.
 

Marius44

VBA Expert
Moderatore
Expert
9 Settembre 2015
5.111
143
63
75
Catania
Excel2010
91
Ciao
Cioè sarebbe come dire che la sigla RM "non" interrompe?
Dovresti essere più preciso circa le sigle che interrompono la sequenza di 3 notti e, in aggiunta, se la interrompo quando si trovano nella riga PARI o DISPARI.

Ciao,
Mario
 

NikiDiluccio

Utente abituale
14 Agosto 2016
182
1
18
Agropoli
2013
0
Ciao.
Tutte le sigle in rosso interrompono la sequenza delle 3 notti, RC, RM, C, R, RISE (che possiamo abbreviare in RS). Queste sigle interrompono sia nella riga pari che nella riga dispari.
Quando una cella viene sbarrata con /, significa che non deve fare il turno nella cella sbarrata ma quello che ce nella cella sopra. Se nella cella sopra ce una sigla rossa cioè RC, RM, C, R, RS, è un riposo quindi interrompe la sequenza delle 3 notti se invece ce una sigla nera come P, N, o M, non interrompono la sequenza delle 3 notti.
Nella riga di GALLO nella cella "M11" la barra su RM significa che non fa il riposo di turno ma dovrebbe fare la N notte che è sulla cella superiore, ma come detto non può farla perchè supera le 3 notti consecutive, quindi mi deve segnalare il rosso nella colonna C.

Un saluto Nicola.
 
Ultima modifica:

Marius44

VBA Expert
Moderatore
Expert
9 Settembre 2015
5.111
143
63
75
Catania
Excel2010
91
Ciao Nicola
con le tue ultime precisazioni la macro diventa così (ho messo l'apostrofo davanti alle righe di codice che puoi eliminare).
Visual Basic:
Option Explicit

Sub Tre_Notti()
Dim ur As Long, uc As Long, i As Long, j As Long
Dim tn As String, tot As Integer
ur = Cells(Rows.Count, 2).End(xlUp).Row
Range("C2:C" & ur + 1).Interior.ColorIndex = xlNone
For i = 3 To ur Step 2
  uc = Cells(i + 1, Columns.Count).End(xlToLeft).Column
  For j = 4 To uc
    If Cells(i, j).Borders(xlDiagonalUp).LineStyle = xlNone Then 'se la cella NON è barrata
      tn = Cells(i, j).Value
      If tn = "RM" Or tn = "RC" Or tn = "R" Or tn = "C" Or tn = "Rise" Then
        tot = 0
      ElseIf tn = "N" Then
        tot = tot + 1
      End If
    ElseIf Cells(i, j).Borders(xlDiagonalUp).LineStyle = xlContinuous Then 'se la cella è barrata
      'tn = Cells(i, j).Value
      'If tn = "RM" Or tn = "RC" Or tn = "R" Or tn = "C" Or tn = "Rise" Then
      '  tot = 0
      'ElseIf tn = "N" Then
      '  tot = tot + 1
      'End If
      tn = Cells(i - 1, j).Value
      If tn = "RM" Or tn = "RC" Or tn = "R" Or tn = "C" Or tn = "Rise" Then
        tot = 0
      ElseIf tn = "N" Then
        tot = tot + 1
      End If
    End If
    If tot = 3 Then
      Range(Cells(i - 1, 3), Cells(i, 3)).Interior.ColorIndex = 3
      tot = 0
    End If
  Next j
  tot = 0
Next i
End Sub
La sigla Rise la puoi lasciare anche così.
Adesso anche la riga del nominativo GALLO funziona.
Fai sapere. Ciao,
Mario
 

NikiDiluccio

Utente abituale
14 Agosto 2016
182
1
18
Agropoli
2013
0
Ciao.
Perfetto funziona benissimo.
Però avrei un'ultimo richiesta da farti, se hai visto la macro che ho postato sopra, non si possono superare 6 giorni consecutivi è un'altra condizione. Funzionano in parallelo negli stessi righi, pero la macro dei 6 giorni non ha il tasto per farla partire ma basta cliccare nel rigo superiore per attivarla. non potresti fare la stessa cosa con questa delle notti?
Grazie.
 

Marius44

VBA Expert
Moderatore
Expert
9 Settembre 2015
5.111
143
63
75
Catania
Excel2010
91
Non credo sia possibile (o quanto meno sarebbe abbastanza laborioso) in quanto quella macro fa riferimento alla cella attiva (infatti il codice fa riferimento a r = ActiveCell.Row) e poi passa le righe da 5 a 35 mentre la mia macro "legge" le ultime righe piene sia del Foglio1 sia del Foglio2 cosi come anche l'ultima colonna piena della riga di riferimento.

Ciao,
Mario
 

NikiDiluccio

Utente abituale
14 Agosto 2016
182
1
18
Agropoli
2013
0
Scusa @ Marius44 @Marius44
Ho sbagliato a darti un file diverso dall'originale come posizioni ora ti allego un altro con i vere parametri. Il rosso deve comparire nella colonna B e non nella C.
Ho messo entrambe le macro.

Ciao Nicola
 

Allegati

Marius44

VBA Expert
Moderatore
Expert
9 Settembre 2015
5.111
143
63
75
Catania
Excel2010
91
Ciao Nicola
scusa la franchezza e la brutalità: ma tu cosa fai? Ovvero ma chi ha fatto la precedente macro cosa fa? Non mi sembra affatto corretto chiedere aiuto e non far nulla per aiutarsi, dare informazioni ma non complete, cambiare le informazioni date in corso d'opera.
Ma un Forum, come ben dice un mio Amico, non deve e non può essere un "codicificio"! Io son pronto ad aiutarti ma non è che andiamo a fondo entrambi perchè tu non collabori?

Scusami, ma mi fermo qui.
Ciao,
Mario
 

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!