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 à la souris dans une listbox multicolonne [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    -
    Inscrit en
    Juillet 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : -

    Informations forums :
    Inscription : Juillet 2014
    Messages : 45
    Par défaut Sélection à la souris dans une listbox multicolonne
    Bonjour,

    Je me permets d'ouvrir un sujet car je n'ai pas réussi à trouver de réponse à ma question (que ce soit sur des forums en français ou en anglais), qui m'a l'air vraiment toute simple :

    Contexte :

    Un userform comporte une listbox multicolonnes (qui est remplie l'initialisation à partir des données d'une feuille de calcul), pour que la liste apparaisse sans qu'il soit nécessaire de scroller sur la fenêtre.

    Lorsque que je veux sélectionner une valeur dans une colonne, c'est toute la ligne qui est sélectionnée, et pas la valeur sur laquelle j'ai cliqué. Ca va sans dire, mais ça va mieux en le disant, les valeurs à sélectionner sont indifféremment dans la première ou la seconde colonne.


    Question :

    Est il possible de sélectionner une seule valeur dans une listbox multicolonne ? Et si oui, quelle est la marche à suivre.


    Merci de votre aide sur le sujet.


    Jodko.

    [edit pour correction d'orthographe]

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Bonjour à toi,

    Tu peux assez facilement déterminer sur quel colonne tu as cliqué, essaye ça :
    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
    Dim col
     
    Private Sub ListBox1_Change()
        If col = -1 Then Exit Sub
        Label1.Caption = ListBox1.List(ListBox1.ListIndex, col)
    End Sub
     
    Private Sub ListBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        Dim cols
        Dim tmp
        cols = Split(Replace(ListBox1.ColumnWidths, " pt", ""), ";")
        For I = 0 To UBound(cols)
            tmp = tmp + cols(I)
            If X <= tmp Then
                col = I
                Exit Sub
            End If
        Next
        col = -1
    End Sub
    Donc tu stock la colonne dans une variable global de l'USF et dans le listbox change tu connais la colonne

    Par contre au niveau affichage je ne pense pas que l'on puisse faire en sorte que la couleur de selection n'apparaisse que sur une cellule.

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

    - Ton code ne pourra fonctionner si tu ne déclares pas explicitement le type de tmp : integer ou (mieux) single
    - Il ne fonctionnera pas non plus si la propriété columnwidths est à vide
    - la largeur totale de la listbox doit impérativement être égale ou supérieure à la somme des largeurs des colonnes

    Plutôt que cette boucle, il est préférable d'utiliser un select case (directement) sur les valeurs d'un array tablo , initiialisé à l'ouverture de l'userform et contenant les abscisse de gauche de chaque "séparation". Le select case est alors à faire de la première séparation à la dernière (et seul le 1er cas sera ainsi retenu si la condition est toujours < que ...). L'intérêt est double : pas de boucle à chaque fois et plus de nécessité de passer par l'évènement change.

    Il va enfin falloir prévoir (donc expression conditionnelle) l'absence de données dans la propriété columnwidths. L'array tablo est alors à initialiser différemment (chaque colonne a une largeur égale à la division de la largeur totale par le nombre de colonne)

    Existe une autre méthode, plus précise et moins contraignante, notamment en ce qui concerne la largeur de la listbox, , mais sa complexité est sans commune mesure avec le gain obtenu. Elle fait appel à plusieurs fonctions de l'Api de Windows. Elle nécessite en plus l'extraction (pas simple du tout pour une listbox de VBA) du handle (hwnd) de la listbox

  4. #4
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Encore une fois @unparia beaucoup de blabla et pas de code.....
    Mon code est un simple exemple, sans garde fou, le but étant juste de montrer que c'est possible !

    Je t'invite à mettre un code complet pour gérer correctement ce que tu indique après tu pourra venir critiquer sans problèmes !

    il est préférable d'utiliser un select case
    Je suis très curieux de voir ça !
    Comment sans boucle et avec ton select case tu gère quelques soit le nombre de colonnes ?

    Ah oui j'oubliais aussi, que pour ton infirmation le ListBox1.ListIndex n'est à jour que dans l'event Change ou mouseup.....
    Et que dans le mousedown il ne l'est pas encore......

  5. #5
    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
    @cerede2000
    Il n'y a pas que le mous_dows. Au mouse_up, on l'a, ce listindex.
    Pour le reste, il me semble avoir dit tout ce qu'il suffisait de dire à un développeur.
    Si tu n'y parviens pas avec cela, alors dis-le et je te l'écrirai, ce code tout bête.

  6. #6
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Ce n'est pas moi qui cherche comment faire......
    Si j'en ai besoin je prendrai le temps nécessaire.
    Je le rappel c'est un exemple de départ !

    Si tu sais bien lire j'ai écris qu'en effet sur le mouseup on l'as, mais je ne suis pas pour utiliser cet event car en cas de glissement de ligne malencontreux et bien c'est pourrit !

    La seul chose dans ce que tu as écris (comme tu semble ne savoir faire que ça !) qui me pose grandement question c'est comment tu gère un nombre inconnu de colonnes avec une Select Case.......
    Alors vas y montre nous, apporte nous ton savoir (que tu vante tant) pour une fois !

  7. #7
    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
    Désolé pour toi, cerede2000, mais :
    1) je suis ici sur un forum de développeurs
    2) ce que j'ai dit suffit à tout développeur
    3) je n'ai aucun compte à te rendre
    4) de manière générale : tu me verras toujours, sur un forum de développeur, ne servir du code qu'après explications normalement suffisantes et si, malgré ses explications, le demandeur ne s'en sort toujours pas. C'est chez moi un principe fondamental.
    5) si le demandeur déclare être débutant, est intéressé par ce que j'ai exposé et le souhaite, lui, c'est à lui que je montrerai ce code simple.

  8. #8
    Membre averti
    Homme Profil pro
    -
    Inscrit en
    Juillet 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : -

    Informations forums :
    Inscription : Juillet 2014
    Messages : 45
    Par défaut
    Bonjour bonjour,

    Finalement, je me rends compte qu'il n'y a pas "d'option" type "choix multiples" à activer.

    N'étant pas un développeur, mais un user lambda qui essaie de se faciliter la vie en bidouillant en VBA des outils basiques, je n'ai absolument aucune idée des concepts que vous manipulez.

    Du coup, malgré une lecture et relecture attentive de votre discussion, je n'ai pas vraiment saisi comment me servir de l'exemple de code qui m'a été donné, même si j'ai l'impression d'en saisir l'idée, et encore moins du reste.

    Je pense m'orienter vers 3 listbox que je remplirai au fur et à mesure et dont je récupérerai les info sélectionnées de la même manière.

    En tout cas, merci de votre aide.


    Jodko.

  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 Jodko

    Cet exemple devrait te faire comprendre pas mal de choses.
    Sur un userform tout neuf, une listbox nommée listbox1 et ce code bâclé à toute allure, mais efficace.

    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
    Dim tabl
     
    Private Sub UserForm_Initialize()
      ListBox1.ColumnCount = 5
      'ListBox1.ColumnWidths = "50;50;50;50;50" '===>> commente ou décommente
      For i = 0 To 20
        ListBox1.AddItem i
        For j = 1 To ListBox1.ColumnCount - 1
          ListBox1.List(i, j) = i & "-" & j
        Next
      Next
      eclat ListBox1, tabl
    End Sub
     
    Private Sub ListBox1_Mouseup(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single)
        For i = 0 To UBound(tabl)
          If x < tabl(i) Then Exit For
        Next
        MsgBox "tu as cliqué sur la colonne " & i & " de la ligne " & ListBox1.ListIndex
    End Sub
     
    Private Sub eclat(LB As MSForms.ListBox, tabl)
      With LB
         nb = .ColumnCount
         Select Case .ColumnWidths
           Case ""
              For i = 1 To nb
                 toto = toto & ";" & .Width / nb * i
              Next
              toto = Mid(toto, 2)
         Case Else
              toto = Replace(.ColumnWidths, " pt", "")
         End Select
        tabl = Split(toto, ";")
       End With
    End Sub
    Je suis passé par une boucle dans l'évènement MouseUp uniquement pour montrer qu'on pouvait s'en sortir même sans (cas plus que surprenant, mais bon ...) connaître le nombre de colonnes (ce que le développeur connaît par construction !)
    Mais même dans un tel cas :
    - seule la boucle est là (pas les calculs qui, eux, ont été faits d'emblée une fois pour toutes
    - fonctionne que la largeur des colonnes soit définie en création, ou dynamiquement, ou pas du tout

    Seule obligation : la largeur totale de la listbox doit être supérieure ou égale à la somme des largeurs de colonnes.
    Voilà.

  10. #10
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Je suis passé par une boucle dans l'évènement MouseUp uniquement pour montrer qu'on pouvait s'en sortir même sans (cas plus que surprenant, mais bon ...) connaître le nombre de colonnes (ce que le développeur connaît par construction !)
    Mais bien sur..................


    Le select case est alors à faire de la première séparation à la dernière (et seul le 1er cas sera ainsi retenu si la condition est toujours < que ...). L'intérêt est double : pas de boucle à chaque fois et plus de nécessité de passer par l'évènement change
    Et il est ou ton select case pour les colonnes hein ?
    Tiens pouf envolé !!!!!!!!!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To nb
                 toto = toto & ";" & .Width / nb * i
              Next
    Application.Rept serais bien plus judicieux.......

  11. #11
    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
    @cerede2000
    Tu devrais prendre le temps de lire.
    Je ne suis passé par une boucle que pour ton cas "nb de colonnes indéterminées", cas bien étrange car le développeur le connait forcément, ce nombre.
    Même ainsi, cette boucle ne recalcule pas tout à chaque clic
    Ce code fonctionne, lui, y compris si la propriété columnwidths est restée à ""
    Voilà

    EDIT :
    Application.Rept serais bien plus judicieux.......
    Ah bon ?
    Je vois que tu as "analysé", tiens ...
    Surprenant !

  12. #12
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Désolé mais pour moi un code correcte est un code qui est adapté à l’évolution.....
    C'est sur que si tu fait tout en fixe alors la c'est super simple..... Et puis quand on viens te voir pour rajouter des colonnes t'est obligé de modifier le code super !
    Moi je n'ai pas appris à travailler comme ça.
    Je pars dès le début au maximums d’éventualités, car je connais très bien le retour des utilisateurs qui vont venir demander autre chose.

    Après chacun fait comme il veut !

  13. #13
    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
    Qu'est-ce-que tu racontes là, cerede2000 ?
    Ce code se prête au contraire parfaitement à toute évolution !
    La partie fixe de mon exemple n'était là que pour en donner un, d'exemple (de la matière).
    Tu m'inquiètes vraiment, de plus en plus, tiens ...

  14. #14
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Faut que t'arrête de te contredire parce que ça devient ridicule !
    Je ne suis passé par une boucle que pour ton cas "nb de colonnes indéterminées", cas bien étrange car le développeur le connait forcément, ce nombre
    Donc au départ tu aurait fais un code qui n'était pas du tout évolutif mais bon.....

  15. #15
    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
    Rhôôôô ...
    Je sais que nous sommes en fin de semaine, mais quand-même ! ..
    Allez . J'ai des choses bien plus sérieuses à faire ...

  16. #16
    Membre averti
    Homme Profil pro
    -
    Inscrit en
    Juillet 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : -

    Informations forums :
    Inscription : Juillet 2014
    Messages : 45
    Par défaut
    De mon côté, je suis passé par des listbox multiple, ce qui m'a permis de terminer ce que j'avais à faire.

    Si j'ai le temps de reprendre le travail, je regarderai vos proposition de plus près.

    Merci encore.


    Jodko.

  17. #17
    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 heu
    bonjour

    au remplissage de ta liste box tu memo les columnwidth dans un e variable tableau

    au au mouse down sur la listbox tu boucle sur les width( dans ton tableau en additionnant les valeurs, tu t'arrête quand l'adition et plus grand que le x de la souris

    l'item ou s'a c'est arrêté tu lui enlève 1 . tu a ta colonne

    ce sera donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listbox.list (listbox.listindex, ton item trouvé)
    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

  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
    c'est pas possible un mec pareil !!!! -1 sans proposer quoi que se soit
    ca fait rien continu ca ne fait qu'aggraver ton cas quand on aura assez d'élément on pourra faire le ménage dans les membres
    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

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

Discussions similaires

  1. Inserer un "dico" dans une listbox multicolonne
    Par Alange_44 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/04/2016, 14h36
  2. [AC-2002] supprimer un element dans une listbox Multicolonne
    Par kkaba dans le forum IHM
    Réponses: 4
    Dernier message: 07/06/2011, 12h57
  3. [XL-2007] deroulement souris dans une listbox
    Par chris09300 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 21/02/2011, 22h06
  4. Activer la molette de la souris dans une listbox
    Par morgan47 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/08/2007, 12h34
  5. Réponses: 4
    Dernier message: 21/07/2006, 14h53

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