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 :

combox en cascade qui ne se remplit pas


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 70
    Par défaut combox en cascade qui ne se remplit pas
    bonjour,
    de nouveau avec mes petits problèmes sur lesquels je séche
    j'avoue avoir essayer plein de trucs mais je comprends pas et n'arrive pas a solutionner.

    usf1 me permet saisie nom prenom ville etc

    a partir de mon usf1, une fois le nom et prenom saisi, j'arrive a alimenter le combobox1(ville) de l'usf12,

    usf12 me permet choix ville et adresse si plusieurs occurences (nom et prenom) existent

    j'affiche le usf12, je peux choisir la ville dans combobox1(ville) mais par contre je n'arrive pas a afficher les choix dans combobox2(adresse1) liste vide

    et c'est la que je séche
    si vous pouviez me donner un petit coup de main je vous en serais reconnaissant

    je precise que je me suis inspiré du code de Silkyroad pour alimenter mes combobox

    partie du code usf1 :

    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
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
     
    ' test de remplissage automatique
     
    Private Sub TextBox3Prenom_AfterUpdate()
     
    Dim c As Range
    Dim Lig As Long
    Dim VarNomPrenomVille As String
    Dim VarNomPrenom As String
    Dim cDest As Range
    Dim LastLig As Long
    Dim DerLig As Long
    Dim DerLig2 As Long
     
    VarNomPrenomVille = TextBox2Nom.Value + TextBox3Prenom.Value + TextBox21Ville.Value
    VarNomPrenom = TextBox2Nom.Value + TextBox3Prenom.Value
     
    With Worksheets("DoublonsTemp")
        ' effacement données temporaires des données clients en doublon sur 100 lignes
        .Range("A2:P100").ClearContents
        ' cdest : la cellulle de destination : premiere cellule vide de la colonne A de la feuille "DoublonsTemp"
        Set cDest = .Cells(.Rows.Count, "A").End(xlUp)(2)
    End With
     
    With Worksheets("Temp2")
        ' effacement données temporaires sur 100 lignes
        .Range("A2:B100").ClearContents
    End With
     
    With Worksheets("Clients")
        ' on va copier dans feuille "DoublonsTemp" toute les lignes de la feuille clients
        ' dont la colonne K VarNomPrenom correspond au nom + prenom entrés dans usf1 "nouvelle vente"
     
        ' on enlève éventuel filtre automatique
        .AutoFilterMode = False
        ' LastLig  ligne de la derniere cellule remplie de la colonne K (NomPrenom) de la feuille "Clients"
        LastLig = .Cells(.Rows.Count, "K").End(xlUp).Row
        ' on fait un filtre automatique sur la colonne K de la feuille "Clients" avec comme critère VarNomPrenom
        .Range("K1:K" & LastLig).AutoFilter field:=1, Criteria1:=VarNomPrenom
        ' si au moins une ligne résultat du filtre (en plus de la ligne1 des titres)
        If .Range("K1:K" & LastLig).SpecialCells(xlCellTypeVisible).Count > 1 Then
            With .Range("K2:K" & LastLig).SpecialCells(xlCellTypeVisible).EntireRow
                ' on copie toutes les lignes visibles vers cDest (sauf la ligne des titres)
                .Copy cDest
            End With
        End If
        ' on enlève éventuel filtre automatique
        .AutoFilterMode = False
    End With
     
    'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
     
    With Worksheets("DoublonsTemp")
     
    ' test si cellule B2 est vide alors
    ' sortie de la procedure de remplissage automatique
        If IsEmpty(.Range("B2")) Then
           MsgBox ("RA0")
           Exit Sub
     
    ' test si cellule B2 n'est pas vide et si cellule B3 est vide alors
    ' appel procedure RA1
        ElseIf Not IsEmpty(.Range("B2")) And IsEmpty(.Range("B3")) Then
            MsgBox ("RA1")
            Call RA1
     
    ' test si cellule B2 n'est pas vide et si cellule B3 n'est pas vide alors
    ' appel procedure RA2
        ElseIf Not IsEmpty(.Range("B2")) And Not IsEmpty(.Range("B3")) Then
            MsgBox ("RA2")
            Call RA2
     
        End If
     
    End With
     
    End Sub
     
    Private Sub RA1()
     
    Dim c As Range
    Dim Lig As Long
    Dim VarNomPrenom As String
     
    VarNomPrenom = TextBox2Nom.Value + TextBox3Prenom.Value
     
    With Worksheets("Clients")
    Set c = .Columns(11).Find(VarNomPrenom, LookIn:=xlValues, lookat:=xlWhole)
        If Not c Is Nothing Then
            Lig = c.Row
            Me.TextBox18Adresse1 = .Range("F" & Lig)
            Me.TextBox19Adresse2 = .Range("G" & Lig)
            Me.TextBox20CodePostal = .Range("H" & Lig)
            Me.TextBox21Ville = .Range("I" & Lig)
            Me.TextBox4TelFixe = .Range("E" & Lig)
            Me.TextBox5TelMobile = .Range("E" & Lig)
        End If
    Set c = Nothing
    End With
     
    End Sub
     
    Private Sub RA2()
     
    ' je remplis les label Nom et prenom de Usf12
    UserForm12.Label6.Caption = UserForm1.TextBox2Nom.Value
    UserForm12.Label7.Caption = UserForm1.TextBox3Prenom.Value
     
    ' supprime donés existantes dans les combobox 1 et 2 de usf12
        UserForm12.ComboBox1.Clear
        UserForm12.ComboBox2.Clear
     
    ' je determine la derniere ligne de la colonne I (ville) de la feuille "DoublonsTemp"
    'With Worksheets("Doublonstemp")
        'DerLig = .Cells(.Rows.Count, "I").End(xlUp).Row
    'End With
     
    ' copie des colonnes I Ville et F Adresse1 de la feuille "DoublonsTemp"
    ' dans les colonnes A Ville et B Adresse1 de la feuille "Temp2"
    ' pour alimenter en cascade les combobox 1 et 2 de usf12
    Worksheets("DoublonsTemp").Range("I2:I100").Copy Worksheets("Temp2").Range("A2")
    Worksheets("DoublonsTemp").Range("F2:F100").Copy Worksheets("Temp2").Range("B2")
     
    ' tri des données de la feuille "Temp2" critère Ville ascendant
    With Worksheets("Temp2")
        .Range("A2:B100").Sort Key1:=.Range("A2"), Order1:=xlAscending, Key2:=.Range("B2"), Order2:=xlAscending, Header:=xlGuess
    End With
     
    'Définit la feuille contenant les données pour alimenter les combobox de usf12
    With Worksheets("Temp2")
     
        Dim NbLignes As Integer
        Dim i As Integer
        'Dim Plage As String
        'Dim Cell As Range
        'Dim Var1 As Integer
        Dim Varcbx1 As String
        Dim j As Integer
     
        'Définit le nombre de lignes dans la colonne A
        NbLignes = .Range("A65536").End(xlUp).Row
     
        'Remplissage du ComboBox1 de usf12
        ' avec filtrage des doublons en en laissant une occurence
        ' il en découlera le remplissage de combobox2 usf12     le code dans le usf12
     
        For i = 2 To Sheets("Temp2").Range("A65536").End(xlUp).Row
        UserForm12.ComboBox1 = Sheets("Temp2").Range("A" & i)
        If UserForm12.ComboBox1.ListIndex = -1 Then UserForm12.ComboBox1.AddItem Sheets("Temp2").Range("A" & i)
        Next i
     
    End With
     
    ' on supprime éventuel filtre auto sur la feuille "Clients"
    With Worksheets("Clients")
        .AutoFilterMode = False
    End With
     
    'affichage de usf12
    UserForm12.Show
     
    End Sub
    code de usf12 :

    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
     
    Option Explicit
     
    Dim Ws As Worksheet
    Dim NbLignes As Integer
     
     
    Private Sub CommandButton1_Click()
     
    End Sub
     
    Private Sub CommandButton1Valider_Click()
     
    ' on rempli les textbox de usf1 par les valeurs de combobox de usf12
    UserForm1.TextBox21Ville.Value = UserForm12.ComboBox1.Value
    UserForm1.TextBox18Adresse1.Value = UserForm12.ComboBox2.Value
     
    ' on supprime éventuel filtre sur feuille "Clients"
    Worksheets("Clients").AutoFilterMode = False
     
    ' on ferme le usf12
    UserForm12.Hide
     
    End Sub
     
    Private Sub UserForm_Initialize()
        'Définit la feuille contenant les données
        Set Ws = Worksheets("Temp2")
        'Définit le nombre de lignes dans la colonne A
        NbLignes = Ws.Range("A65536").End(xlUp).Row
     
        'Remplissage du ComboBox1
        'Alim_Combo 1
     
    End Sub
     
     
    Private Sub ComboBox1_Change()
        'Remplissage Combo2
        Alim_Combo 2, ComboBox1.Value
    End Sub
     
     
    'Private Sub ComboBox2_Change()
        'Remplissage Combo3
        'Alim_Combo 3, ComboBox2.Value
    'End Sub
     
     
    'Private Sub ComboBox3_Change()
     
     
        'Remplissage Combo4
        'Alim_Combo 4, ComboBox3.Value
    'End Sub
     
     
     
    'Procédure pour alimenter les ComboBox
    Private Sub Alim_Combo(CbxIndex As Integer, Optional Cible As Variant)
        Dim j As Integer
        Dim Obj As Control
     
        'Définit le ComboBox à remplir
        Set Obj = Me.Controls("ComboBox" & CbxIndex)
        'Supprime les anciennes données
        Obj.Clear
     
        'alimente le Combobox initial (Combobox1)
        'If CbxIndex = 1 Then
            'Boucle sur les lignes de la colonne A (à partir de la 2eme ligne)
            'For j = 2 To NbLignes
               'Obj = Ws.Range("A" & j)
                'Remplit le ComboBox sans doublons
                'If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("A" & j)
           ' Next j
        'Else
            'Alimentation conditionnelle des autres Combobox en fonction de
            'ce qui est sélectionnée dans le contrôle précédent:
            '(La sélection du ComboBox1 définit le contenu du ComboBox2,
            'La sélection du ComboBox2 définit le contenu du ComboBox3 ?etc...)
            For j = 2 To NbLignes
                If Ws.Range("A" & j).Offset(0, CbxIndex - 2) = Cible Then
                    Obj = Ws.Range("A" & j).Offset(0, CbxIndex - 1)
                    If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("A" & j).Offset(0, CbxIndex - 1)
                End If
            Next j
       'End If
     
       'Enlève la sélection dans le ComboBox
       Obj.ListIndex = -1
    End Sub

    merci d'avance pour votre aide


    ps : je peux fournir le fichier pour etude si vous le voulez

  2. #2
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par arthur83fr Voir le message
    ...
    ps : je peux fournir le fichier pour etude si vous le voulez
    non (voir : Fichier joint dans vos discussions) ... pas vraiment utile pour le moment ..

    essai plutôt de mieux cerner ton problème ... il y as beaucoup de code dans ton post...

    rajoute un point d'arrêt sur la ligne 40 de ton usf12 Alim_Combo 2, ComboBox1.Value , en double cliquant sur la marge gauche ...
    puis exécute ton code pas à pas grâce à la touche F
    8 en observant les valeurs de tes variables grâces aux infos bulles II-1-5. Info-bulle automatique
    et reviens nous voir si tu bloque encore...

  3. #3
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 70
    Par défaut
    bonjour,
    N'étant toujours pas un crack en vba et après avoir passé une journée sans me pencher sur ce fichier, je reviens vers vous avec une bonne nouvelle et plusieurs questions

    La bonne nouvelle c'est que cela semble fonctionner avec le code ci dessous

    a- J'ai juste supprimé la ligne 30 du code de usf12 précédemment posté
    b- J'ai inséré deux lignes au niveau de la ligne 68 code de usf12 précédemment posté cela correspond aux lignes 71 à 75 du code ci-dessous


    code de userform12
    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
     
     
    Option Explicit
     
    Dim Ws As Worksheet
    Dim NbLignes As Integer
     
     
    Private Sub CommandButton1_Click()
     
    End Sub
     
    Private Sub CommandButton1Valider_Click()
     
    ' on rempli les textbox de usf1 par les valeurs de combobox de usf12
    UserForm1.TextBox21Ville.Value = UserForm12.ComboBox1.Value
    UserForm1.TextBox18Adresse1.Value = UserForm12.ComboBox2.Value
     
    ' xxxxxxxxxxxxxxxxxx
    ' insertion ligne code de remplissage des champs adresse2, code postal, tel fix et mob dans usf1
     
     
     
     
    ' on supprime éventuel filtre sur feuille "Clients"
    Worksheets("Clients").AutoFilterMode = False
     
    ' on ferme le usf12
    UserForm12.Hide
     
    End Sub
     
    Private Sub UserForm_Initialize()
        'Définit la feuille contenant les données
        Set Ws = Worksheets("Temp2")
        'Définit le nombre de lignes dans la colonne A
        'NbLignes = Ws.Range("A65536").End(xlUp).Row
     
        'Remplissage du ComboBox1
        'Alim_Combo 1
     
    End Sub
     
     
    Private Sub ComboBox1_Change()
        'Remplissage Combo2
        Alim_Combo 2, ComboBox1.Value
    End Sub
     
     
    'Private Sub ComboBox2_Change()
        'Remplissage Combo3
        'Alim_Combo 3, ComboBox2.Value
    'End Sub
     
     
    'Private Sub ComboBox3_Change()
     
     
        'Remplissage Combo4
        'Alim_Combo 4, ComboBox3.Value
    'End Sub
     
     
     
    'Procédure pour alimenter les ComboBox
    Private Sub Alim_Combo(CbxIndex As Integer, Optional Cible As Variant)
        Dim j As Integer
        Dim Obj As Control
     
     'Définit la feuille contenant les données
        Set Ws = Worksheets("Temp2")
     
     'Définit le nombre de lignes dans la colonne A
        NbLignes = Worksheets("Temp2").Range("A65536").End(xlUp).Row
     
     
        'Définit le ComboBox à remplir
        Set Obj = Me.Controls("ComboBox" & CbxIndex)
        'Supprime les anciennes données
        Obj.Clear
     
        'alimente le Combobox initial (Combobox1)
        'If CbxIndex = 1 Then
            'Boucle sur les lignes de la colonne A (à partir de la 2eme ligne)
            'For j = 2 To NbLignes
               'Obj = Ws.Range("A" & j)
                'Remplit le ComboBox sans doublons
                'If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("A" & j)
           ' Next j
        'Else
            'Alimentation conditionnelle des autres Combobox en fonction de
            'ce qui est sélectionnée dans le contrôle précédent:
            '(La sélection du ComboBox1 définit le contenu du ComboBox2,
            'La sélection du ComboBox2 définit le contenu du ComboBox3 ?etc...)
            For j = 2 To NbLignes
                If Worksheets("Temp2").Range("A" & j).Offset(0, CbxIndex - 2) = Cible Then
                    Obj = Worksheets("Temp2").Range("A" & j).Offset(0, CbxIndex - 1)
                    If Obj.ListIndex = -1 Then Obj.AddItem Worksheets("Temp2").Range("A" & j).Offset(0, CbxIndex - 1)
                End If
            Next j
       'End If
     
       'Enlève la sélection dans le ComboBox
       Obj.ListIndex = -1
     
    End Sub
    Par contre au niveau des lignes 97 à 99 du code ci-dessus
    J'ai remplacé "Ws" par "Worksheets("Temp2")" car sinon j'obtenais le message suivant a l'aide de l'info bulle : Ws.Range("A"&j).Of… La methode 'range' de l'objet '_Worksheet' a échouée

    Par contre cela ne m'empechait pas d'obtenir le résultat voulu sont elles vraiment utile ?

    Pouvez-vous m'éclairer sur ce point ? Merci

  4. #4
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par arthur83fr Voir le message
    .. après avoir passé une journée sans me pencher sur ce fichier, je reviens vers vous avec une bonne nouvelle et plusieurs questions...
    tu devrais t'y pencher dessus ... il y as une raison qui t'as poussé as faire ces modifications ? tu as essayé le mode pas à pas ..?

  5. #5
    Membre actif
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Juillet 2011
    Messages : 70
    Par défaut
    bonjour,

    alors oui j'ai essayé le mode pas a pas et c'est d'ailleurs ce qui ma poussé a inserer les lignes 71 a 75

    je me suis posé la question si le fait que le Ws déclaré en ligne 35 ne soit pas pris en compte du au fait que je le déclarais dans une "Private Sub" ce qui faisait que sur les lignes 97 à 99 il soit ignoré

    je précise que les lignes de code concernant l usf12 sont adapté d'un post de SilkyRoad

Discussions similaires

  1. [4D 2003] Fenêtre qui ne se remplit pas!
    Par magellan dans le forum 4D
    Réponses: 2
    Dernier message: 05/06/2013, 10h13
  2. Bouton et background-image qui ne le remplit pas
    Par cyrano_de_bergerac dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 08/04/2011, 10h32
  3. [AC-2007] champ dans formulaire qui ne se remplit pas
    Par pepsister dans le forum IHM
    Réponses: 4
    Dernier message: 05/09/2010, 12h51
  4. [JPA / Hibernate] Cascade qui ne cascade pas !
    Par dazz_x dans le forum Persistance des données
    Réponses: 1
    Dernier message: 11/09/2007, 13h35
  5. Réponses: 23
    Dernier message: 20/02/2007, 10h34

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