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-2011] Userform de recherche avec ComboBox et ListBox


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 8
    Par défaut [XL-2011] Userform de recherche avec ComboBox et ListBox
    Bonjour à tous,

    Ca fait déjà deux jours que je suis coincé sur un problème d'UserForm, j'ai donc décidé de vous exposer mon problème.

    Je possède une tableur excel avec de nombreuses lignes et qui se remplis tous les jours.
    On va admettre qu'il y a deux colonnes : Fournisseur, SiteWeb redirigeant vers ce fournisseur.

    Dans un UserForm, j'aimerai qu'il y ai une ComboBox avec tous les fournisseurs (A,B,C sur le schéma), sans doublons et triés par ordre alphabétique (Les fournisseurs peuvent apparaitre de nombreuses fois et dans le désordre) et qu'il y ait une ListBox pour afficher les liens HyperText de ces fournisseurs(1, 2, 3, 4, 5, 6, 7 sur le schéma).

    Nom : Capture d’écran 2014-04-30 à 09.18.52.png
Affichages : 2255
Taille : 93,2 Ko

    J'ai déjà réussi a trier les Fournisseurs par ordre croissant et sans doublons (avec beaucoup de mal et c'est très lent je l'admet) mais je n'arrive pas à afficher les résultats dans la ListBox.
    A savoir qu'après il n'y aura plus seulement le Fournisseur, mais aussi des références et autre, mais le but sera toujours de retrouver des liens dans la ListBox (ces liens peuvent être nombreux).

    Merci de votre aide.

    Cordialement.

  2. #2
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut
    Bonjour,

    Voila ce que je te propose, pour realiser ce que tu veux, sans doublons:

    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()
    Dim nbfournisseurs As Long, i As Long
     
    nbfournisseurs = WorksheetFunction.CountA(Feuil1.Columns(1)) - 1
     
    For i = 2 To nbfournisseurs + 1
        If WorksheetFunction.CountIf(Feuil1.Range(Cells(1, 1), Cells(i - 1, 1)), Cells(i, 1)) = 0 Then
                ComboBox1.AddItem (Feuil1.Cells(i, 1))
            Else
        End If
    Next i
     
    End Sub
    Attention, ce code est a inscrire dans le code de ton UserForm. J'ai considere que ta liste de fournisseurs etait dans ta Feuil1, dans la colonne A et que en cellule A1 il y a une entete comme "Fournisseur" (donc ta liste commence a partir de la cellule A2). Dans le code on voit egalement que la combobox est le numero 1. Si tu respectes ceci, ca te donnera ce que tu souhaites (je l'ai teste sur un fichier)

    vanhoa

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 8
    Par défaut
    Merci, votre code fonctionne parfaitement une fois adapté à ma feuille.

    Il ne me reste plus qu'à trier par ordre alphabétique (ce qui ne doit pas être trop dur, mais avec ma méthode, l'UserForm met plusieurs dizaines de secondes à apparaitre) et afficher les résultats dans la ListBox (ce que je n'arrive pas du tout malheureusement)

    Pour le tri par ordre alphabétique j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    'Tri le contenu du ComboBox par ordre alphabétique
        With ComboBox1
            For i = 0 To .ListCount - 1
                For j = 0 To .ListCount - 1
                    If .List(i) < .List(j) Then
                        strTemp = .List(i)
                        .List(i) = .List(j)
                        .List(j) = strTemp
                    End If
                Next j
            Next i
        End With
    Je peux donner plus de détails si vous ne comprenez pas bien ce que doit retourner la ListBox.

    Cordialement.

  4. #4
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut
    Avec l'ordre alphabetique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub lancementUserForm()
    Dim nblignes As Long
    nblignes = Feuil1.Cells(Rows.Count, 1).End(xlUp).Row
    With Feuil1.Sort
        .SetRange Range(Cells(2, 1), Cells(nblignes, 1))
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    UserForm1test.Show
    End Sub
    je t'ai mis au passage une autre facon d'avoir ta derniere ligne non vide pour ta colonne A:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nblignes = Feuil1.Cells(Rows.Count, 1).End(xlUp).Row
    quand tu ne connais pas la syntaxe a utiliser pour qch en particulier, le premier reflexe est de realiser un test en utilisant l'enregistreur de macro et ensuite d'aller voir le code que ca a utilise. Il faut ensuite adapter le code, car l'enregistreur de macro utilise un code qui n'est pas optimal.

    Pour le code que je t'ai mis, il faut le mettre dans un module standard. avant de lancer ton UserForm via le code suivant:
    (le nom du UserForm est a changer, enfin j'ai mis "UserForm1" par defaut) la procedure va realiser le tri par ordre alphabetique dans un premier temps avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    With Feuil1.Sort
        .SetRange Range(Cells(2, 1), Cells(nblignes, 1))
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Essaie donc ce code, ca doit marcher

    vanhoa

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 8
    Par défaut
    Merci mais ce code sert à trier la feuille de classeur par ordre alphabétique et non les données contenues DANS la ComboBox ?

    Parce que la grâce à mon code j'ai bien ma ComboBox avec tous les Fournisseurs dans l'ordre alphabétique, mais dans la ListBox, je n'arrive pas a afficher uniquement les liens correspondants au fournisseur sélectionné (j'ai tous les liens en l'occurrence, voir mon code plus bas).

    Nom : Capture d’écran 2014-04-30 à 10.31.08.png
Affichages : 2295
Taille : 34,6 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub ComboBox1_Change()
        'On vide la ListBox
        ListBox1.Clear
        Dim nbliens As Long, i As Long
        nbliens = WorksheetFunction.CountA(Columns(3)) - 1
        For i = 2 To nbliens + 1
            'On ajoute les liens qui se trouvent dans la colonne F
            ListBox1.AddItem (Cells(i, 6))
        Next
    End Sub
    Comme vous pouvez le voir, il n'y a aucune condition de remplissage sur la ListBox, elle prend simplement toutes les données trouvées sur la colonne F et les ajoute. Or ce qu'il faudrait c'est que SI le fournisseur YKO1 est sélectionné, alors on retrouve uniquement les liens correspondant à ce fournisseur dans la ListBox

    Je viens d'avoir une idée qui pourrait solutionner le problème mais je n'arrive pas à l'écrire. Je vous la donne sous forme algorithmique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Pour i allant de 2 à DernièreLigne
         Si ValeurSelectionnéDansLaComboBox == ValeurCelluleEni
              ListBox1.AddItem(i,ColonneContenantLaValeurSouhaitée)
         Sinon
              i++
         Fsi
    Fpour
    J'essayes de l'écrire mais il y a des problèmes dans la comparaison des types dans le If.

  6. #6
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut
    Ok, donc dans le code de ton UserForm inscrit:

    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
    Private Sub ComboBox1_Click()
    Dim fournisseur As String, nbselection As Long, nblignes As Long
     
    fournisseur = ComboBox1.Value
    nblignes = Feuil1.Cells(Rows.Count, 1).End(xlUp).Row
     
    ListBox1.Clear
    For i = 2 To nblignes
        If Feuil1.Cells(i, 1).Value = fournisseur Then
                ListBox1.AddItem (Feuil1.Cells(i, 2))
            Else
        End If
    Next i
     
    End Sub
     
    Private Sub UserForm_Initialize()
    Dim nbfournisseurs As Long, i As Long
     
    nbfournisseurs = WorksheetFunction.CountA(Feuil1.Columns(1)) - 1
     
    For i = 2 To nbfournisseurs + 1
        If WorksheetFunction.CountIf(Feuil1.Range(Cells(1, 1), Cells(i - 1, 1)), Cells(i, 1)) = 0 Then
                ComboBox1.AddItem (Feuil1.Cells(i, 1))
            Else
        End If
    Next i
     
     
    End Sub
    et dans ton module standard:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub lancementUserForm()
    Dim nblignes As Long
    nblignes = Feuil1.Cells(Rows.Count, 1).End(xlUp).Row
    With Feuil1.Sort
        .SetRange Range(Cells(2, 1), Cells(nblignes, 2))  'j'ai change cells(nblignes,1) en cells(nblignes,2)
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    UserForm1test.Show
    End Sub
    Tes liens doivent etre en colonne B

    Regarde si ca marche (ca marche de mon cote)

    vanhoa

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 8
    Par défaut
    Un immense merci pour cette aide apportée !!!
    Ca fonctionne parfaitement, la sélection retourne bien le lien souhaité (malheureusement le liens n'est pas hypertext)

    Il ne me reste plus qu'a faire en sorte que les combobox soient interconnectés, c'est à dire que l'on peut affiner la recherche en fonction des autres critères (voir screen de mon userform plus haut)

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

Discussions similaires

  1. Recherche avec combobox
    Par BERRACHED SAID dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/10/2014, 14h42
  2. [XL-2003] imprimé feuille excel directement d'un userform avec combobox
    Par tazko dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/01/2011, 23h35
  3. Problème de recherche avec critère venant d'une combobox
    Par chyanon dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/03/2010, 22h26
  4. Recherche avec Combobox
    Par Djclo dans le forum ASP.NET
    Réponses: 8
    Dernier message: 23/10/2008, 13h59
  5. Rechercher avec des combobox
    Par xeak2008 dans le forum Débuter
    Réponses: 5
    Dernier message: 07/10/2008, 13h38

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