Supprimer lignes de feuilles en sélectionnant dans ListBox

Bonjour,

Je fais appel à vous car j'ai un problème en voulant supprimer des lignes depuis une ListBox.

Mon fichier permet de créer une commande d'habit avec un UserForm. Chaque personne choisit l'habit qu'il souhaite, la taille et la quantité. Selon l'habit et la quantité, le nombre de point utilisé augmente. Lorsque l'on appuie sur le bouton "Ajouter à la commande", les valeurs des combobox et textbox sont ajouté dans les cellules des tableaux des feuilles "Achat" et "Récap par personne". La feuille "Achat" est ensuite imprimé et signé pour valider la commande de la personne et la feuille "Récap par personne" me permet d'avoir un récapitulatif par personne. Ensuite avec TCD j'obtiens la quantité totale d'habit à commander.

Mes différents habits sont stocké dans un dossier. Le code regarde selon si c'est un homme ou une femme un chemin d'accès différent et ajoute la liste d'habit selon ceux présent dans chaque dossier (ce sont des photos en .jpg). Ensuite selon l'habit sélectionné je charge l'image dans l'UserForm. Cette liste est présente dans la feuille "Liste Habit" mais il y a Homme et Femme mélangé.

Une fois que la personne à choisie tous ces habits, elle peut soit supprimer une ligne soit valider la commande.

Mon problème survient pour supprimer une ligne. Je voudrais sélectionner la ligne dans la ListBox qui supprimera la ligne correspondante dans la feuille "Achat" et la feuille "Récap par personne" puis recharger ma ListBox selon ma feuille "Achat".

j'utilise ce code pour charger la listBox :

'Pour charger la ListBox Récapitulatif quand on le veut
Sub ChargerListBox()

  Dim CelluleHautduTableau As String
  Dim CelluleBasduTableau As String

   CelluleHautduTableau = "D4"
  'Recherche la cellule la plus basse du tableau    le.End(xlUp).Row pour dire que l'on prend la ligne la plus basse du tableau
   CelluleBasduTableau = "H" & Sheets("Achat").Range("H20").End(xlUp).Row
  'Rechargement de la listbox
   Me.Récapitulatif.RowSource = "Achat!" & CelluleHautduTableau & ":" & CelluleBasduTableau

End Sub

Et celui là pour la suppression :

'A chaque click sur le bouton de suppression de ligne
Private Sub Supprimer_Ligne_Click()

  'Dim LigneSelectionnée As Integer
      'Cherche la ligne selectionnée    on fait +2 car il y a l'en-tête
       LigneSelectionnée = Me.Récapitulatif.ListIndex + 2
         If Me.Récapitulatif.ListCount >= 0 And LigneSelectionnée > 0 Then
           'Supprime la ligne dans la feuille Achat et sur la feuille récap par personne
           Achat.Rows(LigneSelectionnée).Delete
           Sheets("Récap par personne").Rows(LigneSelectionnée).Delete
         End If

        'Recharge le listBox
         Call ChargerListBox
End Sub

J'ai une erreur sur la ligne

Achat.Rows(LigneSelectionnée).Delete

Je pense que cela vient du faite que j'utilise ListBox.RowSource. J'ai essayé avec ListBox.List() mais cela ne focntionne pas.

Je débute en vba, ce code est un copié collé modifié de code trouvé sur d'autres forum. J'en ai essayé plusieurs pour supprimer des lignes mais aucun de fonctionne.

Je vous remercie pour votre aide d'avance

Bonjour

Cela bugue vu que la liste des vêtement vient de la colonne B. On n'a pas les jpg et vos points sont calculés sur base de la colonne B. Pourquoi ne pas utilisez la colonne A ?

Essayez le code chargerlistbox comme ceci

Sub ChargerListBox()
Dim ts As ListObject
Dim i As Integer, j As Integer
Dim tablo()

Me.Récapitulatif.ColumnCount = 5
Set ts = Sheets("Achat").ListObjects("Table1")
ReDim tablo(1 To ts.ListRows.Count, 1 To ts.ListColumns.Count)
For i = 1 To ts.ListRows.Count
     For j = 4 To ts.ListColumns.Count
         tablo(i, j - 3) = ts.DataBodyRange(i, j).Value
     Next j
Next i
Me.Récapitulatif.List = tablo
End Sub

Rem : vous devriez prendre le temps de supprimer tous les accents dans vos codes. Il n'y a rien de plus mauvais que ce choix pour avoir des plantages. Pensez toujours Anglais. Donc pas d'accents (vêtements, récapitulatif, etc....)

Edit : le code pour supprimer. essayez ceci

Private Sub Supprimer_Ligne_Click()

With Me.Récapitulatif
    If .ListCount >= 0 And .ListIndex + 1 > 0 Then
        Sheets("Achat").ListObjects("Table1").ListRows(.ListIndex).Range.Delete
        'Recharge le listBox
        Call ChargerListBox
    End If
End With
End Sub

Bonjour

Merci pour les conseils, je vais essayer de modifier tout ça et je reviendrais donner le nouveau code qui fonctionne même sans chemin d'accès.
Je vais aussi tester les code pour charger la listbox et supprimer des lignes.

Rebonjour,
J'ai fais quelques modif, le fichier est désormais plus utilisable. Les habits viennent de la colonne A et j'ai aussi incorporer les deux morceaux de code de Dan.

J'ai juste un nouveau soucis, ma listbox n'affiche pas les en-tête. J'ai bien mon ListBox.ColumnHeads = True mais ça ne fonctionne quand même pas.

J'ai essayé de modifier la valeur de i en mettant 0 pour que ça commence au début du tableau mais ça ne fait rien :

Sub ChargerListBox()
Dim ts As ListObject
Dim i As Integer, j As Integer
Dim tablo()

Me.Récapitulatif.ColumnCount = 5
Set ts = Sheets("Achat").ListObjects("Table1")
ReDim tablo(1 To ts.ListRows.Count, 1 To ts.ListColumns.Count)
For i = 1 To ts.ListRows.Count
     For j = 4 To ts.ListColumns.Count
         tablo(i, j - 3) = ts.DataBodyRange(i, j).Value
     Next j
Next i
Me.Récapitulatif.List = tablo
End Sub

Quelqu'un à une idée ? Je pense que ça ne doit pas être grand chose à modifier.

J'ai juste un nouveau soucis, ma listbox n'affiche pas les en-tête. J'ai bien mon ListBox.ColumnHeads = True mais ça ne fonctionne quand même pas.

Oui c'est normal. De base les entêtes peuvent apparaitre avec Rowssource (je déconseille toujours cette méthode qui pose parfois des soucis) ou en utilisant une Listview à la place de la listbox.

Toutefois dans le code vous pouvez aussi faire ceci :
- Mettre ListBox.ColumnHeads à False ou mieux enlever la ligne
- Modifier cette ligne dans le code

tablo(i, j - 3) = ts.Range(i, j).Value

- Modifier votre code Supprimer comme ceci

Private Sub Supprimer_Ligne_Click()

With Me.Recapitulatif
    If .ListIndex = 0 Or .ListIndex = -1 Then Exit Sub
    Sheets("Achat").ListObjects("Table1").ListRows(.ListIndex).Range.Delete
    Sheets("Recap par personne").ListObjects("Table16").ListRows(.ListIndex).Range.Delete
    'Recharge le listBox
    Call ChargerListBox
End With
End Sub

Si ok -->

Cordialement

Pour l'en-tête ça fonctionne nickel

Pour la suppression j'ai juste eu à ajouter un +1 car sinon c'est ma ligne du dessus qui était supprimé

Sheets("Achat").ListObjects("Table1").ListRows(.ListIndex + 1).Range.Delete
Sheets("Récap par personne").ListObjects("Table16").ListRows(.ListIndex + 1).Range.Delete

Je te remercie pour ton aide !

Re

Si c'est le cas c'est que vous n'avez pas changé la ligne tablo(.... ) que je vous ai donnée ici --> https://forum.excel-pratique.com/s/goto/1105259
Vous avez probablement laissé Databodyrange au lieu de Range.

Cordialement

Oui tu as raison, je pensais l'avoir fait !

Merci encore et bon weekend

Rechercher des sujets similaires à "supprimer lignes feuilles selectionnant listbox"