+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Invité régulier
    Inscrit en
    mars 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 48
    Points : 8
    Points
    8

    Par défaut Remplissage conditionnel d'une combobox sur une partie seulement de la base

    Bonjour, je coince sur ce petit problème :
    J'ai un tableau :
    Colonne A :
    Noms
    Durand
    Dupont
    Sanchez
    Rivoire
    Bertin
    Je remplis un ComboBox avec.
    En colonne D, j'ai :
    Classe
    302
    302
    606
    407
    407
    Si je choisis un par un tous noms, tout fonctionne. Mais comment faire pour choisir la classe et qu'ensuite, le combobox ne s'alimente qu'avec les noms correspondant à cette classe ?
    Merci par avance.
    Voici le petit bout de code :

    Code :
    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
     
    Option Explicit
    Dim Lig As Long
    Dim niv As Integer
     
     
    Private Sub UserForm_Initialize()
    Dim t As Object
    Dim c As Range
     
     
    Set t = CreateObject("Scripting.Dictionary")
    'Remplissage de la ComboBox1 sans doublons
    With Sheets("Base")
       For Each c In .Range("A2", .Cells(Rows.Count, 1).End(xlUp))
          t.Item(c.Value) = c.Value
       Next c
    End With
    Me.ComboBox1.List = t.items
    Set t = Nothing
    'Définition de la ComboBox2 à 2 colonnes
    With Me.ComboBox2
       .ColumnCount = 2
       .ColumnWidths = .Width - 2 & ";0"
    End With
    End Sub
     
    Private Sub ComboBox1_Change()
    Dim c As Range
     
    Application.ScreenUpdating = False
    Me.ComboBox2.Clear
    'filtrage de la feuille de donnée sur la vaaleur de combo et remplissage
    'de combo2 par les valeurs des cellules filtées et le numéro de ligne
    With Sheets("Base")
       .Range("A1", .Cells(Rows.Count, 1).End(xlUp)).AutoFilter field:=1, Criteria1:=Me.ComboBox1.Value
       For Each c In .Range("B2:B" & .Cells(Rows.Count, 1).End(xlUp).Row).SpecialCells(xlCellTypeVisible)
          With Me.ComboBox2
             .AddItem c.Value
             .List(.ListCount - 1, 1) = c.Row
          End With
       Next c
       .Range("A1", .Cells(Rows.Count, 1).End(xlUp)).AutoFilter
    End With
    End Sub

  2. #2
    Membre Expert Avatar de Fvandermeulen
    Profil pro
    Inscrit en
    juillet 2007
    Messages
    1 846
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : juillet 2007
    Messages : 1 846
    Points : 2 411
    Points
    2 411

    Par défaut

    Salut,

    Je t'avoue ne pas avoir testé, mais au lieu de filtrer et utiliser la visibilité des lignes, je suis parti sur l'idée de tester la valeur de la colonne D suivant la ComboBox1, vu que tu as utilisé un for Each, je passe par Offset:

    Code :
    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
    Option Explicit
    Dim Lig As Long
    Dim niv As Integer
     
     
    Private Sub UserForm_Initialize()
    Dim t As Object
    Dim c As Range
     
     
    Set t = CreateObject("Scripting.Dictionary")
    'Remplissage de la ComboBox1 sans doublons
    With Sheets("Base")
       For Each c In .Range("A2", .Cells(Rows.Count, 1).End(xlUp))
          t.Item(c.Value) = c.Value
       Next c
    End With
    Me.ComboBox1.List = t.items
    Set t = Nothing
    'Définition de la ComboBox2 à 2 colonnes
    With Me.ComboBox2
       .ColumnCount = 2
       .ColumnWidths = .Width - 2 & ";0"
    End With
    End Sub
     
    Private Sub ComboBox1_Change()
    Dim c As Range
     
    Application.ScreenUpdating = False
    Me.ComboBox2.Clear
    'filtrage de la feuille de donnée sur la vaaleur de combo et remplissage
    'de combo2 par les valeurs des cellules filtées et le numéro de ligne
    With Sheets("Base")
     
       For Each c In .Range("B2:B" & .Cells(Rows.Count, 1).End(xlUp).Row)
         If c.offset(0,2).value=Me.ComboBox1.Value then
               With Me.ComboBox2
                  .AddItem c.Value
                  .List(.ListCount - 1, 1) = c.Row
               End With
         End if
       Next c
       .Range("A1", .Cells(Rows.Count, 1).End(xlUp)).AutoFilter 'Je sais pas si c'est encore nécessaire...
    End With
    End Sub
    En espérant avoir bien compris ton code

    A+
    N'oubliez pas le si votre problème est solutionné.

  3. #3
    Invité régulier
    Inscrit en
    mars 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 48
    Points : 8
    Points
    8

    Par défaut

    Mille mercis pour cette réponse, mais je crains de n'avoir pas été assez clair, en ne donnant pas suffisemment de détails.
    Je recommence :
    Une école, des classes, et dans les classes, des élèves.
    Une feuille excel, des colonnes : Noms, Prénoms, Classe (colonnes A, B, D).
    Des ComboBox qui se remplissent sur ces colonnes :
    ComboBox1 pour les noms.
    Combobox2 fonction du ComboBox1 pour les prénoms.
    ComboBox9 pour les classes (alimenté par ailleurs).
    Dans le cas d'une saisie générale, je choisis le nom avec ComboBox1, qui me remplit ComboBox2 pour choisir le prénom, et enfin, je choisis la classe avec le ComboBox9.
    Cela fonctionne.
    Mon problème, c'est si je souhaite ne renseigner qu'une seule classe, la 503 par exemple.
    Avec le ComboBox9, je choisis la classe 503, ce qui ne remplit le ComboBox1 qu'avec les noms de la 503, puis, je termine avec les prénoms avec le ComboBox.
    Et c'est justement ce que je n'arrive pas à faire : que le choix exprimé en colonne D (la classe), ne remplisse le ComboBox1 qu'avec les noms de la colonne A ayant cette classe inscrite en colonne D.
    C'est mieux ? En tous cas, j'espère que cela permettra de me dépanner...
    Mille mercis encore par avance.
    CS.

  4. #4
    Invité régulier
    Inscrit en
    mars 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 48
    Points : 8
    Points
    8

    Par défaut

    Toujours pas de réponse... personne ne voit de solution à mon problème ?
    Au secours ! Aidez-moi s'il vous plaît !
    Merci par avance.
    CS.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •