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 :

Fonctionnement aléatoire d'une collection alimentant une combobox [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Fonctionnement aléatoire d'une collection alimentant une combobox
    Bonjour,

    Dans le cadre d'un filtrage en cascade d'un tableau via plusieurs combobox dans un formulaire, je dois faire remonter les valeurs de certaines colonnes d'une feuille dans ces combobox, au fur et à mesure des sélections successives. Par exemple la sélection la plus large conditionne les valeurs dans la combobox suivante et ainsi de suite. Pour avoir un temps d'exécution rapide, j'ai choisi de dédoublonner les valeurs via des new collections. Je charge ensuite ces new collections dans une variable tableau, avant de charger celle-ci dans une combobox.
    Pour le déclenchement du résultat, j'ai choisi l'événement "afterupdate".
    Mon problème m'est apparu de la façon suivante :

    Après 2 sélections successives dans 2 combobox contenant relativement peu de valeurs et fonctionnant apparemment sans problème, j'arrive à une troisième combobox contenant plus de valeurs (20-30). Et là, le problème commence : je me suis rendu compte que certaines sélections n'affichent pas le bon résultat dans une 4ème combobox en aval.

    Après examen du code, je me suis rendu compte que la new collection correspondant à la troisième combobox fonctionne aléatoirement. Si par exemple je fais plusieurs choix successifs (les uns après les autres sans fermer le formulaire) dans cette même combobox, la new collection fonctionne dans le 1er choix, mais pas dans le second, ni dans le 4ème. Dans les cas de non-fonctionnement, elle ne prend pas toutes les lignes visibles des lignes filtrées, mais seulement les 3 ou 4 premières, ce qui bien sûr, fausse complètement le résultat dans la combobox en aval.

    Ce qui complique, c'est que si je ferme le formulaire, puis le réouvre, et choisit directement (en premier) un item dans la combobox no 3, avec qui la new collection ne fonctionnait pas si on le choisissait en 2ème ou 4ème position, cet item se met à fonctionner.

    Dans le code, le problème se manifeste en premier par le count de la new collection, qui affiche une valeur inférieure au nombre de lignes filtrées. Je suis sûr que le filtre fonctionne, puisque je le vois fonctionner derrière le formulaire, qui, pour l'instant, est de taille modeste.

    J'ai vérifié le code en amont de la new collection, et n'ai pas décelé de problème.

    Quelqu'un peut-il m'aider ?

    Cordialement,

    Serge_BDD

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour
    peut être que tu te sert de la même variable pour ta collection et elle n'est pas vider a chaque combo et la effectivement ca peut dérailler

    perso pour ce genre de job j'utiliserais des filtres sur les colonnes adéquates

    c'est pour cela que quand tu ferme et ré ouvre le userform ca re fonctionne
    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

  3. #3
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Difficile à dire sans voir le code et les données. Bref, peux-tu mettre le classeur, sans données confidentielles en pièce jointe ?
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  4. #4
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour le fil, bonjour le forum,

    Pour éviter les doublons tu devrais regarder du coté de Dictionary qui est bien plus rapide...
    Un petit exemple avec un tableau qui commence en A1 de l'onglet Feuil1 et qui ne contient ni ligne vide, ni colonne vide entre les données (pour le CurrentRegion) :

    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
    Private O As Worksheet 'déclare la variable O (Onglet)
    Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)
     
    Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim D As Object 'déclare la variable D (Dictionnaire)
     
    Set O = Worksheets("Feuil1") 'définit l'onglet O
    TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
    Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
    For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde si la première contient les en-têtes)
        D(TV(I, 1)) = "" 'alimente le dictionnaire D avec les données en colonne 1 du tableau des valeurs TV
    Next I 'prochaine ligne de la boucle
    Me.ComboBox1.List = D.Keys 'alimente la ComboBox1 avec les éléments du dictionnaire D sans doublon
    End Sub
     
    Private Sub ComboBox1_Change() 'au changement dans la ComboBox1
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim D As Object 'déclare la variable D (Dictionnaire)
     
    Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
    For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde si la première contient les en-têtes)
        'condition : si la donnée ligne I colonne 1 du tableau des valeurs TV est égale à la valeur de la ComboBox1 (en cas de chiffre, transformer en texte avec CStr...)
        If TV(I, 1) = Me.ComboBox1.Value Then 'if CStr(TV(I, 1)) = Me.ComboBox1.Value
            D(TV(I, 2)) = "" 'alimente le dictionnaire D avec les données en colonne 2 du tableau des valeurs TV
        End If 'fin de la condition
    Nest I 'prochaine ligne de la boucle
    Me.ComboBox2.List = D.Keys 'alimente la ComboBox2 avec les éléments du dictionnaire D sans doublon
    End Sub
     
    Private Sub ComboBox2_Change() 'etc.
    Dim I As Integer
    Dim D As Object
     
    Set D = CreateObject("Scripting.Dictionary")
    For I = 2 To UBound(TV, 1)
        If TV(I, 1) = Me.ComboBox1.Value And TV(I, 2) = Me.ComboBox2.Value Then
            D(TV(I, 3)) = ""
        End If
    Nest I
    Me.ComboBox3.List = D.Keys
    End Sub
    À plus,

    Thauthème

    Je suis Charlie

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    bonjour
    peut être que tu te sert de la même variable pour ta collection et elle n'est pas vider a chaque combo et la effectivement ca peut dérailler

    perso pour ce genre de job j'utiliserais des filtres sur les colonnes adéquates
    c'est pour cela que quand tu ferme et ré ouvre le userform ca re fonctionne
    Bonjour, et merci pour ta participation.
    En fait, j'utilise autant de new collections que de colonnes où je puise les données.
    Le déclenchement d'une combobox actionne un filtre sur la colonne correspondante. La new collection me sert à dédoublonner les lignes filtrées.
    la même new collection ressert plusieurs fois pour la même colonne de données, autant de fois que je clique sur la combobox alimentée par cette colonne. Pour éviter la rémanence des données dans une new collectionne entre 2 choix dans la combobox, je fais Set Dedoubl3 = Nothing .
    De plus, j'ai remarqué que d'un choix à l'autre, la quantité de données dans la new collection n'est pas forcément la même. Dans certains cas, je passe d'une quantité x à la quantité 0, alors que je vois bien que le filtre a sélectionné plusieurs lignes.

    Citation Envoyé par Daniel.C Voir le message
    Bonjour,

    Difficile à dire sans voir le code et les données. Bref, peux-tu mettre le classeur, sans données confidentielles en pièce jointe ?
    Merci pour ta participation.
    Ci-joint tu trouveras le classeur dont les données ont été profondément transformées.

    Cordialement,

    Serge_BDD
    Fichiers attachés Fichiers attachés

  6. #6
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonsoir le fil, bonsoir le forum,

    Je vais prendre une douche, je dois sentir le pâté moi...
    À plus,

    Thauthème

    Je suis Charlie

  7. #7
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonjour,

    Thautheme , si tu as pris ta douche, je voulais te dire que ta solution me semble très bien adaptée et je ne comprends pas pourquoi tu n'as pas de réponse, la seule et unique chose minime que j'aurais fait avec ton code, c'est declarer ces 2 variables (I et D) une seule fois en haut de module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim D As Object 'déclare la variable D (Dictionnaire)
    Private O As Worksheet 'déclare la variable O (Onglet)
    Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)
    Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
     
    Set O = Worksheets("Feuil1") 'définit l'onglet O
    ...
    ...
    à Serge_BDD, impossible d'ouvrir ton fichier
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 15
    Points : 9
    Points
    9
    Par défaut fonctionnement aléatoire d'une collection
    Bonjour Thautheme,

    j'ai pu tester ton modèle, il fonctionne très bien.

    Merci beaucoup.

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

Discussions similaires

  1. [2.x] Une collection dans une collection ?
    Par Crackerz dans le forum Symfony
    Réponses: 2
    Dernier message: 25/08/2014, 21h22
  2. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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