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

Excel Discussion :

Fonctionnement aléatoire d'une "new collection" alimentant une combobox sur un formulaire


Sujet :

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 "new collection" alimentant une combobox sur un formulaire
    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

    SITUATION DU PROBLEME :
    Ci-joint le module de code contenant le problème. Celui-ci se situe dans la sub nommée Sub ComboBox2_AfterUpdate()(cf fichier texte). La new collection incriminée se situe juste après "'Dédoublonnage des valeurs "ancienneté" via une collection"
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 947
    Points : 4 058
    Points
    4 058
    Par défaut
    Bonjour.
    J’avoue ne pas avoir pris le temps de déboguer ton code, mais je te propose une autre approche pour répondre à ton problème, sans utiliser les collections : aussi pour le tri des données et la suppression des doublons, j’utilise la fonction QuickRanking que tu trouveras dans cette documentation : http://excel.developpez.com/index/re...de-Laurent-OTT
    Et j’utilise la fonction TableauCoordonnées pour la recherche de la dernière ligne du tableau et alimenter NbLignes, car Sheets("Feuil1").Range("A1048576").End(xlUp).Row ne marche pas correctement si le tableau contient des lignes filtrées.
    Dans ce code, les données sont dans un tableau dont le début est en « A1 » de la feuille « Feuil1 », et les ComboBox 1 à 4 filtrent sur les colonnes 1 à 4.

    Le principe :
    A l’initialisation du formulaire je charge les données de la colonne 1 dans une mémoire TabDonnées(). Puis les données sont triées et les doublons supprimés. Je peux alors mettre à jour la liste du ComboBox1 d’après le contenu de TabDonnées().
    La sélection d’une donnée dans ComboBox1 déclenche : La pose du filtre sur la colonne 1 d’après la sélection faite, l’effacement du contenu des ComboBox2 à ComboBox4, puis le chargement des données de la colonne 2 et la mise à jour de la ComboBox2.
    La sélection d’une donnée dans ComboBox2 déclenche : La pose du filtre sur les colonnes 1 et 2 d’après les sélections faites dans ComboBox1 et ComboBox2, l’effacement du contenu des ComboBox3 à ComboBox4, puis le chargement des données de la colonne 3 et la mise à jour de la ComboBox3.
    Et ainsi de suite pour la mise à jour des autres ComboBox. Voici le 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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    Option Explicit
     
    Dim NbLignes As Long
    Dim TabDonnées() As Variant
     
    '-------------------------------------------------------------------------------
    Private Sub UserForm_Initialize()
    '-------------------------------------------------------------------------------
    ' Recherche le nombre de lignes:
    Call vbo.TableauCoordonnées("A1", , , NbLignes)
     
    ' Suppression des filtres:
    Range("A1").AutoFilter
    ' Charge les données de la colonne 1 utilisées pour le ComboBox1:
    Call ChargementDonnéesColonne(1)
    ' Mise à jour des valeurs de ComboBox1:
    Call MAJ_ComboBox(1)
     
    End Sub
     
    '-------------------------------------------------------------------------------
    Sub ChargementDonnéesColonne(Col As Long)
    '-------------------------------------------------------------------------------
    Dim N As Long, i As Long
     
    ' Efface les anciennes données mémorisées:
    ReDim TabDonnées(0)
     
    ' Boucle sur les lignes sans l'entête et récupère les données non filtrée:
    For N = 2 To NbLignes
        If ThisWorkbook.Worksheets("Feuil1").Rows(N).Hidden = False Then
            ReDim Preserve TabDonnées(i)
            TabDonnées(i) = ThisWorkbook.Worksheets("Feuil1").Cells(N, Col)
            i = i + 1
        End If
    Next N
     
    ' Trie les données par ordre croissant et supprime les doublons:
    Call vbo.QuickRanking(TabDonnées(), True, 4)
    End Sub
     
    '-------------------------------------------------------------------------------
    Private Sub MAJ_ComboBox(NumCombo)
    '-------------------------------------------------------------------------------
    ' Création d'une nouvelle liste dans une ComboBox:
    Dim CB As ComboBox
    Dim i As Integer
    ' CB représentera la ComboBox voulue d'après le numéro passé dans NumCombo:
    If NumCombo = 1 Then Set CB = ComboBox1
    If NumCombo = 2 Then Set CB = ComboBox2
    If NumCombo = 3 Then Set CB = ComboBox3
    If NumCombo = 4 Then Set CB = ComboBox4
    ' Efface les anciennes valeurs de la ComboBox:
    CB.Clear
    ' Charge les nouvelles valeurs dans la ComboBox:
    For i = 0 To UBound(TabDonnées())
        CB.AddItem TabDonnées(i)
    Next i
    ' Libère l'objet de la mémoire:
    Set CB = Nothing
    End Sub
     
    '-------------------------------------------------------------------------------
    Private Sub ComboBox1_Change()
    '-------------------------------------------------------------------------------
    ' Sur changement de ComboBox1:
    Call PoseLesFiltres
    ComboBox2.Clear
    ComboBox3.Clear
    ComboBox4.Clear
    Call ChargementDonnéesColonne(2)
    Call MAJ_ComboBox(2)
    End Sub
     
    '-------------------------------------------------------------------------------
    Private Sub ComboBox2_Change()
    '-------------------------------------------------------------------------------
    ' Sur changement de ComboBox2:
    Call PoseLesFiltres
    ComboBox3.Clear
    ComboBox4.Clear
    Call ChargementDonnéesColonne(3)
    Call MAJ_ComboBox(3)
    End Sub
     
    '-------------------------------------------------------------------------------
    Private Sub ComboBox3_Change()
    '-------------------------------------------------------------------------------
    ' Sur changement de ComboBox3:
    Call PoseLesFiltres
    ComboBox4.Clear
    Call ChargementDonnéesColonne(4)
    Call MAJ_ComboBox(4)
    End Sub
     
    '-------------------------------------------------------------------------------
    Private Sub ComboBox4_Change()
    '-------------------------------------------------------------------------------
    ' Sur changement de ComboBox4:
    Call PoseLesFiltres
    End Sub
     
    '-------------------------------------------------------------------------------
    Sub PoseLesFiltres()
    '-------------------------------------------------------------------------------
    ' Efface les éventuels filtres existants:
    Range("A1").AutoFilter
    ' Pose les filtres des colonnes 1 à 4 suivant les valeurs des combobox1 à 4:
    If ComboBox1.Value > "" Then Range("A1").AutoFilter Field:=1, Criteria1:=ComboBox1.Value
    If ComboBox2.Value > "" Then Range("A1").AutoFilter Field:=2, Criteria1:=ComboBox2.Value
    If ComboBox3.Value > "" Then Range("A1").AutoFilter Field:=3, Criteria1:=ComboBox3.Value
    If ComboBox4.Value > "" Then Range("A1").AutoFilter Field:=4, Criteria1:=ComboBox4.Value
    End Sub
    '-------------------------------------------------------------------------------

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/11/2009, 10h46
  2. [XL-2003] décomposition d'une chaîne de caratères pour alimenter une variable de type range
    Par Umaro137 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 31/08/2009, 13h31
  3. [AC-2007] Alimenter une Liste par les valeurs d'une ligne
    Par curt dans le forum IHM
    Réponses: 11
    Dernier message: 19/04/2009, 12h00
  4. Alimenter une TextBox Avec le contenu d'une cellule
    Par nico18987 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 29/10/2008, 21h41

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