'Les constantes
Const Coché = "l", Décoché = "¡", Terminé = "ü"
Const Col_Oui = 4, Col_Part = 5, Col_Non = 6, Col_NA = 7, Col_Terminé = 16
Const CoulOui = 3394611, CoulPart = 65535, CoulNon = 255, CoulNA = 10921638
'CONSTANTES A AJUSTER EN FONCTION DU MODELE DE PHASES SUR LA FEUILLE
Const nbPhases = 9
Const iTitre = 1, iInterligne = 1, nbItems = 10
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim rMin As Long, rMax As Long, Pas%, RestMax%
Dim maZone As Range, zTerminée As Range, tablo, txt$
'Description des plages de saisie ([phase_0] nom défini sur la ligne de titre de la 1ère phase)
rMin = [phase_0].Row + 1: rMax = rMin + nbPhases * (nbItems + iTitre + iInterligne) - iTitre - 2: Pas = nbItems + iTitre + iInterligne: RestMax = Pas - (iTitre + iInterligne) - 1
R = ((ActiveCell.Row - rMin) Mod Pas) 'rang de la ligne active dans la phase (commence à 0)
C = Col_Oui - ActiveCell.Column 'décalage de la colonne par rapport à la colonne oui
Col = -C + 1 'rang de la colonne active dans la zone à cocher (commence à 1)
With ActiveCell
'Sortir si en-dehors de la zone utile
If ((.Column < Col_Oui Or .Column > Col_NA Or .Row < rMin) And (.Column <> Col_Terminé)) Or R > RestMax Or .Row > rMax Then Exit Sub
'=============================
'Clic sur un "pseudo bouton :"
'=============================
If (.Column >= Col_Oui And .Column <= Col_NA And .Row >= rMin) Then
'Zone contenant les pseudo boutons
Set maZone = .Offset(-R, C).Resize(RestMax + 1, 4)
'Case terminée correspondant à cette zone
Set zTerminée = maZone.Resize(1, 1).Offset(nbItems - 1, 12)
'Mémorisation des valeurs actuelles
tablo = maZone.Value
If tablo(R + 1, Col) = Coché Then
'décochage simple
tablo(R + 1, Col) = Décoché
Else
'décochage cases de la ligne courante, puis cochage de la case active
If tablo(R + 1, Col) = Décoché Then For i = 1 To 4: tablo(R + 1, i) = Décoché: Next: tablo(R + 1, Col) = Coché
End If
'remettre les valeurs à 'décoché' si valeur effacée
For i = 1 To 10
For j = 1 To 4
If tablo(i, j) = "" Then tablo(i, j) = Décoché:
Next
Next
'mise à jour de la zone
maZone.Value = tablo
'effacer la coche 'phase terminée'
zTerminée.ClearContents
Cancel = True
End If
'=================================
'Clic sur un cellule "fin de phase"
'=================================
If (.Column = Col_Terminé) And ((.Row - rMin) Mod Pas = RestMax) Then
txt = "Phase terminée" & Chr(10) & "cocher la cellule"
Select Case .Offset(0, -2).Value
Case "Phase non débutée", "Phase en cours"
.ClearContents
MsgBox .Offset(0, -2) & Chr(10) & "Terminez avant de cocher !"
Case "Phase terminée"
.ClearContents
Case txt
.Value = Terminé
End Select
Cancel = True
End If
End With
End Sub
Sub Initialisation()
Dim maZone As Range, zTerminée As Range
'Tableau pour valeurs "décochées"
ReDim tablo(1 To nbItems, 1 To 4)
For i = 1 To UBound(tablo, 1): For j = 1 To UBound(tablo, 2): tablo(i, j) = "¡": Next j: Next i
'Réinitialisation des tableaux de phase
For i = 0 To nbPhases - 1
Set maZone = Me.Cells([phase_0].Row + iTitre, Col_Oui).Resize(nbItems, 4).Offset(i * (iTitre + nbItems + iInterligne))
Set zTerminée = maZone.Resize(1, 1).Offset(nbItems - 1, 12)
maZone.Value = tablo: zTerminée.ClearContents
Next i
End Sub