[VBA] suppression d'une ligne suite à un choix de listbox

Bonjour à tous, une petite aide serait appréciée,

image

Dans ma listbox, sont récupérées des valeurs issues d'un tableau (TS_hybrid, colonne "Nom du sous réseau").

Par un bouton "Valider", je veux supprimer les lignes du tableau pour les valeurs sélectionnées.

Dim choix As Long

For i = 0 To liste.ListCount - 1

            choix = Application.Match(liste.list(liste.ListIndex), TS_hybrid.ListColumns("Nom du sous réseau").DataBodyRange, 0)
            TS_hybrid.ListColumns("nom du sous réseau").DataBodyRange(choix).EntireRow.delete

Next i

Cet extrait de code, fonctionne pour un élément selectionné (mais parfois j'ai l'erreur incompatibilité de type).

Mes questions:

-cette erreur qui n'apparait pas toujours est elle liée à ma déclaration de variable "choix"?

-comment boucler sur l'ensemble des valeurs sélectionnées pour supprimer les différentes lignes?

- petit bonus, si je supprime une valeur, la listbox ne se rafraichit pas...est il possible de forcer un rafraichissement ?

bon je n'ai plus mon erreur d'incompatibilité de type, cependant, je ne boucle pas sur les différentes selection de ma listbox, je ne traite qu'une seule donnée

dim choix as string
For i = 0 To liste.ListCount - 1

            choix = Application.Match(liste.list(liste.ListIndex), TS_hybrid.ListColumns("Nom du sous réseau").DataBodyRange, 0)
            TS_hybrid.ListColumns("Nom du sous réseau").DataBodyRange(choix).EntireRow.delete
Exit For
Next i

Si je retire le exit for déjà cela sera mieux, cependant je retrouve mon incompatibilté de type

Bonjour,

une fois les choix fait dans votre liste de choix, vous bouclez sur l'ensemble des lignes de la liste de la dernière à la première, vous testez si elle est ".Selected = True", vous récupérez son index qui correspond, je crois à la valeur de son ROW +1 du tableau Excel.

Avec un fichier c'est toujours plus simple...

@ bientôt

LouReeD

Hello le fichier demandé...

si ton point de vue pouvait me faire avancer...

35test.xlsm (80.09 Ko)

Pour reprendre mes différents points:

  • réussir à supprimer plusieurs sélection en même temps
  • peut on envisager un rafraichissement auto de ma listbox (pour cela bien évidemment le unload me n'aurait plus sa place dans le code de suppresion)

Un essai :

Private Sub delete_Click()
    Dim choix As String
    Dim Lig As Long, NbLig As Long
    If Me.delete_partielle.Value = True Then
        For i = 0 To liste.ListCount - 1
            If liste.Selected(i) = True Then
                choix = Application.Match(liste.list(i), TS_hybrid.ListColumns("Nom du sous réseau").DataBodyRange, 0)
                TS_hybrid.ListColumns("Nom du sous réseau").DataBodyRange(choix).EntireRow.delete
            End If
        Next i
        liste.Clear
        With TS_hybrid
            NbLig = .DataBodyRange.Rows.Count
            For Lig = NbLig To 1 Step -1
                If .ListColumns("Nom du sous réseau").DataBodyRange(Lig) Like "V" & Me.delete_vrf & "*" Then _
                    Me.liste.AddItem .ListColumns("Nom du sous réseau").DataBodyRange(Lig)
            Next Lig
        End With
     End If
End Sub

@ bientôt

LouReeD

Et bien un grand merci, je clos le fil.

Au vu de votre retour je dois comprendre que le code effectue ce qu'il faut...
merci de votre retour et remerciement !

@ bientôt

LouReeD

Une dernière remarque LouReeD

choix = Application.Match(liste.list(i), TS_lb.ListColumns("Vlan Name").DataBodyRange, 0)

ici le match accompagné du critère 0 indique qu'on recherche la valeur strictement identique.

Comme je travaille sur plusieurs tableaux j'ai adapté un peu le code de cette façon

For i = 0 To liste.ListCount - 1
            If liste.Selected(i) = True Then
                choix = Application.Match(liste.list(i), TS_spine.ListColumns("Nom interface-vlan").DataBodyRange, 0)
                TS_spine.ListColumns("Nom interface-vlan").DataBodyRange(choix).EntireRow.delete
                choix = Application.Match(liste.list(i), TS_L2.ListColumns("nom Vlan").DataBodyRange, 0)
                TS_L2.ListColumns("nom Vlan").DataBodyRange(choix).EntireRow.delete
                choix = Application.Match(liste.list(i), TS_lb.ListColumns("Vlan Name").DataBodyRange, 0)
                TS_lb.ListColumns("Vlan Name").DataBodyRange(choix).EntireRow.delete
                choix = Application.Match(liste.list(i), TS_orion.ListColumns("VSI").DataBodyRange, 0)
                TS_orion.ListColumns("VSI").DataBodyRange(choix).EntireRow.delete
                choix = Application.Match(liste.list(i), TS_hybrid.ListColumns("Nom du sous réseau").DataBodyRange, 0)
                TS_hybrid.ListColumns("Nom du sous réseau").DataBodyRange(choix).EntireRow.delete
            End If
        Next i

Cependant, il me semble que si une valeur n'est pas trouvée dans un tableau, le code s'arrête.

Existe t il un moyen de stipuler que si la valeur n'est pas trouvé dans un tableau on passe au suivant?

Petite évolution du code

For i = 0 To liste.ListCount - 1
            If liste.Selected(i) = True Then

                choix = Application.Match(liste.list(i), TS_spine.ListColumns("Nom interface-vlan").DataBodyRange, 0)
                TS_spine.ListColumns("Nom interface-vlan").DataBodyRange(choix).EntireRow.delete

                choix = Application.Match(liste.list(i), TS_L2.ListColumns("nom Vlan").DataBodyRange, 0)
                TS_L2.ListColumns("nom Vlan").DataBodyRange(choix).EntireRow.delete

                choix = Application.Match(liste.list(i), TS_lb.ListColumns("Vlan Name").DataBodyRange, 0)
                TS_lb.ListColumns("Vlan Name").DataBodyRange(choix).EntireRow.delete

                choix = Application.Match(liste.list(i), TS_orion.ListColumns("VSI").DataBodyRange, 0)
                TS_orion.ListColumns("VSI").DataBodyRange(choix).EntireRow.delete

                choix = Application.Match(liste.list(i), TS_hybrid.ListColumns("Nom du sous réseau").DataBodyRange, 0)
                TS_hybrid.ListColumns("Nom du sous réseau").DataBodyRange(choix).EntireRow.delete

            End If
        Next i

Cas concret de l'erreur rencontré:

je choisis donc de supprimer la valeur V103-LAN-XXXX, pour les tableaux TS_spine et TS_L2 pas de souci, la valeur existe il la supprime.

J'arrive donc avec le "pas à pas" pour le TS_lb, je sais que cette valeur ne s'y trouve pas, je souhaite donc ajouter la syntaxe qui dit que si la valeur n'est pas trouvée je continue le code...car la dès que la valeur n'est pas trouvée il me argument ou rappel de procédure incorrect avec choix déclaré comme variant

TS_lb.ListColumns("Vlan Name").DataBodyRange(choix).EntireRow.delete

Ce n'est pas beau mais si c'est maitrisé :

On Error Resume Next
For i = 0 To liste.ListCount - 1

en attendant mieux...

@ bientôt

LouReeD

Peut-être ceci est plus propre si l'erreur intervient à la suppression et non pas à la recherche :
If IsNumeric(choix) Then TS_spine.ListColumns("Nom interface-vlan").DataBodyRange(choix).EntireRow.Delete
ou bien
If choix>0 Then TS_spine.ListColumns("Nom interface-vlan").DataBodyRange(choix).EntireRow.Delete

@ bientôt

LouReeD

Loureed,

merci de t'être penché sur mon souci. Je m'aperçois que je ne maitrise pas toutes les possibilités (cf: On error resume next)

Je viens de l'implémenter et cela semble fonctionner très bien...

je lance une batterie de tests avant de valider cette fois pour toute et clore le sujet ;-)

Encore merci

Bonjour,

Si je peux me permettre.

Personnellement, j'éviterais la suppression de la ligne entière (s'il y a un autre TS dans l'onglet, il y aura un msg d'erreur, et s'il n'y en a pas, mais qu'il y a d'autres données sur ces lignes, elles seront supprimées...)

J'aurais opté pour :

TS_spine.ListRows(choix).Delete

ça ne supprime que la ligne du TS, pas les à-côtés....

Bon W-E

Hello Cousinhub

Remarque pertinente, je vais réaliser quelques tests ce matin je vous ferai un retour.

Excellente journée

Cousinhub, Loureed,

merci pour vos conseils.

J'ai obtenu grâce à vous exactement ce que je souhaitais.

Excellente journée à vous, je clos le sujet!

Bonsoir,

merci pour ce retour et remerciement !

@ bientôt

LouReeD

Rechercher des sujets similaires à "vba suppression ligne suite choix listbox"