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 :

[XL-2010]Manipulation de liste déroulante


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut
    Bonjour,
    voici mon problème, j'ai créé un formulaire avec une liste déroulante (qui prend sa source depuis un fichier excel). J'aimerai que lorsque l'on click sur un bouton, un label soit créé dans mon formulaire avec comme texte la valeur que l'utilisateur a choisis dans la liste déroulante (ou plus simplement je pense une seconde liste déroulante avec toutes les valeurs sélectionnées).
    Ni arrivant pas, j'ai actuellement stocker dans un tableau toutes les valeurs que l'utilisateur à choisis dans la liste déroulante afin de créer une boucle plus facilement en ayant des variables dynamiques.



    Voici mon 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
    Dim i1 As Long
    Dim i As Integer, j As Integer
    Dim Tableau() As String
    Option Explicit
     
    Private Sub bt_ajouter_Click()
     
        If i1 = 0 Then
     
            'Définit le type de données pour le tableau.
            'Dim i As Integer, j As Integer
     
            'Définit la taille du tableau
            i = 30
            ReDim Tableau(i)
     
            'Alimente les éléments du tableau
            j = 0
            Tableau(j) = Me.zl_article.Value
            j = j + 1
     
            'Boucle sur les éléments du tableau
            For j = 0 To i1
                MsgBox Tableau(j)
            Next j
            i1 = i1 + 1
        Else:
            Tableau(j) = Me.zl_article.Value
            j = j + 1
     
            'Boucle sur les éléments du tableau
            For j = 0 To i1
                MsgBox Tableau(j)
            Next j
            i1 = i1 + 1
        End If
    End Sub
    Donc est-il possible de masquer dans la liste déroulante les valeurs qui ont déjà été sélectionnées, sans les supprimer du fichiers excel ?
    Et de créer une liste déroulante ou des labels à partir des valeurs contenues dans un tableau ?

    Merci de votre aide !

    Personne ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 473
    Points : 493
    Points
    493
    Par défaut
    Bonjour sasafca,

    Ds mon modèle un userform et 2 listbox, mais tu dois pouvoir modifier par des combobox! Bien que dans ce cas 2 listbox doivent être préférables!

    Donc voici:

    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
     
    Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    If Listbox1 = "" Then Exit Sub
    '*******
     
     
    'ListBox2.AddItem 'ajout d'une ligne
    'ListBox2.List(ListBox2.ListCount - 1, 0) = ListBox1.Text
    ListBox2.AddItem Listbox1
    On Error GoTo fin1
    If Listbox1.List(Listbox1.ListIndex, 0) <> "" Then
     
    Listbox1.List(Listbox1.ListIndex, 0) = ""
    Listbox1.RemoveItem Listbox1.ListIndex
     
    End If
     
    fin1:
    End Sub
     
     
     
    Private Sub ListBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    If ListBox2 = "" Then Exit Sub
    '*******
     
    'ListBox1.AddItem 'ajout d'une ligne
    'ListBox1.List(ListBox1.ListCount - 1, 0) = ListBox2.Text
    Listbox1.AddItem ListBox2
    On Error GoTo fin1
    If ListBox2.List(ListBox2.ListIndex, 0) <> "" Then
     
    ListBox2.List(ListBox2.ListIndex, 0) = ""
    ListBox2.RemoveItem ListBox2.ListIndex
     
    End If
     
    fin1:
    End Sub
     
     
    Private Sub UserForm_Initialize()
     ' charge ta listbox1 sans doublon sur feuil1 colonne a
    Dim MonDico As Object, Cellule As Range
     
      Set MonDico = CreateObject("Scripting.Dictionary")
          For Each Cellule In Sheets("feuil1").Range("a2:a60000")
          If Not MonDico.Exists(Cellule.Value) Then MonDico.Add Cellule.Value, Cellule.Value
          Next Cellule
            Listbox1.List = MonDico.Items
            MonDico.RemoveAll
    End Sub
    donc il est possible de faire passer par dblclick d'une listbox à l'autre !

    Cordialement,

  3. #3
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut
    Bonjour jijie,

    merci pour ta réponse, cependant je viens de la tester et elle ne fonctionne pas. Lorsque je double clique sur la liste1 pour ajouter un item dans l'autre liste, un message d'erreur apparait:

    Erreur d'éxecution '-2147352571 (80020005)':
    Type mismatch

    sur la ligne quand je débogue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ListBox2.AddItem ListBox1
    j'ai essayé ListBox1.value mais ça fait pareil...

    Comment régler ce petit problème ?

    Merci

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 473
    Points : 493
    Points
    493
    Par défaut
    et la :

  5. #5
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut
    C'est bien mieux merci beaucoup !!

    Juste par curiosité, si j'aurai voulu mettre deux colonnes associées comment aurai-je pu faire ?

    Exemple parce que je ne sais pas si j'ai été clair:

    Colonne A Colonne B
    Fraise 2€
    Banane 1€


    et dans la liste on aurait:
    Fraise - 2€
    Banane - 1€

    Car j'ai testé et avec le code actuel ça fait:
    Fraise
    2€
    Banane
    1€

    Et lorsqu'un double clique on a une erreur sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListBox2.AddItem ListBox1.Value
    Le type ne correspond pas


    Encore merci jijie !!

  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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut heu
    bonjour

    jijie
    1° il serait plus interessant de boucler sur un tablo plutot que les cellulespar rapport au nombre important de ligne (rapidité)
    2° il n'est pas necessaire de tester l'existance le dictionnaire le fait tout seul(n'accepte pas les doublons )
    3° plutot que de boucler jusqua la ligne 6000 on s'arretera a la derniere utilisée pas la peine de descendre tout en bas si c'est vide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub UserForm_Initialize()
     ' charge ta listbox1 sans doublon sur feuil1 colonne a
    dim MonDico As Object, Cellule As Range
     with Sheets("feuil1")
    Set MonDico= CreateObject("Scripting.Dictionary")
            tablo = .Range("A2:C" & .Range("A" & Rows.Count).End(xlUp).Row).Value
            For Each elem In tablo
                MonDico.Item(elem) = ""
            Next elem
           Listbox1.List = MonDico.keys 'ou  MonDico.Items 'comme tu veux 
        End With
    set mondico=nothing'on vide pas le dico on vide la variable tout court 
    end sub
    au plaisir

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 473
    Points : 493
    Points
    493
    Par défaut
    Slt Patrick

    Tjrs la!!!

    oui tu as raison ! effectivement!

    Mais comment tu fait pour avoir la colonne B en colonne 2 de la listbox car moi je ne trouve pas !?

    jijie

  8. #8
    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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Bonjour jijie
    alors voila un exemple qui me liste les mots de la colonne A sans doublons

    et dans la colonne 1 de la listbox j'ai le numero de ligne ou ce trouve le mot qui est en colonne 0 de la listbox
    j'ai fait ca dans un userform mais tu fait la meme chose dans un sheets
    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
    Private Sub UserForm_Initialize()
     ' charge ta listbox1 sans doublon sur feuil1 colonne a
    Dim MonDico As Object, Cellule As Range
     With Sheets("feuil1")
    Set MonDico = CreateObject("Scripting.Dictionary")
            tablo = .Range("A2:a" & .Range("A" & Rows.Count).End(xlUp).Row).Value
            i = 2 'i =le numero la premiere ligne de la plage---->(a2)
            For Each elem In tablo
               'on ajoute la valeur  et la ligne
                           MonDico.Item(elem) = i
            i = i + 1
                    Next elem
          ' ListBox1.List = MonDico.keys 'ou  MonDico.Items 'comme tu veux
        End With
     
     
    For Each c In MonDico.keys
    ListBox1.AddItem c
    ListBox1.List(e, 1) = MonDico.Item(c)
    e = e + 1
    Next c
     
    Set MonDico = Nothing 'on vide pas le dico on vide la variable tout court
    End Sub
    Au plaisir

  9. #9
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut
    J'ai maintenant un autre problème,
    une fois toutes les données sélectionnées dans la listebox2, comment faire pour récupérer toutes ces valeurs ?
    Je dois ensuite faire des requêtes SQL qui enverront ces données dans une base de données.

    Merci !!

  10. #10
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut
    J'ai réussi à tirer toutes mes valeurs de la liste,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                For n = 0 To zl_articlesaisis.ListCount - 1
                var_article = zl_articlesaisis.List(n)
    next n
    mais la comparaison ne se fait pas correctement !!
    J'ajoute des données dans ma listebox2, je lis ces informations en les comparant à une chaine de caractère mais ça ne fonctionne pas ! J'arrive toujours sur le message d'erreur de mon "IF"...

    J'envoi mon fichier pour être plus clair.

    Merci de votre aide !
    Fichiers attachés Fichiers attachés

  11. #11
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut
    J'ai essayé avec listbox.Column(0), j'obtient la valeur mais quand je la compare à un variable contenant du texte mais identique, ça ne marche toujours pas...

    Comment faire s'il vous plait ?

    Merci

  12. #12
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut
    Je viens de voir qu'il y avait une erreur, lorsque l'on ajoute un élément dans la deuxième listbox, puis qu'on l'enlève, il revient dans la première liste mais il comporte un problème et la macro plante lorsqu'on veut remettre cet élément dans la deuxième liste...

    Première liste:

    01 - Banane
    02 - Fraise

    Passage dans la deuxième listbox

    Banane (il n'y a plus le 01)

    Retour dans la première listbox:

    02 - Fraise
    Banane (toujours plus de 01)

    Quand on reclique sur banane, il y a une erreur !
    Cela vient du nombre de colonne mais comment rectifier ceci ?

    Merci



    PS: j'ai réussi en faisant ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    zl_articlesaisis.AddItem
    zl_articlesaisis.List(zl_articlesaisis.ListCount - 1, 0) = zl_article.Column(0)
    zl_articlesaisis.List(zl_articlesaisis.ListCount - 1, 1) = zl_article.Column(1)

    Mais j'arrive toujouts pas à comparer zl_article.Column(1) à une chaine de charactère identique...

    Une petite aide ?

    merci

  13. #13
    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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    je t'avoue que je n'ai pas suivi le reste de ta discussion

    je vois que l'on parle maintenant d'une 2 eme listbox

    dis moi en terme clair ce que tu veux faire exactement car la je suis dans le flou

    je crois d'ailleurs que ca n'est pas forcement la bonne methode

    Au plaisir

  14. #14
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut
    Bonjour,

    patricktoulon, j'ai réglé tout mes soucis et ai simplifié le problème.

    Du coup j'ai créé deux zones de listes.
    Je souhaite que quand je clique sur le bouton "Selectionner tout", tout ce qu'il y a dans la liste 1 soit envoyé dans la lsite 2 (sachant que mes listes sont composées de deux colonnes).
    J'ai essayé ceci, mais ça ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub bt1_Click()
    For n = 0 To lb1.ListCount - 1
        lb2.AddItem
        lb2.List(lb2.ListCount - 1, 0) = lb1.Column(n, 0)
        lb2.List(lb2.ListCount - 1, 1) = lb1.Column(n, 1)
        If lb1.List(lb1.ListIndex, 0) <> "" Then
            lb1.List(lb1.ListIndex, 0) = ""
            lb1.RemoveItem lb1.ListIndex
        End If
    Next n
    End Sub
    Merci de votre aide !

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 473
    Points : 493
    Points
    493
    Par défaut
    Salut,

    Il est possible de voir une partie de ton fichier en exemple?

  16. #16
    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
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut heu
    Bonjour

    c'est tout a fait normal listindex te donne le numéro de l'item sélectionné
    et toi en l'occurrence tu ne sélectionne rien du tout puisque tu viens tout juste de remplir ta liste 2

    sert toi plutôt de ta variable n ou listcount -1 pour le dernier
    en plus je comprend pas pourquoi tu utilise une boucle pour copier ta lb1 dans lb2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub bt1_Click()
    LB2.Clear
    For n = 0 To LB1.ListCount - 1
        LB2.AddItem
        LB2.List(LB2.ListCount - 1, 0) = LB1.List(n, 0)
        LB2.List(LB2.ListCount - 1, 1) = LB1.List(n, 1)
    je ferais plutot ca moi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub bt1_Click()
    LB2.Clear
    LB2.List = LB1.List
    ensuite je ne comprends pas bien ce que tu veux faire ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'If LB1.List(n, 0) <> "" Then
            'LB1.List(n, 0) = ""
            'LB1.RemoveItem n
        'End If
    sachant que si tu supprime un item ta boucle est cassée donc !!!!erreur!!!!
    fait plutôt un clearen gros tu transfère la liste 1 dans la liste 2

    donc en résumé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub bt1_Click()
    LB2.Clear
    LB2.List = LB1.List
    LB1.Clear
    End Sub
    point barre

    Au plaisir

Discussions similaires

  1. manipulation des liste déroulantes
    Par erlerwade dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/01/2012, 01h04
  2. [AC-2010] Conversion liste déroulante access 2003 à 2010
    Par gio286 dans le forum Requêtes et SQL.
    Réponses: 22
    Dernier message: 22/07/2011, 14h58
  3. [AC 2010]Zone de liste déroulante
    Par zoltix dans le forum IHM
    Réponses: 2
    Dernier message: 01/08/2010, 10h40
  4. De la manipulation des listes déroulantes
    Par Herode dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 07/11/2007, 16h55
  5. manipulation liste déroulante
    Par grinder59 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 24/12/2005, 22h27

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