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 :

listbox multi-colonnes & multiselect - Récupération données


Sujet :

Macros et VBA Excel

Vue hybride

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

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

    Informations forums :
    Inscription : Juin 2014
    Messages : 23
    Par défaut listbox multi-colonnes & multiselect - Récupération données
    Bonjour,

    j'ai une listbox multi-colonnes et multiselect pour laquelle j'aimerai récupérer les données dans une même cellule, en séparant seulement les infos de chaque colonne par une virgule ou un tiret "-" si possible.

    J'ai réussi à récupérer les éléments de ma sélection multiple pour la 1e colonne seulement dans une même cellule, mais pas pour la 2nd colonne.

    Comment faire ?

    Merci

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 153
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Voici une fonction à placer dans le module du formulaire (UserForm) où se trouve le contrôle ListBox.
    Seul l'argument objListBox est obligatoire. Voir les explications qui se trouvent en tête de fonction.

    Procédure
    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
    Function TextSelected(objListBox As Control, Optional ColumnNumber As Byte = 0, Optional Separator As String = ";") As String
     ' Fonction renvoyant une chaîne de caractères contenant tous les éléments sélectionnés
     '          dans le listBox nommé lstBox de la colonne désignée par l'argument ColumnNumber
     '          La première colonne est 0
     '          Chaque élément est séparé par le caractère définit par l'arguement Separator
     ' Syntaxes possibles
     ' 1) msgbox TextSelected ListBox1
     ' 2) msgbox TextSelected ListBox1, 2
     ' 3) msgbox TextSelected ListBox1, 2, "-"
     ' Arguments
     ' objListBox  Objet ListBox
     ' [ColumnNumber] : N° de la colonne dont on doit renvoyer les éléments sélectionnés
     ' [Seprator] : Caractère de séparation
     Dim Elem As Byte
     If TypeName(objListBox) <> "ListBox" Then
      MsgBox "L'argument objLstBox (" & objListBox.Name & ") n'est pas un ListBox": Exit Function
     End If
     With objListBox
      If ColumnNumber >= .ColumnCount Then MsgBox "N° de colonne erroné": Exit Function
      If .ListCount = 0 Then Exit Function
      For Elem = 0 To .ListCount - 1
       If .Selected(Elem) = True Then ' Teste si la ligne du ListBox a été sélectionnée
        TextSelected = TextSelected & .List(Elem, ColumnNumber) & Separator
       End If
      Next
     End With
     If Len(TextSelected) Then TextSelected = Left(TextSelected, Len(TextSelected) - 1)
    End Function
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre averti
    Femme Profil pro
    Doctorant
    Inscrit en
    Juin 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2014
    Messages : 23
    Par défaut
    Bonjour,

    merci pour la réponse.

    J'ai placé la fonction dans le module de l'userform concerné, en revanche, je n'arrive pas à appeler la fonction pour qu'elle s'exécute dans la bonne cellule quand j'appuie sur le bouton valider.

    Comment faut-il faire ?

    Merci
    Bonne journée,

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 153
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La fonction doit être invoquée par exemple depuis une procédure événementielle d'un CommandButton

    Exemple d'une procédure qui écrit la valeur renvoyée par la fonction dans la cellule I11 de la feuille nommée [db]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub cmdWriteMultiSelection_Click()
      ThisWorkbook.Worksheets("db").Range("I11") = TextSelected(Me.lstBox, 2, "-")
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre averti
    Femme Profil pro
    Doctorant
    Inscrit en
    Juin 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2014
    Messages : 23
    Par défaut
    Merci pour la rapidité de la réponse.

    Alors j'ai écrit comme code ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     TextSelected(Me.lstBox, 0, "-")
    et je n'ai eu que la première colonne, ensuite j'ai essayé plusieurs combinaisons différentes mais je n'ai pas réussi à avoir les 2 colonnes.

    Comment faut-il faire pour récupérer les 2 colonnes et séparer les éléments entre la 1e la 2e colonne par un "-" et les éléments entre chaque ligne par un "|" ?

    Merci

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 153
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Oui et bien ce n'est pas ce que j'ai compris de la question.
    La fonction que j'ai écrite renvoie la colonne précisée dans l'argument ColumnNumber de toutes les lignes sélectionnées dans la liste en séparant les éléments par la chaîne passée à l'argument Separator
    Ces deux arguments ont chacun une valeur par défaut 0 pour ColumnNumber et ";" pour Separator
    C'est ce qu'il me semble avoir mis dans les commentaires de la fonction. Ou bien je ne m'exprime pas correctement
    ' Fonction renvoyant une chaîne de caractères contenant tous les éléments sélectionnés
    ' dans le listBox nommé lstBox de la colonne désignée par l'argument ColumnNumber
    ' La première colonne est 0
    ' Chaque élément est séparé par le caractère définit par l'arguement Separator
    Mais il me semble que sii tu analyse comment la fonction est écrite, tu pourras te débrouiller pour faire une fonction qui renvoie toutes les colonnes de la ligne sélectionnée. Cependant je me pose la question de savoir ce qui se passe s'il y a plusieurs sélections.
    Moi en tout les cas, je n'ai plus le temps pour l'instant.

    Bonjour,
    Finalement, j'ai eu 30 minutes de bon
    Voilà une autre fonction qui renvoie un tableau de 1 ou plusieurs lignes suivant le nombre de sélection et caque ligne comprenant une chaîne de caractères de toutes les colonnes de la ligne

    Pas le temps de commenter la fonction et le test a été rapide doncje ne garanti pas le "Bug Free"
    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
    Function TextSelectedColumns(objListBox As Control, Optional Separator As String = ";") As Variant
     ' Limite de la fonction
     ' Maximum de colonnes et lignes sélectionnée 256
     Dim Tablo(), ColumnNumber As Byte, elem As Byte, Ind As Byte
     If TypeName(objListBox) <> "ListBox" Then
      MsgBox "L'argument objLstBox (" & objListBox.Name & ") n'est pas un ListBox": Exit Function
     End If
     With objListBox
      For elem = 0 To .ListCount - 1
       If .Selected(elem) = True Then ' Teste si la ligne du ListBox a été sélectionnée
        ReDim Preserve Tablo(Ind)
        For ColumnNumber = 0 To .ColumnCount - 1
         Tablo(Ind) = Tablo(Ind) & .List(elem, ColumnNumber) & Separator
        Next ColumnNumber
        Tablo(Ind) = Left(Tablo(Ind), Len(Tablo(Ind)) - 1): Ind = Ind + 1
       End If
      Next elem
     End With
     TextSelectedColumns = Tablo
    End Function

    Exemple d'appel de la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub cmdWriteMultiSelection_Click()
     Dim Tablo(), elem As Byte
     Tablo = TextSelectedColumns(Me.lstBox, "-")
     If UBound(Tablo) Then
       For elem = 0 To UBound(Tablo)
        MsgBox Tablo(elem)
       Next
      Else
       MsgBox "Aucun élément sélectionné"
     End If
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

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

Discussions similaires

  1. ListBox multi colonne
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/05/2012, 10h15
  2. ListBox Multi Colonnes
    Par Hiraa dans le forum VB.NET
    Réponses: 3
    Dernier message: 05/03/2010, 07h36
  3. Insertion données dans Listbox multi colonnes
    Par jrevert dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 20/08/2009, 16h38
  4. Listbox multi colonne
    Par soso78 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 12/12/2007, 10h48
  5. [VB6] comment saisir l'entête Listbox (multi colonnes)
    Par oumarsaw dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 07/04/2006, 16h21

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