Option Explicit
Private Const BDCCelluleNomPièce = "B7"
Private Const BDCColonneNomPièce = "B"
Private Const BDCColonneArticle = "C"
Private Const BDCColonneQuantité = "D"
Private Const BDCColonneImage = "E"
Private Const NomFeuilleParamètres = "Parametre"
Private Const ParamètresColonneNomPièce = "A"
Private Const ParamètresColonneArticle = "A"
Private Const ParamètresColonneQuantité = "B"
Private Const ParamètresColonneImage = "C"
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Image As Shape
Dim ParamètresDernièreLigne As Long
Dim ParamètresLigne As Long
Dim BDCLigne As Long
Application.EnableEvents = False
On Error GoTo Erreur
'La cellule modifié n'est pas le nom de la pièce
If Target.Address <> Me.Range(BDCCelluleNomPièce).Address Then GoTo FinSub
With ThisWorkbook.Worksheets(NomFeuilleParamètres)
ParamètresDernièreLigne = .Range(ParamètresColonneArticle & Rows.Count).End(xlUp).Row
'Parcours de la colonne des noms de pièces dans la feuille Paramètres
For ParamètresLigne = 1 To ParamètresDernièreLigne
If .Range(ParamètresColonneNomPièce & ParamètresLigne).Value = Target.Value Then Exit For
Next ParamètresLigne
'Pas trouvé
If ParamètresLigne > ParamètresDernièreLigne Then GoTo FinSub
'Efface les données présentes
BDCLigne = Me.Range(BDCCelluleNomPièce).Row
Me.Range(BDCColonneArticle & BDCLigne).ClearContents
Me.Range(BDCColonneQuantité & BDCLigne).ClearContents
Set Image = ImageEnCellule(Me.Range(BDCColonneImage & BDCLigne))
If Not Image Is Nothing Then Image.Delete
BDCLigne = BDCLigne + 1
Do While Not IsEmpty(Me.Range(BDCColonneArticle & BDCLigne))
Set Image = ImageEnCellule(Me.Range(BDCColonneImage & BDCLigne))
If Not Image Is Nothing Then Image.Delete
Me.Range(BDCColonneNomPièce & BDCLigne & ":" & BDCColonneImage & BDCLigne).ListObject.ListRows(2).Delete
Me.Rows(BDCLigne).Delete
Loop
'Ligne du 1er article
ParamètresLigne = ParamètresLigne + 1
'Copie les valeurs de la feuille Paramètres à la feuille BDC
BDCLigne = Me.Range(BDCCelluleNomPièce).Row
Do While Not IsEmpty(.Range(ParamètresColonneArticle & ParamètresLigne))
Me.Range(BDCColonneArticle & BDCLigne).Value = .Range(ParamètresColonneArticle & ParamètresLigne).Value
Me.Range(BDCColonneQuantité & BDCLigne).Value = .Range(ParamètresColonneQuantité & ParamètresLigne).Value
Set Image = ImageEnCellule(.Range(ParamètresColonneImage & ParamètresLigne))
If Not Image Is Nothing Then
Image.Copy
Me.Range(BDCColonneImage & BDCLigne).Select
Me.Paste
End If
ParamètresLigne = ParamètresLigne + 1
BDCLigne = BDCLigne + 1
Loop
Me.Range(BDCCelluleNomPièce).Offset(-1, 0).Select
End With
GoTo FinSub
Erreur:
MsgBox "Erreur #" & Err.Number & " " & Err.Description
FinSub:
On Error GoTo 0
Application.EnableEvents = True
End Sub
Private Function ImageEnCellule(Cellule As Range) As Shape
Dim oShape As Shape
For Each oShape In Cellule.Parent.Shapes
If oShape.Type = msoPicture Then
If oShape.TopLeftCell.Address = Cellule.Address Then
Set ImageEnCellule = oShape
Exit Function
End If
End If
Next
Set ImageEnCellule = Nothing
End Function