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 :

Nombre de ligne dans une liste déroulante


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé Avatar de alain78
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Par défaut Nombre de ligne dans une liste déroulante
    Bonjour à toutes et tous,

    J'ai un souci de ergonomie lorsque je crée dans une userform une liste déroulante en VBA.
    Par code je vais récupérer dans une feuille (aliments) et dans une colonne B (nom de l'aliment) toutes les cellules pour lesquelles la colonne C (type d'aliment) satisfait la condition demandée

    Nom : feuille1.JPG
Affichages : 184
Taille : 22,9 Ko

    Mon problème;
    La liste (liste_aliments) récupère bien toutes les valeurs MAIS en fin de liste il y a toujours une ligne vide en plus sur laquelle l'utilisateur peut cliquer ce qui ne doit pas être.

    Voici mon extrait de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
                Me.liste_aliments.AddItem
                k = 0 'définit la première ligne de la liste
     
                Range("C2").Select
                While ActiveCell.Value <> ""
                    If ActiveCell.Value = type_aliment_temp Then
                        Me.liste_aliments.AddItem
                        Me.liste_aliments.List(k, 0) = ActiveCell.Offset(0, -1).Value
                        k = k + 1
                    End If
                    ActiveCell.Offset(1, 0).Select
                Wend
    Je ne comprend pas:
    Pourquoi y a t il toujours une ligne de plus ? Exemple pour le type "légume". Il y a 3 noms à récupérer, mais la liste crée comporte bien les 3 lignes avec les noms mais il y a une 4ème ligne vide !!!

    Nom : feuille2.JPG
Affichages : 178
Taille : 39,5 Ko

    Voyez vous l'anomalie (en bleu dans la liste aliments) ?

    Merci par avance pour votre aide.

    Bonne journée.
    Images attachées Images attachées  

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2021
    Messages
    334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 334
    Par défaut
    Salut, c'est normal car tu loop sur la derniere valeur "champ vide"

    Repérè au préalable la dernière ligne remplie comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Me.liste_aliments.AddItem
    Dim lignevide as integer, i As Integer
    lignevide = Feuil1.Range("c" & Rows.Count).End(xlUp).Row
     
                For i = 2 To premiereligne
                    If Feuil1.Range("c" & i).Value = type_aliment_temp Then
                        Me.liste_aliments.AddItem
                        Me.liste_aliments.List(i, 0) = Feuil1.Range("c" & i).Value
                    End If
                Next

  3. #3
    Membre confirmé Avatar de alain78
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Par défaut
    Merci.

    J'ai corrigé 2 oublis dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Me.liste_aliments.AddItem
    Dim lignevide As Integer
    lignevide = Feuil1.Range("c" & Rows.Count).End(xlUp).Row
     
                For i = 2 To lignevide
                    If Feuil1.Range("c" & i).Value = type_aliment_temp Then
                        Me.liste_aliments.AddItem
                        Me.liste_aliments.List(i, 0) = Feuil1.Range("c" & i).Value
                    End If
                    ActiveCell.Offset(1, 0).Select
                Next
    - lignevide à la place de premiereligne.
    - le passage à la ligne du dessous avec ActiveCell.Offset(1, 0).Select.

    Mais malgré cela, le résultat est vide.

    1° Sur une cellule qui satisfait la condition (= type_aliment_temp) la valeur n'est pas retenu. Bizarre car en mode debug je constate que Feuil1.Range("c" & i).Value=2.083333333333333E-02.
    Bizarre !!!!!

    2° La descente de la colonne se poursuit au delà de lignevide. Je ne sais pourquoi lignevide=70 !!!

    Et cela ne fonctionne toujours pas.


  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2021
    Messages
    334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 334
    Par défaut
    Re,

    Le select ne sert a rien puisque je n'utilise pas de sélection dans la boucle for.

    En suite vérifie que le codename de ta feuille ou sont les listes est bien "feuil1" sinon change le.

  5. #5
    Membre confirmé Avatar de alain78
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Par défaut
    J'ai le message d'erreur

    Erreur d'exécution '381'
    Impossible de définir la propriété List.Index de table de propriété non valide.
    Cela concerne la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.liste_aliments.List(i, 0) = Feuil13.Range("c" & i).Value
    Je crois que c'est parce que i=2 au départ alors que dans une liste il doit commencer à 0 ?

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2021
    Messages
    334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 334
    Par défaut
    Oui t'as raison faut mettre une autre variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Me.liste_aliments.AddItem
    Dim lignevide As Integer, i As Integer, k As Integer
    lignevide = Feuil1.Range("c" & Rows.Count).End(xlUp).Row
    k = 0
    For i = 2 To premiereligne
        If Feuil1.Range("c" & i).Value = type_aliment_temp Then
            Me.liste_aliments.AddItem
            Me.liste_aliments.List(k, 0) = Feuil1.Range("c" & i).Value
            k = k + 1
        End If
    Next

  7. #7
    Membre confirmé Avatar de alain78
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Par défaut RESOLU
    Finalement je suis revenu à Do While avec Loop avec un exit lorsque le nombre de ligne non vide a été examiné.

    Cela fonctionne parfaitement.

    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
    Dim lignevide As Integer
    Dim k As Integer
    Dim i As Integer
    Dim numero_ligne As Integer
     
    k = 0
    numero_ligne = 1
     
    lignevide = Feuil13.Range("c" & Rows.Count).End(xlUp).Row
        Do While ActiveCell.Value <> ""
            If ActiveCell.Value = type_aliment_temp Then
                Me.liste_aliments.AddItem
                Me.liste_aliments.List(k, 0) = ActiveCell.Offset(0, -1).Value
                k = k + 1
               numero_ligne = numero_ligne + 1
               If numero_ligne > lignevide Then
               Exit Do
               End If
            End If
            ActiveCell.Offset(1, 0).Select
        Loop
    Merci pour avoir consacré un peu de ton temps à m'aider.

    Bonne fin de journée.

  8. #8
    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.


    Tu tagues XL365 => Perso, j'utiliserais les fonctions d'Excel qui permettent cela rapidement et sans boucles

    Nom : 2021-04-02_111353.png
Affichages : 153
Taille : 20,3 Ko

    Avec un tableau structuré nommé t_Eléments et un userform comprenant les listbox lboTypes et lboEléments, voilà comment je procéderais


    Chargement et affichage du formulaire au départ d'un module standard:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub Test()
      With UserForm1
        .lboTypes.List = Evaluate("sort(unique(t_Eléments[Type]))")
        .Show
      End With
    End Sub

    On gère l'évènement de sélection du type avec ce code dans le module du userform:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub lboTypes_Click()
      cboElements.List = Evaluate("sort(filter(t_Eléments[nom],t_Eléments[type]=""" & lboTypes.Value & """))")
    End Sub

    Ces techniques s'appuient sur les plages dynamiques ou matrices créées par les nouvelles fonctions UNIQUE, TRIER, FILTRER qui permettent d'alléger sensiblement le code VBA (Quand on programme en VBA pour EXCEL, on pense d'abord Excel avant de penser VBA )

    Nom : 2021-04-02_111832.png
Affichages : 150
Taille : 84,3 Ko


    Mes billets qui en parlent:
    https://www.developpez.net/forums/bl...ionary-arrays/
    https://www.developpez.net/forums/bl...sie-intuitive/
    https://www.developpez.net/forums/bl...cel-aidez-moi/
    "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...
    ---------------

  9. #9
    Membre confirmé Avatar de alain78
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Par défaut
    Je tague xl365 car j'ai un abonnement annuel à MS Office 365 qui inclut cette version d'Excel.

    J'essaie de mettre en pratique tes conseils. J'utilise déjà les tableaux dans mes feuilles.

    Sur le premier code, la liste est bien crée mais lorsque je quitte le userform, un message d'erreur me dit que la variable ou objet de bloc With n'est pas défini.

    Je cherche. Je suppose que c'est t_Elements[type] qui pose problème. Doit on mettre cet élément dans la Listbox Row.Source ? Si oui je ne sais pas comment faire car je ne doit pas faire la bonne manip car Excel refuse.

    A suivre.

  10. #10
    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
    Il faudrait donner le code que tu utilises, car ma boule de cristal est cassée


    Connais-tu With... End With? Car vu le message, je pense que utilises une ligne de mon exemple en dehors d'un bloc With... End With
    "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...
    ---------------

  11. #11
    Membre confirmé Avatar de alain78
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Par défaut
    Et avec la 2ème instruction J'ai une erreur Impossible de lire la propriéte List.Index de table de propriété non valide.

    Citation Envoyé par Pierre Fauconnier Voir le message
    On gère l'évènement de sélection du type avec ce code dans le module du userform:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub lboTypes_Click()
      cboElements.List = Evaluate("sort(filter(t_Eléments[nom],t_Eléments[type]=""" & lboTypes.Value & """))")
    End Sub
    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
     Option Explicit
     
    Private Sub liste_recettes_Click()
     
        aliments_liste.List = Evaluate("sort(filter(TableauRecettes[nom_aliments],TableauRecettes[nom_recette]=""" & liste_recettes.Value & """))")
     
    End Sub
     
    Private Sub UserForm_Initialize()
        Dim nom_recette As String
     
      With recettes_modifier
        .liste_recettes.List = Evaluate("sort(unique(TableauRecettes[nom_recette]))")
        .Show
      End With
     
    End Sub

  12. #12
    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
    Perso, je ne suis pas fan de l'utilisation de l'évènement Initialize, question d'architecture de code.

    Mais si tu utilises Initialize, tu n'as pas besoin du bloc With car ce bloc définit le userform. On l'utilise donc pour du code hors userform. Dans ton cas, il suffit d'alimenter les contrôles, et donc ton Initialize se résume, pour ce que j'en ai montré dans mon code, au remplissage de la liste. Le bloc n'est pas utile, et le .Show non plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_Initialize()
      lboTypes.List = Evaluate("sort(unique(t_Eléments[Type]))")
    End Sub

    Voici un classeur qui modélise cela: Recettes365.xlsm


    Je ne vois pas d'instruction qui utilise INDEX dans ton code, donc je ne peux pas comprendre ta remarque à ce sujet
    "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...
    ---------------

  13. #13
    Membre confirmé Avatar de alain78
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Par défaut
    Merci. Je n'ai plus le premier message d'erreur.

    Mais compliquons un peu (pour moi) les choses.

    Que devient l'instruction ci dessous lorsque dans lboTypes.List (2 colonnes) chaque item comprend 2 éléments chacun appartenant à une colonne du même tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_Initialize()
      lboTypes.List = Evaluate("sort(unique(t_Eléments[Type]))")
    End Sub

  14. #14
    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
    Citation Envoyé par alain78 Voir le message
    [...]
    Que devient l'instruction ci dessous lorsque dans lboTypes.List (2 colonnes) chaque item comprend 2 éléments chacun appartenant à une colonne du même tableau.[...]

    Pas compris, désolé. Un exemple avec une copie d'écran du tableau?
    "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...
    ---------------

  15. #15
    Membre confirmé Avatar de alain78
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Par défaut
    Dans mon userform j'ai 2 listbox. Je change les noms pour simplifier l'explication

    recette_liste et aliments_liste

    recette liste est alimenté par la colonne de nom_recette tableau (voir fichier joint).

    lorsque l'utilisateur clique sur un item (une recette) de listbox recette_liste, alors la listbox aliments_liste affiche tous les aliments qui correspondent à la recette choisie. Mais chaque item de aliments_liste se compose du nom_aliment (colonne de tableau) & de quantité_élement (voir tableau)

    Bien sur ma listbox aliments_liste comporte 2 colonnes pour me permettre de connaitre ultérieurement le poids de l'aliment.

    J'espère avoir été clair et aussi concis que possible.
    Images attachées Images attachées  

Discussions similaires

  1. chargement de plusieurs lignes dans une liste déroulante
    Par Ramone1 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/01/2019, 17h30
  2. [AC-2013] Compter le nombre d'items dans une liste déroulante
    Par ghammouzi dans le forum IHM
    Réponses: 2
    Dernier message: 07/12/2017, 19h18
  3. [XL-2007] nombre d'indice dans une liste déroulante
    Par Siuko dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 21/12/2014, 13h57
  4. [XL-2007] Nombre de lignes dans une liste déroulante
    Par divan dans le forum Conception
    Réponses: 3
    Dernier message: 20/11/2010, 10h32

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