C'est rigolo, mais quand même ce n'est pas sans conséquences ...
- rigolo
- parce que si tu supprimes la Ref 5 alors que la Ref 3 est cochée, la Ref 5 réapparaitra, c'est collant !
- rigolo sur le plan de la programmation car elle est itérative : si Ref 3 est cochée, Ref 5 et Ref 6 aussi, et du coup Ref 10 aussi (que j'ai ajouté dans le tableau)
- les incompatibilités sont bien commutatives mais pas les dépendances (le cochage de Ref 5 n'entraîne pas Ref 3)
- mais pas sans conséquences
- si le tableau de la page Parametrages change, je ne teste pas les nouvelles incompatibilités et dépendances, je peux le faire en signalant ls erreurs
- si j'efface la croix de Ref 3, je n'enlève pas celles de ses dépendances ou composants car ces Ref ont pu être induites par d'autres
- il y a un risque fort de bouclage à l'infini s'il y a des incohérences dans le tableau de Parametrages genre j'induis une dépendance incompatible avec une autre référence
Private Sub Worksheet_Change(ByVal Target As Range)
Dim IC As Object, ref, des
' recherche référence et désignation modifiée
ref = "": des = ""
For Each tbl In ActiveSheet.ListObjects
If Not Application.Intersect(Target, tbl.ListColumns(1).DataBodyRange) Is Nothing Then
ref = Target.Value
des = Target.Offset(0, 1).Value
Exit For
End If
If Not Application.Intersect(Target, tbl.ListColumns(3).DataBodyRange) Is Nothing Then
ref = Target.Offset(0, -2).Value
des = Target.Offset(0, -1).Value
Exit For
End If
Next
If ref <> "" Then
On Error GoTo fin ' si effacement de toute la feuille
If Target.Rows.Count > 1 Then
MsgBox "Une seule sélection à la fois !"
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
Exit Sub
End If
On Error GoTo 0
' couples maudits
Data = Sheets("Parametrages").ListObjects("Tref").Range.Value
Set IC = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(Data)
For j = 2 To UBound(Data, 2)
If Data(i, j) = "IC" Then
' on met ici les couples maudits dans un dictionnaire
IC(Data(i, 1) & "|" & Data(1, j)) = ""
IC(Data(1, j) & "|" & Data(i, 1)) = ""
End If
Next
Next
' recherche des incompatibilités entre ref et tous les tableaux
Message = ""
For Each tbl In ActiveSheet.ListObjects
Data = tbl.DataBodyRange.Value
For i = 1 To UBound(Data)
If Data(i, 3) <> "" Then
If IC.exists(Data(i, 1) & "|" & ref) Then
Message = Message & vbCrLf & Data(i, 1) & " (" & Data(i, 2) & ") et " & ref & " (" & des & ")"
End If
End If
Next
Next
' sanction
If Message <> "" Then
MsgBox "Incompatibilité détectée !" & vbCrLf & Message
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
Exit Sub
End If
End If
' ==============================================================
' activation des dépendances
' en l'absence de 'Application.EnableEvents = False' le code sera bien revolving
' et repartira sur toutes les zones changées
Dim adresse As Object
Set adresse = CreateObject("Scripting.Dictionary")
' stockage des adresses
For Each tbl In ActiveSheet.ListObjects
For i = 1 To tbl.ListRows.Count
adresse(tbl.DataBodyRange.Cells(i, 1).Value) = tbl.DataBodyRange.Cells(i, 3).Address
Next
Next
For Each tbl In ActiveSheet.ListObjects
For n = 1 To tbl.ListRows.Count
' ref de tous les tableaux
ref = tbl.DataBodyRange.Cells(n, 1).Value
' si la ref est cochée
If tbl.DataBodyRange.Cells(n, 3).Value <> "" Then
' on aura ici les cases avec libellés AS
Data = Sheets("Parametrages").ListObjects("Tref").ListColumns(ref).DataBodyRange.Value
' et ici les références dépendantes
LesRef = Sheets("Parametrages").ListObjects("Tref").ListColumns(1).DataBodyRange.Value
For i = 1 To UBound(Data)
If Data(i, 1) = "AS" Then
If Range(adresse(LesRef(i, 1))) = "" Then Range(adresse(LesRef(i, 1))) = "x"
End If
Next
End If
Next
Next
fin:
End Sub