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 :

Comment stocker des objets dans une ListBox vba et les récupérer lorsque nous cliquons dessus?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Par défaut Comment stocker des objets dans une ListBox vba et les récupérer lorsque nous cliquons dessus?
    J'ai fait une méthode qui prend un tableau d'objet global `arrayOReservists`, qui représente des gens, et qui affiche ses objets, c'est à dire chaque personne, dans une ListBox.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                ' On remplit la ListBox des résultats avec les noms et prénoms des personnels
                ListBoxResults.AddItem (arrayOReservists(i).Surname & " " & arrayOReservists(i).Name)
                ' On redimensionne le tableau
                i = i + 1
    Une autre méthode, `ListBoxResults_DblClick`, réagit lorsque je double-clique sur l'une des lignes de la ListBox. Elle affiche une UserForm à laquelle j'aimerais transmettre l'objet sur lequel j'ai cliqué. Cependant je ne sais pas comment y avoir accès à cet objet. J'ai l'impression que les données transmises à la ListBox par AddItem sont transformées en texte.

    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
        Private Sub ListBoxResults_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
            Dim Msg As String
            Dim i As Integer
            Dim newInstanceOfMe As Object
     
            ' On cherche le nom et le prénom du réserviste sur lequel on a cliqué
            For i = 0 To ListBoxResults.ListCount - 1
                If ListBoxResults.Selected(i) Then
                    ReservistName = ListBoxResults.List(i)
                End If
            Next i
     
            ' Prise en compte du cas où l'on clique sur la TextBox Results alors que celle-ci est vide
            If False Then
                If ReservistName <> "" Then
                    Set newInstanceOfMe = UserForms.Add(Me.Name)          
                    newInstanceOfMe.Caption = ReservistName
                    newInstanceOfMe.Show
                    Unload newInstanceOfMe
                    Set newInstanceOfMe = Nothing
                End If
            End If
            ' passer le nom, le prénom à ReservistUserForm et dans le Load qui filtrer la liste à partir de ces champs en obtenant l'objet oReservist.
            ' Una vez tengas la informacion de ese usuario lo siguiente sera mapear la informacion a los textBox correspondientes.
            ReservistFormUserForm.Caption = ReservistName
            ReservistFormUserForm.Show
     
        End Sub
    En effet quand j'affiche `MsgBox (ListBoxResults.List(i))` j'ai uniquement le nom et le prénom et non pas l'objet.

    Par conséquent comment stocker des objets dans une ListBox vba et les récupérer lorsque nous cliquons dessus ? Cela me permettrait, par exemple, de les mettre dans une variable globale à laquelle j'aurais accès dans l'objet UserForm.

    Annexe
    Voici l'interface avec la ListBox si cela est plus parlant:

    Nom : B5uzH.png
Affichages : 816
Taille : 44,8 Ko

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    On ne peut pas stocker des objets dans un ListBox, mais uniquement des valeurs.
    Utilises une Collection pour stocker les objets et mets la liste des clés dans le ListBox.

  3. #3
    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,

    Je ne suis pas sûr d'avoir compris.
    Voici un exemple de ListBox avec récupération d'une ligne de ListBox pour alimenter les zones d'un formulaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub ListBox1_Click()
      For i = 1 To NbCol
        tmp = Me.ListBox1.Column(i - 1)
        If Not IsError(tmp) Then Me("textbox" & i) = tmp
      Next i
      Me.Enreg = Me.ListBox1.Column(NbCol)
    End Sub
    Boisgontier
    Fichiers attachés Fichiers attachés

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    En me tenant à l'intitulé de ta question, je pars sur l'idée de Patrice d'utiliser une collection de laquelle on extrait un élément en fonction du listindex de la listbox (attention, commence à 0 pour le premier élément).

    Nom : 2019-06-19_212125.png
Affichages : 676
Taille : 4,0 Ko

    Pour l'exemple, j'ai créé une classe Contact contenant deux propriétés autoimplémentées et une en lecture seule qui recompose le nom complet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Option Explicit
     
    Public FirstName As String
    Public LastName As String
     
    Property Get LongName() As String
      LongName = FirstName & " " & LastName
    End Property
    • On munit un userform usfContacts d'une propriété Contacts As Collection;
    • Avant d'afficher le userform, on passe à cette collection la collection des contacts que l'on veut gérer;
    • A l'activation, on lit les longName de la collection pour alimenter la listbox;
    • Au clic sur un item de la listbox, on alimente les textbox via une procédure dédiée;
    • Au clic sur Enregistrer, on met le contact à jour dans la collection et on rafraichit la listbox, à nouveau via une procédure dédiée;
    • Au clic dur Quitter, on masque le userform et on récupère la collection des contacts mis à jour.



    Voici le code du userform, qui se lit facilement. On voit que les événements appellent les procédures dédiées et ne traitent pas eux-mêmes l'information.
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Option Explicit
     
    Public Choice As String
    Private mContacts As Collection
     
    Property Get Contacts() As Collection
      Set Contacts = mContacts
    End Property
     
    Property Let Contacts(Contacts As Collection)
      Set mContacts = Contacts
    End Property
     
    Private Sub btnQuit_Click()
      Me.Hide
    End Sub
     
    Private Sub btnSave_Click()
      SaveContact
    End Sub
     
    Private Sub lboContacts_Click()
      PrepareContact
    End Sub
     
    Private Sub UserForm_Activate()
      AddContactsToList
    End Sub
     
    Sub AddContactsToList()
      Dim s As String
      Dim c As Contact
     
      For Each c In mContacts
        lboContacts.AddItem c.LongName
      Next
    End Sub
     
    Sub PrepareContact()
      With mContacts(lboContacts.ListIndex + 1)
        tboFirstName.Value = .FirstName
        tboLastName.Value = .LastName
      End With
    End Sub
     
    Sub SaveContact()
      With mContacts(lboContacts.ListIndex + 1)
        .FirstName = tboFirstName.Value
        .LastName = tboLastName.Value
      End With
      lboContacts.List(lboContacts.ListIndex) = mContacts(lboContacts.ListIndex + 1).LongName
    End Sub
    Voici un exemple d'utilisation de ce userform, qui charge une collection de contacts, puis la passe à une procédure qui la reçoit en ByRef, de sorte que la procédure appelante peut l'exploiter, ici dans l'exemple pour afficher les valeurs dans la fenêtre d'exécution (Ctrl+G)

    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
    Option Explicit
     
    Sub Test()
      Dim Contact As New Contact
      Dim Contacts As New Collection
     
      Contact.FirstName = "Alain"
      Contact.LastName = "Térieur"
      Contacts.Add Contact
      Set Contact = New Contact
      Contact.FirstName = "Jean"
      Contact.LastName = "Aymar"
      Contacts.Add Contact
      GetAndUpdateContacts Contacts
      For Each Contact In Contacts
        Debug.Print Contact.LongName
      Next
    End Sub
     
    Sub GetAndUpdateContacts(ByRef Contacts As Collection)
      With usfContacts
        .Contacts = Contacts
        .Show
        Set Contacts = .Contacts
      End With
      Unload usfContacts
    End Sub
    Fichiers attachés Fichiers attachés
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. Comment stocker des objets dans une StringGrid
    Par franckcl dans le forum Composants FMX
    Réponses: 5
    Dernier message: 24/12/2016, 10h02
  2. [PHP 5.0] Stocker des objets dans une collection
    Par kaljerhom dans le forum Langage
    Réponses: 3
    Dernier message: 10/04/2009, 21h38
  3. Réponses: 3
    Dernier message: 25/01/2009, 17h32
  4. Comment Manipuler des objets dans une liste de type TList ?
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 1
    Dernier message: 02/11/2006, 15h40
  5. Comment stocker des images dans une base de données ?
    Par [Silk] dans le forum Bases de données
    Réponses: 4
    Dernier message: 21/07/2005, 11h29

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