Private Sub Worksheet_Change(ByVal Target As Range)
Dim DerLig As Long
Dim LgFin As Long
Dim J As Long
Dim Cel As Range
  If Target.Column <> 13 Then Exit Sub
  With Sheets("Produit")
    DerLig = .Range("D" & Rows.Count).End(xlUp).Row   ' La dernière ligne dans la page Produit
    .Range("E2:E" & DerLig).Copy .Range("F2")         ' On copie le stock initial dans le stock final
    LgFin = Range("M" & Rows.Count).End(xlUp).Row     ' La dernière ligne dans la page Janvier
    For J = 12 To LgFin                               ' Pour chaque produit
      If Range("M" & J) <> "" Then                    ' Si la cellule M.. n'est pas vide
        ' On cherche dans la page "Produit" la cellule correspondante
        Set Cel = .Range("D2:D" & DerLig).Find(what:=Range("M" & J), LookIn:=xlValues, lookat:=xlWhole)
        If Not Cel Is Nothing Then                      ' Si trouvée
          ' Le stock final est égal au stock initial - x fois le produit vendu
          Cel.Offset(0, 2) = Cel.Offset(0, 1) - Application.CountIf(Range("M12:M" & LgFin), Range("M" & J))
        Else
          MsgBox "Produit inexistant : " & Range("M" & J)
        End If
      End If
    Next J
  End With
End Sub