Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim chem As String 'déclare la variable chem
Dim cl As Workbook 'déclare la variable cl (CLasseur)
Dim pl As Range 'déclare la variable pl (PLage)
Dim dest As Range 'déclare l avaraible dest (DESTination)
chem = ThisWorkbook.Path 'définit la variable chem
For x = 1 To Workbooks.Count 'boucle sur tous les classeurs ouverts
'si le nom du classeur est "commande generale.xls", va à l'étiquette suite
If Workbooks(x).Name = "commande generale.xls" Then GoTo suite
Next x 'prochain classeur de la boucle
Workbooks.Open (chem & "/commande generale.xls") 'ouvre le classeur "commande generale.xls"
suite: 'étiquette
Set cl = Workbooks("commande generale.xls") 'définit le classeur cl
ThisWorkbook.Activate
'définit la variable pl
Set pl = Sheets("liste de produit").Range("C3:C" & Sheets("liste de produit").Cells(Application.Rows.Count, 1).End(xlUp).Row)
'si le changement a lieu en dehors de la plage pl, sort de la procédure
If Application.Intersect(Target, pl) Is Nothing Then Exit Sub
'si plusieurs cellules sont sélectionnées, sort de la procédure
If Target.Cells.Count > 1 Then Exit Sub
With cl.Sheets("Feuil1") 'prend en compte l'onglet "Feuil1" du classeur cl
'définit la variable dest (recherche le code artiche dans la colonne A de l'onglet)
Set dest = .Columns(1).Find(Target.Offset(0, -2).Value, , xlValues, xlWhole)
If Not dest Is Nothing Then 'condition 1 : si il existe au moins une occurrence trouvée
If Target.Value <> "" Then 'condition 2 : si la cellule n'est pas effacée (contient une valeur)
dest.Offset(0, 2).Value = Target.Value 'remplace l'ancienne valeur par la nouvelle
Else 'sinon (si la cellule est effacée)
.Rows(dest.Row).Delete 'supprime la ligne entière
End If 'fin de la condition 2
Else 'sinon (si il n'existe aucune occurrence)
'definit la cellule de destination (A4 si A4 est vide, première ligne vide rencontrée si A4 n'est pas vide)
Set dest = .Cells(Application.Rows.Count, 1).End(xlUp)(IIf(.Range("A4").Value = "", 4, 2))
Range(Target.Offset(0, -2), Target.Offset(0, 1)).Copy dest 'copie la ligne et la colle dans dest
End If 'fin de la condition 1
End With 'fin de la prise en compte de l'onglet "commande gennerale"
End Sub