Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/12/2011, 10h30   #1
Invité de passage
 
Homme
retraité
Inscription : juillet 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : retraité

Informations forums :
Inscription : juillet 2011
Messages : 28
Points : 4
Points : 4
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 :
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 :
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
arthur83fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2011, 10h34   #2
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
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...
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2011, 15h57   #3
Invité de passage
 
Homme
retraité
Inscription : juillet 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : retraité

Informations forums :
Inscription : juillet 2011
Messages : 28
Points : 4
Points : 4
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 :
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
arthur83fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2011, 16h09   #4
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 849
Points : 16 849
Envoyer un message via Skype™ à bbil
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 ..?
bbil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/12/2011, 16h43   #5
Invité de passage
 
Homme
retraité
Inscription : juillet 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : retraité

Informations forums :
Inscription : juillet 2011
Messages : 28
Points : 4
Points : 4
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
arthur83fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h13.


 
 
 
 
Partenaires

Hébergement Web