Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim Nom_Tableau$, Ligne As Range, Exécution$, Cible As Range, NbLgn As Long, Idx As Long
'Vérifier que Target est une seule cellule et qu'elle appartient à une des colonne Qté
If Target.Count = 1 And Not Intersect(Target, Union([Tb_Machine[Qté]], [Tb_Commande[Qté]], [Tb_Systèmes_de_Butée[Qté]], [Tb_Outils[Qté]])) Is Nothing Then
'Nom du tableau source
Nom_Tableau = Target.ListObject.Name
'Ligne concernée du tableau
Set Ligne = Intersect(Evaluate(Nom_Tableau), Target.EntireRow)
'Texte de la colonne "Exécution"
Exécution = Ligne.Cells(2).Value
'Plage du tableau cible (dans l'onglet Trame)
Set Cible = Evaluate(Replace(Nom_Tableau, "Tb", "Trm"))
'Nombre de lignes du tableau cible
NbLgn = Cible.Rows.Count
'Recherche de la valeur "Exécution" dans le tableau cible, 0 si échec
Idx = 0: On Error Resume Next: Idx = WorksheetFunction.Match(Exécution, Cible.Columns(2), 0): On Error GoTo 0
Select Case Target.Value
Case 0
Target = 1 'basculer de 0 à 1
If Idx = 0 Then
'La ligne n'existe pas dans Trame
If NbLgn > 1 Or Cible.Cells(1, 2) <> "" Then
'Le tableau n'est pas vide : on ajoute une ligne
Cible.ListObject.ListRows.Add AlwaysInsert:=False
Set Cible = Evaluate(Cible.ListObject.Name)
End If
'On complète la nouvelle ligne
With Cible.Rows(Cible.Rows.Count)
.Cells(1) = Ligne.Cells(1)
.Cells(2) = Exécution
.Cells(3) = Ligne.Cells(3)
.Cells(4) = Ligne.Cells(4)
End With
Else
'La ligne existe déjà dans le tableau cible : on ne fait rien
MsgBox "La ligne existe déjà dans la trame !"
End If
Case 1
Target = 0 'basculer de 1 à 0
If Idx = 0 Then
'La ligne n'apparaît pas dans le tableau cible
MsgBox "La ligne n'apparaît pas dans la trame !"
Else
If NbLgn = 1 Then
'si le tableau cible ne comporte qu'une ligne on vide cette ligne (sauf la formule Prix Total)
Cible.Cells(1).Resize(1, 4).ClearContents
Else
'Si le tableau cible comporte plus d'une ligne on supprime la ligne concernée
Cible.ListObject.ListRows(Idx).Delete
End If
End If
End Select
'On désactive le clic droit
Cancel = True
End If
End Sub