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 :

Sélection et Suppression d'Item de listbox via ToggleButton


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Par défaut Sélection et Suppression d'Item de listbox via ToggleButton
    Bonjour à tous,

    Je dispose d'un USF contenant 18 ToggleButtons et 2 Listbox.

    Je souhaiterai qu'en cliquant sur les ToggleButtons, leur Caption soient ajoutés ou supprimés de la ListBox2 selon leur valeur vraie ou fausse.

    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
    Private Sub ToggleButton1_Click()
    If ToggleButton1.Value = True Then
        ListBox2.AddItem ToggleButton1.Caption
    Else
           For j = ListBox2.ListCount - 1 To 0 Step -1
        ListBox2.Select ToggleButton1.Caption
        If ListBox2.Selected(j) = True Then
        'on Supprime l'élément selectionné dans la ListBox.
        ListBox2.RemoveItem (j)
        End If
    Next j
    End If
     
    ToggleButton1.BackColor = IIf(ToggleButton1 = True, vbGreen, vbRed)
     
    End Sub
    Je pars de cette base, suis je dans la bonne voie?

    Merci!

  2. #2
    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
    que se passe t il si l'item correspondant a la caption n'existe pas ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For j = ListBox2.ListCount - 1 To 0 Step -1
            If ListBox2.list(j,0)=ToggleButton1.Caption Then ListBox2.RemoveItem (j):exit for
      Next j
    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

  3. #3
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Par défaut
    Merci de votre retour si rapide!

    A priori impossible, car à l'initialisation les ToggleButtons et la ListBox sont alimentés (True / False / Listindex) depuis le même tableau...

    Votre code fonctionne parfaitement, merci!

    Une suggestion pour dupliquer à tous les ToggleButtons (de 1 à 18)?

  4. #4
    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
    alors si tu a x toglebutton il te faut soit écrire dans le code du module userform les évènements de chaque togle ou faire une classe control qui rassemblera tout les évènements en quelques lignes de code dans un module classe
    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

  5. #5
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Par défaut
    Ok, première solution éprouvée car dans mes cordes!

    Je ne gère pas les modules de classes pour le moment... Mais vu la tournure de mes modules, il va bien falloir que je m'y intéresse!

    Merci beaucoup des conseils!

  6. #6
    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
    exemple simple de classe

    dans ton userform tu a une listbox et x togglebutton

    dans le activate du userform tu met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim cls As New Classe1
    Private Sub UserForm_Activate()
    cls.alltogle Me, ListBox1' adapte le nom de ta listbox 
    End Sub
    ajoute un module classe et met y cela dedans
    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
    Public WithEvents togle As msforms.ToggleButton
    Public WithEvents liste As msforms.listbox
    Dim cl(100) As New Classe1
     
    Function alltogle(uf, listbox)
        For Each ctrl In uf.Controls
            If TypeName(ctrl) = "ToggleButton" Then
             i = i + 1:
             Set cl(i).togle = ctrl:
             set cl(i).liste = listbox
            end if 
      Next
    End Function
    Private Sub Togle_Click()
        If togle = False Then
            For i = liste.ListCount - 1 To 0 Step -1
                If liste.list(i, 0) = togle.Caption Then liste.RemoveItem (i)
            Next
        Else
            liste.AddItem togle.Caption
        End If
        'MsgBox "coucou"
    End Sub
    voila et c'est tout tu a le mémé évènement pour tes togglebuttons dans la classe
    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

  7. #7
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Par défaut
    Je me copie ça dans un coin pour revenir l'étudier...

    Depuis des mois que je duplique mes portions de code en corrigeant à la main les n° d'items!

    mais jusque là ça fonctionnait! Bon, sources d'erreur mais avec un peu de rigueur ça me convenait!

    J'imagine que le jour où j'aurai eu à coder + de 50 arguments... ça m'aurait pris de trouver un autre moyen.

    Merci encore!

  8. #8
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Par défaut souci: alimentation en double - suppression en simple!
    RE...

    Du fait d'un souci d'alimentation, il se trouve que j'ai les items qui peuvent apparaître en double...

    Or, à la suppression, je ne supprime que l'item le plus bas dans la liste... serait-il possible d'étendre la suppression à tout la liste?

    edit: il me semblait qu'avec la boucle proposée sur (j) les items identiques devaient tous être supprimés à priori...?

  9. #9
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour IronLight

    Une autre conception t'éviterait beaucoup de travail et tes soucis d'alimentation "double".
    Je te propose de faire cette petite expérience sur un userform tout neuf
    - tu y mets :
    - une listbox listbox1
    - une listbox listbox2
    - un bouton de commande commandbutton1
    - un bouton de commande commandbutton 2
    ce code :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Private Sub UserForm_Activate()
      'juste pour avoir ici de la "matière" à tester
      With ListBox1
        .MultiSelect = fmMultiSelectMulti
        .AddItem "a"
        .AddItem "b"
        .AddItem "c"
        .AddItem "d"
        .AddItem "e"
      End With
      CommandButton1.Caption = "ajouter les items sélectionnés dans listbox1"
      CommandButton2.Caption = "supprimer les items sélectionnés dans listbox1"
    End Sub
    Private Sub CommandButton1_Click()
      agir "ajout"
    End Sub
     
    Private Sub CommandButton2_Click()
      agir "suppression"
    End Sub
     
    Private Sub agir(faire As String)
      For i = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(i) = True Then
          ListBox2.ListIndex = -1
          On Error Resume Next
          ListBox2.Text = ListBox1.List(i)
          Select Case faire
            Case "ajout"
              If ListBox2.ListIndex = -1 Then ListBox2.AddItem ListBox1.List(i)
            Case "suppression"
             If ListBox2.ListIndex > -1 Then ListBox2.RemoveItem ListBox2.ListIndex
          End Select
        End If
        On Error Resume Next
      Next
    End Sub
    sélectionne des items dans la listbox1 et regarde ce qui se passe dans la listbox2 en "ajoutant" ou en "supprimant".

  10. #10
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    Bonjour à tous,

    Je me permets de réagir au post #7 de Patrick.
    Afin d'assurer la subsistance des instances de classe créées, il utilise une classe imbriquée (nested class) avec un tableau prédimensionné.
    Bien que cette solution soit fonctionnelle, elle ne facilite pas la gestion de la mémoire, en particulier pour la destruction des instances créées.

    Il est généralement conseillé d'utiliser une collection, définie comme variable globale dans le module UserForm concerné, tel que décrit dans ce post (ce n'est qu'un exemple, il en existe des dizaines sur le net).

    J'insiste sur le fait que ma remarque est avant tout cosmétique, le code proposé étant fonctionnel.

    Cordialement

  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
    oui ben en ce qui concerne la mémoire
    j'aurais pu utiliser un redim preserve pour n'instancié que les sub classe nécessaires( fainéantise )

    pour les doublons il ne peut y avoir qu'une seule raison certains des togglebuttons ont la même caption autrement c'est impossible

    puisque la base du concept est le nom(captions et boucle sur j selon l'etat true/false du togglebutton

    je ne rappelle plus si j'ai mis un exit for dans la boucle "J" au quel cas l'enlever ,cela devrait supprimer toutes les occurrences du même mot(caption)
    EDIT:
    voir agrémenter la condition true sur le togglebutton d'un test de présence de l'item dans la liste
    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
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Par défaut
    @ unparia: woaow! joli! ça ouvre des perspectives supplémentaires...

    @ Ben_L: on ne pale plus le même langage : j'ai eu besoin de réverso pour traduire "instances de classe" et "classe imbriquée (nested class) "...

    @ patricktoulon : effectivement, en supprimant exit for, la suppression agit sur tous les items identiques, je ne me soucie plus des doublons pour le moment!

  13. #13
    Membre émérite
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Par défaut
    A toutes fins utiles, voici un lien vers un très bon tutoriel sur la programmation objet en VBA, rédigé par Pierre Fauconnier.

    Bonne fin de semaine à tous

  14. #14
    Membre éclairé
    Homme Profil pro
    autre
    Inscrit en
    Juin 2017
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Juin 2017
    Messages : 261
    Par défaut Dernière ligne droite
    Ma Listbox 2 s'emplit enfin des noms de secteurs d'activités, modifiable via mes ToggleButtons.

    Je souhaite afficher les risques professionnels de chacune de ces activités dans ma ListBox1 (sans doublons).

    Je dispose d'une formule fonctionnelle dans un autre USF qui, à partir de la sélection d'une Combobox, alimente une listBox identique. (codes proposés par JacquesBoisgonthier et Ben_L).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub ComboBox1_Click()
        Dim F As Worksheet, bd As Variant, i As Integer, temp As Variant
        Me.TextBox1.Value = Me.ComboBox1.Text
        Me.ListBox1.Clear
        Set F = Sheets(Me.TextBox1.Text)
        bd = F.Range("F9:J" & F.[F65000].End(xlUp).Row).Value2  ' tableau bd(n,1) pour rapidité
        For i = LBound(bd) To UBound(bd)
            If bd(i, 1) <> "" Then Call AddArrayElm(temp, Array(bd(i, 1), bd(i, 3), bd(i, 4), bd(i, 5)))
        Next i
     
        Me.ListBox1.ColumnCount = 4
        Me.ListBox1.List = Application.Transpose(temp)
    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
    Private Sub AddArrayElm(Arr As Variant, Elm As Variant)
        Dim i As Long, nRow As Long, nCol As Long
        nCol = UBound(Elm)
        If Not IsArray(Arr) Then
            nRow = 0
            ReDim Arr(nCol, nRow)
        Else
            nRow = UBound(Arr, 2) + 1
            For i = 0 To nRow - 1
                If Elm(0) = Arr(0, i) Then Exit Sub
            Next i
            ReDim Preserve Arr(nCol, nRow)
        End If
        For i = 0 To nCol
            Arr(i, nRow) = Elm(i)
        Next i
    End Sub
    Comment adapter ce code pour que de sélection d'un unique item de Combobox1, je puisse passer à chaque item d'une ListBox2?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Listbox suppression d'item
    Par logue_in dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/04/2016, 21h02
  2. Suppression d'item dans une ListView via des CheckBox (Type boite mail)
    Par Berlo56 dans le forum Composants graphiques
    Réponses: 2
    Dernier message: 27/03/2014, 09h40
  3. [listbox] Suppression d'item
    Par jontleman dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/11/2007, 00h19
  4. Sélection d'un item d'un listbox via une valeur
    Par Filipegomes dans le forum C#
    Réponses: 10
    Dernier message: 31/10/2007, 13h50
  5. Recuper les items de ListBox d'une autre application [API?]
    Par Shamanisator dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 27/09/2002, 12h32

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