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 SubEt 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 SubJ'ai une erreur sur la ligne
Achat.Rows(LigneSelectionnée).DeleteJe 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 SubRem : 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 SubBonjour
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 SubQuelqu'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 SubSi 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.DeleteJe 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