IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Suppression ligne de listbox


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur maintenance industriel
    Inscrit en
    Juin 2018
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur maintenance industriel
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2018
    Messages : 185
    Par défaut Suppression ligne de listbox
    Bonjour,

    J'ai une listbox ou je peux supprimer et ajouter des lignes à l'aide de bouton
    sur le bouton supprimer j'ai mi le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub CommandButton3_Click()
    Dim i As Long
    For i = ModifList.ListBoxList.ListCount - 1 To 0 Step -1
    If ModifList.ListBoxList.Selected(i) Then
    ModifList.ListBoxList.RemoveItem (i)
    i = i - 1
    End If
    Next i
    End Sub
    cependant il me renvoi l'erreur :
    Erreur d'exécution'-2147467259(80004005)'
    Erreur non répertoriée
    à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ModifList.ListBoxList.RemoveItem (i)
    Mon userform s'appel bien ModifList, ma Listbox s'appel bien ListBoxList, et le I renvoi bien le numéro de ligne sélectionner.

    Je ne comprend pas ce qui se passe ..
    Pouvez vous m'aider ?
    Cordialement,
    Passepartout007

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonjour,

    Exemple de syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
         For i = Me.ListBox1.ListCount - 1 To 0 Step -1
             If Me.ListBox1.Selected(i) = True Then Me.ListBox1.RemoveItem i
         Next i
    Boisgontier

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur maintenance industriel
    Inscrit en
    Juin 2018
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur maintenance industriel
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2018
    Messages : 185
    Par défaut Re
    Bonjour Boisgontierjacques,

    Effectivement la syntaxe ressemble grandement à la mienne, j'ai tester les deux méthodes et maleureusement celui ci me renvois toujours la même erreur a la même ligne

    Erreur d'exécution'-2147467259(80004005)'
    Erreur non répertoriée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Me.ListBoxList.RemoveItem (i)
    Je ne comprend pas pourquoi ..;
    Cordialement,
    Passepartout007

    Ps je te remercie pour ta réponse sur le sujet https://www.developpez.net/forums/d1.../#post10384812 j'ai poser également un autre question ^^

    Tu est d"une aide précieuse et je t'en remercie.

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Bonjour,

    Passepartout007 fais un petit effort sur l'orthographe, la grammaire et la syntaxe stp.

    Sinon, il me semble qu'il y a plus simple qu'une listbox pour réaliser ce que tu souhaites. Une zone de liste avec un nom défini par exemple ?

    Si tu peux détailler un peu ce que tu veux faire avec ta listbox ça nous permettrait de te faire des propositions alternatives éventuellement plus simples (toujours faire le plus simple possible dans ton code).

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur maintenance industriel
    Inscrit en
    Juin 2018
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur maintenance industriel
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2018
    Messages : 185
    Par défaut Re
    Bonjour,

    Excusez moi pour ma grammaire je devais être fatigué, je vais faire attention.

    Alors je vous explique, j'ai des tableau nommé dans mon fichier excel, dans le qu'elle l'on retrouve qu'une colonne. Cette colonne correspond un un listes de choix possibles dans d'autre page du formulaire .
    Dans la l'userform ou l'on travaillent actuellement à comme fonction, après avoir sélectionner le nom du tableau et sa colonne, d’afficher dans une listbox l'intégralité des ligne du tableau.

    Il est possible d'utiliser deux fonctions dans cet userform :

    La parti ajouter, qui me permet d'envoyer un nouvelle élément dans la liste (grâce un un textbox, et un bouton)
    et la partie supprimer, qui me premet de supprimer un élément de la listbox (l'élément sélectionné.).

    Cependant dans mon code a la réalisation de la suppressions de la ligne sélectionner le code me renvoi une erreur.

    Erreur d'exécution'-2147467259(80004005)'
    Erreur non répertoriée
    A la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Me.ListBoxList.RemoveItem (i)
    Je ne comprend pas pourquoi parce que cela a l'aire de fonctionner chez les différent intervenant (dans d'autre discutions).

    Je reviens donc vers vous pour éclaircir ce mystère. je suis disposé à envisager d'autre méthode.
    Cordialement,
    Passepartout007

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Je dis cela car dans ton dernier message (malgré ta fatigue moindre), il y a une ou plusieurs fautes à chaque ligne quasiment (il y a une dès le titre d'ailleurs) et que cela ne rend pas la lecture de tes messages très agréable mais aussi on a vraiment du mal à te comprendre.

    D'après ce que je comprends (j'ai vraiment du mal en te lisant) : tu as une colonne dans laquelle tu listes tous les choix possibles qui peuvent être faits dans différentes feuilles de ton classeur. Cette liste est mise à jour puisque tu y ajoutes ou supprimes des éléments. J'en déduis donc qu'il s'agit de la synthèse de tous les choix déjà faits dans les différentes feuilles : si tu fais un choix dans la feuille x, il apparaît dans ta listbox mais si tu modifies ce choix dans cette même feuille il disparaît de ta listbox. D'où tes ajouts et suppressions d'éléments. Ai-je bien compris ?

    Si c'est cela, la listbox me paraît superflue. Une simple liste déroulante conviendrait tout aussi bien et serait plus facile à manipuler. D'ailleurs tu peux même faire encore plus simple en écrivant simplement tes valeurs dans des cellules.

    Au passage quand tu utilises l'index i, tu t'assures que l'élément existe ? Si tu l'as déjà supprimé avant, effectivement il va y avoir une erreur. Et d'autres utilisateurs peuvent ne pas avoir cette erreur en lançant le code s'il existe quand le code est exécuté. Tandis qu'en lançant plusieurs fois le code, s'il a été supprimé la première fois l'erreur va se produire...

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur maintenance industriel
    Inscrit en
    Juin 2018
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur maintenance industriel
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2018
    Messages : 185
    Par défaut Re : Attention au interprétation.
    Bonjour, ta critique est certe constructive sur des points mais sur d'autre elle ne fais que m'enfoncer ... Je ne trouve pas que cela est le but du forum .. bref passons.
    Je ne suis pas forcément très bon en grammaire, mais dans l'ensemble j'ai toujours réussi a bien me faire comprendre de la communauté de ce forum qui et très agréable et très gentil (généralement).


    Je réexplique car je pense qu'il y a eu un quiproquo dans la compréhension.

    Je me trouve dans un formulaire.

    Ce formulaire se base sur des données provenant de tableau excel dont les utilisateurs n'aurons pas accès.
    Chaque tableau représente une listes de choix. J'affiche ses listes dans une listbox qui se trouve dans un Userform.
    j'ai un bouton ajouter qui ajoute des possibilitées à la listbox et un bouton supprimer qui doit supprimer la ou les possibilitée(s) sélectionnée(s).
    Cependant comme expliquer précedement la ligne de code ne fonctionne pas et je ne comprend pas pourquoi. si tu as une autre manière de faire tu peux me l'exprimer mais j'aimerais garder l'affichage dans une listbox cela permet une meilleure visibilité des différent élément

    Concernant cette mis en garde qui est très constructive je te répond :
    Au passage quand tu utilises l'index i, tu t'assures que l'élément existe ? Si tu l'as déjà supprimé avant, effectivement il va y avoir une erreur. Et d'autres utilisateurs peuvent ne pas avoir cette erreur en lançant le code s'il existe quand le code est exécuté. Tandis qu'en lançant plusieurs fois le code, s'il a été supprimé la première fois l'erreur va se produire...
    Q'effectivement le code prend en compte ce critère car il remonte de la dernière ligne à la première ligne de la listbox, de plus si l'on ré appuis sur le bouton supprimé le i est modifié à chaque fois.

    voici l'intégraliter du code pour que tu t'en fasse une idées n'hésite pas à me faire des retours constructif.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Private Sub CommandButton3_Click()
    Dim i As Long
    For i = Me.ListBox1.ListCount - 1 To 0 Step -1
             If Me.ListBox1.Selected(i) = True Then Me.ListBox1.RemoveItem i
         Next i
    end sub
    Respectueusement,
    Passepartout007

  8. #8
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Bonjour, ta critique est certe constructive sur des points mais sur d'autre elle ne fais que m'enfoncer ... Je ne trouve pas que cela est le but du forum .. bref passons.
    Je ne suis pas forcément très bon en grammaire, mais dans l'ensemble j'ai toujours réussi a bien me faire comprendre de la communauté de ce forum qui et très agréable et très gentil (généralement).
    Non, ce n'est pas t'enfoncer que d'essayer de te faire prendre conscience d'un problème qui te ferait systématiquement recaler en termes de recrutement. Et il se trouve que effectivement on a du mal à te comprendre. On ne demande à personne d'être parfait en termes de langue surtout dans ce cadre, mais il y a un minimum quand même. Et c'est dommage de rater une opportunité d'embauche, de promotion ou que sais-je encore pour cela. Maintenant, rien oblige à en tenir compte mais alors qu'il est si facile d'y remédier pourquoi ne pas le faire ?

    Dans la boucle For Next le décrément me paraît dangereux. La boucle commence à n - 1 c'est à dire le nombre d'éléments de la liste moins une unité. Chaque itération se termine par un décrément d'une unité jusqu'à 0. Par souci de simplicité, j'écrirais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = 1 To Me.ListBox1.ListCount
    En ce qui concerne la simplicité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub CommandButton3_Click()
     
    Dim i As Long
     
    For i = 1 To Me.ListBox1.ListCount
               If Me.ListBox1.Selected(i - 1) = True Then
                        Me.ListBox1.RemoveItem (i - 1)
               End If
    Next
     
    End sub
    Ensuite je t'invite à consulter si tu ne l'as pas fait :

    La documentation MSDN du contrôle ListBox (avec exemples)

    Notamment cet exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub CommandButton2_Click() 
     'Ensure ListBox contains list items (s'assurer que la listbox contient des éléments de liste)
           If ListBox1.ListCount >= 1 Then 
           'If no selection, choose last list item. (si pas de sélection, choisir le dernier élément de liste)
                 If ListBox1.ListIndex = -1 Then 
                       ListBox1.ListIndex = ListBox1.ListCount - 1 
                 End If 
                 ListBox1.RemoveItem (ListBox1.ListIndex) 
           End If 
    End Sub
    J'ai également consulté ceci :

    La documentation de la propriété .Selected

    La limite de cette propriété est que si l'élément n'est pas sélectionné, il n'est tout simplement pas retiré puisque que la propriété renverra False.

    Plutôt que de tester chaque élément de liste, il est donc possible de ne supprimer que l'index sélectionné, non ?

    Documentation de .ListIndex

    Ce post me paraît également intéressant.

    J'essaierais bien quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListBox1.RemoveItem(ItemSelected.ListIndex)
    .

    Sinon le Me est potentiellement source d'erreur. Essaye de le remplacer par ActiveSheet ou Sheet(x) où x est l'indice de ta feuille pour voir.

  9. #9
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonjour,
    Citation Envoyé par Nagel Tha Voir le message
    le décrément me paraît dangereux.
    Lorsque tu supprimes c'est au contraire ton incrémentation qui est dangereuse car si tu supprimes le 2, le 3 devient 2 et tu ne le testes pas : ton résultat va être curieux ;-)
    Il vaut mieux tester ce que l'on préconise.

  10. #10
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Bonjour,
    Citation Envoyé par Nagel Tha Voir le message
    le décrément me paraît dangereux.
    Lorsque tu supprimes c'est au contraire ton incrémentation qui est dangereuse car si tu supprimes le 2, le 3 devient 2 et tu ne le testes pas : ton résultat va être curieux ;-)
    Il vaut mieux tester ce que l'on préconise.
    Donc tu recommandes de ne pas prendre de précaution quand tu codes ?

    Personnellement, je fais toujours ces vérifications et n'ai jamais eu ce genre de problème. Maintenant je ne prétends pas livrer un code complet ici mais à donner des pistes de réflexion...

    Cela me permet de faire une recommandation : toujours se demander ce qu'il se passe "si". Cela veut dire prévoir la gestion des boutons "croix" et "annuler" des msgbox et inputbox par exemple. Cela passe par prévoir des Else If et Else dès que nécessaire. Cela passe par l'utilisation de Debug.Print pour s'assurer que tout se passe bien avant de livrer une version finale...

    Donc quand tu commences à dire que ton code fonctionne sans faire un test (que tu devrais faire dans tous les cas) quand tu changes juste des indices c'est que tu passes à côté de quelque chose...

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonsoir passepartout
    si ta listbox ne fait qu'une colonne tu peux faire ca simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub CommandButton3_Click()
        Dim i&, a&, tablo()
        With ModifList.ListBoxList
            For i = 1 To .ListCount - 1
                If .Selected(i) = False Then a = a + 1: ReDim Preserve tablo(0 To a): tablo(a) = .List(i)
            Next i
            .List = tablo
        End With
    End Sub
    en fait on réédite la liste sans les selectionnés
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  12. #12
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour à toutes et tous,

    Concernant ce que dit "Nagel Tha" :
    Dans la boucle For Next le décrément me paraît dangereux. La boucle commence à n - 1 c'est à dire le nombre d'éléments de la liste moins une unité. Chaque itération se termine par un décrément d'une unité jusqu'à 0. Par souci de simplicité, j'écrirais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For i = 1 To Me.ListBox1.ListCount
    Avec cette ligne de code il y a plantage car l'indice de base pour la ListBox est 0 d'ou la nécessité d'utiliser "ListBox1.ListCount - 1" en partant de 0 et ensuite, c'est une erreur d'incrémenter la boucle car dès son initialisation, la borne supérieure ne change plus (elle reste égale à "ListBox1.ListCount - 1") et si on supprime ne serait-ce qu'un élément il y a plantage car "ListCount" a changé mais pas la borne supérieure de la boucle qui reste égale à "ListBox1.ListCount - 1" à son initialisation !

    Il y a différentes méthodes pour remplir une ListBox, la propriété "AddItem" (ajout des éléments les uns après les autres)
    - la propriété "List" (par exemple avec les valeurs d'une plage) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Set Plage = Range("A1:A20")
    ListBox1.List = Plage.Value
    - et la propriété "RowSource" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ListBox1.RowSource = "A1:A20"
    Dans les deux premiers cas, pas de problème pour la suppression mais dans le dernier cas (RowSource), il est impossible d'effectuer une suppression d'où l'erreur si on tente de la faire.
    Si c'est de cette façon qu'est faite le remplissage de la ListBox et bien il faut lui préférer "List" !

  13. #13
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Petite question, le listbox, il ne serait pas rempli à l'aide sa propriété RowSource des fois?

    Si c'est le cas, supprimer une ligne dans le ListBox ne supprime pas le contenu du tableau sur la feuille Excel, il faut résonner dans l'autre sens. C'est à dire qu'il faut supprimer la ligne dans ton tableau Excel et le listbox se mettra alors à jour sans les lignes préalablement supprimées.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  14. #14
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Avec cette ligne de code il y a plantage car l'indice de base pour la ListBox est 0 d'ou la nécessité d'utiliser "ListBox1.ListCount - 1" en partant de 0 et ensuite, c'est une erreur d'incrémenter la boucle car dès son initialisation, la borne supérieure ne change plus (elle reste égale à "ListBox1.ListCount - 1") et si on supprime ne serait-ce qu'un élément il y a plantage car "ListCount" a changé mais pas la borne supérieure de la boucle qui reste égale à "ListBox1.ListCount - 1" à son initialisation !
    Sous réserve de ne pas faire les modifications qui s'en suivent...

    ListCount peut être évalué à chaque itération ou l'indice peut être modifié en conséquence. Le même problème se présente quand on insère des lignes ou que l'on supprime des lignes si l'on veut y voir un problème. Sauf que la décrémentation ne sera pas toujours possible tandis que l'incrémentation si. Chacun ses préférences mais dire qu'il n'est pas possible d'incrémenter est faux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To ListBox1.ListCount
    ...
    i = i + 1 'si l'on retire un élément (ajouter une condition)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To DernierElement
    DernierElement = DernierElement - 1 'idem ajouter la condition si l'on retire un élément
    ...
    Les indices sont purement arbitraires. Cela ne résout rien de décrémenter ou d'incrémenter si l'on ne teste pas les conditions. Sachant qu'un humain a tendance à compter positivement, dès que possible il est judicieux de garder ce système. Evidemment que le code sera légèrement différent mais j'ai volontairement omis d'écrire tout le code pour éviter que cela soit repris sans se poser de questions. Je vois que ce n'est pas bien compris. J'écrirai le tout la prochaine fois...

  15. #15
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Un tableau structuré sur la feuil1 nommé Tab_Valeurs

    Un UserForm avec une listbox LBValeurs et un bouton CmdSupprimer

    Code du bouton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Private Sub CmdSupprimer_Click()
    Dim iVal As Integer
    Dim iDel As Variant, TabDel As Variant
    Dim strItemSelected As String
     
        'Lorsqu'une ligne du tableau excel est supprimée, la listbox est immédiatement rafraichi et la sélection est perdue
        'On fait donc une image à l'instant t des item à supprimer
        For iVal = 0 To LBValeurs.ListCount - 1
            If LBValeurs.Selected(iVal) Then
                If strItemSelected <> "" Then strItemSelected = strItemSelected & ","
                strItemSelected = strItemSelected & CStr(iVal)
            End If
        Next
     
        If strItemSelected <> "" Then
     
            Application.ScreenUpdating = False
     
            'On boucle sur les item à supprimer (toujours en sens inverse)
            TabDel = Split(strItemSelected, ",")
            For iDel = UBound(TabDel) To 0 Step -1
                Feuil1.ListObjects("Tab_Valeurs").ListRows(CLng(TabDel(iDel)) + 1).Delete
            Next
     
            Application.ScreenUpdating = True
        End If
    End Sub
    En PJ le fichier exemple

    ++
    Qwaz
    Fichiers attachés Fichiers attachés

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  16. #16
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    Salut

    Citation Envoyé par Nagel Tha Voir le message
    Sauf que la décrémentation ne sera pas toujours possible tandis que l'incrémentation si.
    Aurais tu un exemple ou la décrémentation n'est pas possible?

    Tu l'as dis toi même un peu plus haut, toujours faire au plus simple. Lorsqu'on fait une boucle qui vise à détruire des items, inutile d'ergoter, il faut faire une boucle inverse. C'est parfois contraignant dans le cas des boucle for each par exemple qui ne le permettent pas mais c'est bien plus simple que de s'amuser à à modifier les bornes en dynamique, du moins c'est mon avis, chacun fait ce qu'il lui plait.

    J'écrirai le tout la prochaine fois...
    Ce sera sans doute mieux oui. Mais ça n'est que mon avis, c'est comme pour la syntaxe de la langue française, on comprend mieux quand il y a tous les mots, autant tenir compte de tes propres réflexions sur la syntaxe des autres


    [Edit]
    Et s'agissant de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For i = 1 To ListBox1.ListCount
    ...
    i = i + 1 'si l'on retire un élément (ajouter une condition)
    C'est un plantage assuré puisque le ListBox est en base 0 et non en base 1. Mais bien sûr on peut mettre i-1 partout à l'intérieur de la boucle For...
    [/Edit]
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  17. #17
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Ce sera sans doute mieux oui. Mais ça n'est que mon avis, c'est comme pour la syntaxe de la langue française, on comprend mieux quand il y a tous les mots, autant tenir compte de tes propres réflexions sur la syntaxe des autres
    Compare ce qui est comparable...
    Mon but est pas de faire des "réflexions" mais de donner aux gens une occasion de s'améliorer. Si ça te plaît de regarder les gens se planter et même de les encourager pas moi. On s'améliore en se confrontant à la réalité.

    Mon but était de faire réfléchir et non pas de livrer une solution toute faite qui ne sera plus comprise dans un mois...

    Selon moi incrémenter est plus simple et j'ai donné des arguments. Il n'y a pas de meilleure façon de penser qu'une autre et non mon code ne plante pas pourvu que tu fasses les adaptations nécessaires quand tu choisis d'incrémenter ou de décrémenter...Que ça ne te plaise pas c'est autre chose mais dis simplement que ça ne te plaît pas...

    Faire au plus simple c'est aussi faire en sorte que ce soit le plus compréhensible pour l'humain. Cela ne veut pas dire une ou deux lignes de moins, ce qui ne change pas grand chose. On compte positivement et à partir de 1 c'est pour cela que je propose une telle boucle. Ce n'est qu'une proposition. S'il y en a que cela aide très bien sinon tant pis. Personnellement je trouve cela plus facile. D'autres ne seront pas d'accord très bien pour eux. Mais qu'ils ne viennent pas prétendre qu'incrémenter n'est pas possible...

  18. #18
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    pour faire simple je réhitere mon invitation a relire le post#11
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  19. #19
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    Juste une question en revoyant ton post 11, tu définis deux variables en ajoutant l'esperluette (&) à la fin, c'est sûrement une question idiote mais que signifient-ils ? (ex : Dim a&)

  20. #20
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Re,

    Et bien, testes ce code et tu auras la réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub Test()
     
        Dim I&
     
        MsgBox TypeName(I)
     
    End Sub
    Je doute que tu puisses voir souvent le code que tu donnes en exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For i = 1 To DernierElement
    DernierElement = DernierElement - 1 'idem ajouter la condition si l'on retire un élément
    ...
    Pour ce type de d'incrémentation ou décrémentation on utilise plutôt une boucle Do Loop et on ne modifie pas le compteur dans une boucle For Next car les résultats peuvent être bien différents que ceux escomptés !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2010] suppression ligne feuille avec listbox
    Par tiesto08 dans le forum Excel
    Réponses: 6
    Dernier message: 07/03/2017, 18h16
  2. Problème erreur 424 suppression d'une ligne via listbox
    Par Chris171717 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/02/2013, 17h04
  3. [XL-2003] pb suppression lignes listbox
    Par bebel9313 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/07/2010, 17h49
  4. [JTable] probleme suppression ligne
    Par lilou77 dans le forum Composants
    Réponses: 1
    Dernier message: 01/11/2005, 10h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo