Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

ComboBox en cascade

4 réponses
Avatar
Jean-Paul V
Bonjour à tous
J’ai dans une feuille les champs dynamiques fournisseur et montant
respectivement en colonne A et C
Dans un Userform des ComboBox nommés fournisseurs et montants et des TextBox
nommés fournisseur et montant
J’ai cette macro qui fonctionne :
Private Sub fournisseurs_Change()
If Me.fournisseurs.Value <> "" Then
Me.fournisseur = fournisseurs.Value
MonFournisseur = Me.fournisseur
Me.fournisseurs.ListIndex = -1
'MAJ du ComboBox Montants afin de ne montrer que les montants de ce
fournisseur
Set MonDico = CreateObject("Scripting.Dictionary")
For i = 1 To Range("montant").Count
If Range("fournisseur")(i) = Me.fournisseur Then
temp = Range("montant")(i)
If Not MonDico.Exists(temp) Then MonDico.Add temp, temp
End If
Next i
temp = MonDico.items
Call Tri(temp, LBound(temp), UBound(temp))
Me.Montants.List = temp
Me.Montants.ListIndex = -1
Pourquoi l’opération inverse c’est à dire d’abord sélectionner le montant et
donc faire la liste des fournisseurs pour ce montant ne marche pas ?
Private Sub Montants_Change()
If Me.Montants.Value <> "" Then
Me.Montant = Montants.Value
MonMontant = Montants.Value
MonFournisseur = Me.fournisseur
If Me.fournisseur = "" Then
'Mettre à jour Combobox Fournisseurs but ne montrer que les fournisseurs
avec ce montant
Set MonDico = CreateObject("Scripting.Dictionary")
For i = 1 To Range("fournisseur").Count
' If Range("montant")(i) = Me.Montant Then 'ne marche pas
If Range("montant")(i) = Me.Montants.Value Then 'ne marche pas
' If Range("montant")(i) = Montants.Value Then 'ne marche pas
temp = Range("fournisseur")(i)
If Not MonDico.Exists(temp) Then MonDico.Add temp, temp
End If
Next i
temp = MonDico.items
' Call Tri(temp, LBound(temp), UBound(temp)) 'se plante car pas de liste?
' Me.fournisseurs.List = MonDico.items ‘ne marche pas non plus
Me.fournisseurs.List = temp
Me.fournisseurs.ListIndex = -1

Où est l’erreur ?
NB : j’ai essayé en neutralisant If Me.fournisseur = "" Then, cela ne
marche pas mieux.

à + j’espère

--
Jean-Paul V

4 réponses

Avatar
michdenis
Bonjour Jean-Paul,

Tu as un petit exemple avec 2 combobox :

http://cjoint.com/?kdnHm2xthI





"Jean-Paul V" a écrit dans le message de groupe de
discussion :
Bonjour à tous
J’ai dans une feuille les champs dynamiques fournisseur et montant
respectivement en colonne A et C
Dans un Userform des ComboBox nommés fournisseurs et montants et des TextBox
nommés fournisseur et montant
J’ai cette macro qui fonctionne :
Private Sub fournisseurs_Change()
If Me.fournisseurs.Value <> "" Then
Me.fournisseur = fournisseurs.Value
MonFournisseur = Me.fournisseur
Me.fournisseurs.ListIndex = -1
'MAJ du ComboBox Montants afin de ne montrer que les montants de ce
fournisseur
Set MonDico = CreateObject("Scripting.Dictionary")
For i = 1 To Range("montant").Count
If Range("fournisseur")(i) = Me.fournisseur Then
temp = Range("montant")(i)
If Not MonDico.Exists(temp) Then MonDico.Add temp, temp
End If
Next i
temp = MonDico.items
Call Tri(temp, LBound(temp), UBound(temp))
Me.Montants.List = temp
Me.Montants.ListIndex = -1
Pourquoi l’opération inverse c’est à dire d’abord sélectionner le montant et
donc faire la liste des fournisseurs pour ce montant ne marche pas ?
Private Sub Montants_Change()
If Me.Montants.Value <> "" Then
Me.Montant = Montants.Value
MonMontant = Montants.Value
MonFournisseur = Me.fournisseur
If Me.fournisseur = "" Then
'Mettre à jour Combobox Fournisseurs but ne montrer que les fournisseurs
avec ce montant
Set MonDico = CreateObject("Scripting.Dictionary")
For i = 1 To Range("fournisseur").Count
' If Range("montant")(i) = Me.Montant Then 'ne marche pas
If Range("montant")(i) = Me.Montants.Value Then 'ne marche pas
' If Range("montant")(i) = Montants.Value Then 'ne marche pas
temp = Range("fournisseur")(i)
If Not MonDico.Exists(temp) Then MonDico.Add temp, temp
End If
Next i
temp = MonDico.items
' Call Tri(temp, LBound(temp), UBound(temp)) 'se plante car pas de liste?
' Me.fournisseurs.List = MonDico.items ‘ne marche pas non plus
Me.fournisseurs.List = temp
Me.fournisseurs.ListIndex = -1

Où est l’erreur ?
NB : j’ai essayé en neutralisant If Me.fournisseur = "" Then, cela ne
marche pas mieux.

à + j’espère

--
Jean-Paul V
Avatar
Jean-Paul V
Bonjour michdenis
Merci pour ce fichier.
J’ai avec ton fichier un sacré os à ronger, vu mon niveau, je pense que je
vais y passer du temp.
Je suis un peu comme face à un Picasso, très impressionné, il me reste
ensuite à reconstituer tous les morceaux pour essayer d’expliquer l’effet
produit.
Bonne journée

--
Jean-Paul V


"michdenis" wrote:

Bonjour Jean-Paul,

Tu as un petit exemple avec 2 combobox :

http://cjoint.com/?kdnHm2xthI





"Jean-Paul V" a écrit dans le message de groupe de
discussion :
Bonjour à tous
J’ai dans une feuille les champs dynamiques fournisseur et montant
respectivement en colonne A et C
Dans un Userform des ComboBox nommés fournisseurs et montants et des TextBox
nommés fournisseur et montant
J’ai cette macro qui fonctionne :
Private Sub fournisseurs_Change()
If Me.fournisseurs.Value <> "" Then
Me.fournisseur = fournisseurs.Value
MonFournisseur = Me.fournisseur
Me.fournisseurs.ListIndex = -1
'MAJ du ComboBox Montants afin de ne montrer que les montants de ce
fournisseur
Set MonDico = CreateObject("Scripting.Dictionary")
For i = 1 To Range("montant").Count
If Range("fournisseur")(i) = Me.fournisseur Then
temp = Range("montant")(i)
If Not MonDico.Exists(temp) Then MonDico.Add temp, temp
End If
Next i
temp = MonDico.items
Call Tri(temp, LBound(temp), UBound(temp))
Me.Montants.List = temp
Me.Montants.ListIndex = -1
Pourquoi l’opération inverse c’est à dire d’abord sélectionner le montant et
donc faire la liste des fournisseurs pour ce montant ne marche pas ?
Private Sub Montants_Change()
If Me.Montants.Value <> "" Then
Me.Montant = Montants.Value
MonMontant = Montants.Value
MonFournisseur = Me.fournisseur
If Me.fournisseur = "" Then
'Mettre à jour Combobox Fournisseurs but ne montrer que les fournisseurs
avec ce montant
Set MonDico = CreateObject("Scripting.Dictionary")
For i = 1 To Range("fournisseur").Count
' If Range("montant")(i) = Me.Montant Then 'ne marche pas
If Range("montant")(i) = Me.Montants.Value Then 'ne marche pas
' If Range("montant")(i) = Montants.Value Then 'ne marche pas
temp = Range("fournisseur")(i)
If Not MonDico.Exists(temp) Then MonDico.Add temp, temp
End If
Next i
temp = MonDico.items
' Call Tri(temp, LBound(temp), UBound(temp)) 'se plante car pas de liste?
' Me.fournisseurs.List = MonDico.items ‘ne marche pas non plus
Me.fournisseurs.List = temp
Me.fournisseurs.ListIndex = -1

Où est l’erreur ?
NB : j’ai essayé en neutralisant If Me.fournisseur = "" Then, cela ne
marche pas mieux.

à + j’espère

--
Jean-Paul V



Avatar
Jean-Paul V
Bonjour michdenis,
En m’inspirant de ton fichier, j’ai utilisé ta function ListeCmb pour
initialiser mon Userform.
C’est formidable, c’est beaucoup plus court.
Par rapport à votre fichier, Combobox1 devient fournisseurs , Combobox2
devient montants.
Pour mes titres j’ai fournisseur au lieu de fonction et montant au lieu de
contact
Cela donne :
Private Sub UserForm_Initialize()
Me.Caption = ThisWorkbook.Name
Ok = True
'Plage où sont les données
With Worksheets("exemple")
Set Rg = .Range("A1:C" & .Range("A65536").End(xlUp).Row)
End With

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & ";" & _
"Extended Properties=""Excel 8.0;HDR=Yes;"""
'Mise à jour des ComboBox et des ListBox grace à cette fonction géniale du
module 1

Me.fournisseurs.List = ListeCmb(Rg, "fournisseur")
Me.DatesCommande.List = ListeCmb(Rg, "DateCommande")
Me.Montants.List = ListeCmb(Rg, "montant")
'MAJ Combobox Quantièmes NB : il faut trouver autre chose ça fait tache
[RQuantièmes].ClearContents 'vider le champ dynamique en BB
a = 2
For i = 1 To Range("fournisseur").Count
' For i = 1 To Nb 'Nb est une variable dans la fonction ListeCmb ce
n'est pas la bonne 19 ?
Range("BB" & a) = i
a = a + 1
Next i
Formulaire.Quantièmes.RowSource = "RQuantièmes"
NB :1) j’ai dû changer mon titre date commande en DateCommande car avec le
blanc cela ne marche pas.
2) J’ai espéré utiliser Nb pour faire mon Combo Quantième mais Nb me
donne un chiffre faux car pour un fournisseur je peux avoir plusieurs fois le
même montant.
Mais après les PB commencent mon Combo Quantième est faux dans les 2 Change
Private Sub fournisseurs_Change()
If Me.fournisseurs.Value <> "" Then
Me.fournisseur = fournisseurs.Value
MonFournisseur = Me.fournisseur
Mettre à jour Combobox Quantièmes but ne montrer que le bon nbre de Cdes de
ce fsseur
If Me.Montant = "" Then ' le montant n'est pas documenté la suite ne
marche plus
' [AZ3] = Nb ' nous n'avons pas le nbre de commandes pour ce fsseur
' formule = "=SUM((fournisseur=" & """" & MonFournisseur & """" &
")*(fournisseur=" & """" & MonFournisseur & """" & "))" 'permet de
déterminer le nombre de commande
[RQuantièmes].ClearContents 'vider le champ dynamique en BB
formule = "=SUMPRODUCT((fournisseur=" & """" & MonFournisseur & """"
& ")*(fournisseur=" & """" & MonFournisseur & """" & "))" 'permet de
déterminer le nombre de commande
[AZ3] = Evaluate(formule) 'faux trouve 4 au lieu de 6 donc la suite
ne marche plus?

End If
If Ok = False Then Exit Sub ‘ce qui suit fonctionne, c’est ta macro
Ok = True
If Me.fournisseurs.ListIndex <> -1 Then
'MAJ du ComboBox Montants afin de ne montrer que les montants de ce
fournisseur
Me.Montants.List = ListeCmb(Rg, "montant", "fournisseur", Me.fournisseurs)
Me.Montants.Value = ""
End If
Ok = False
'
Else
'ne rien faire
End If
End Sub
Mais si on sélectionne d’abord le montant ça se plante
Private Sub Montants_Change()
'BloquerUtilisationList
If Me.Montants.Value <> "" Then
Me.Montant = Me.Montants.Value
MonMontant = Me.Montants.Value
MonFournisseur = Me.fournisseur
'Mettre à jour Combobox Quantièmes ne marche pas
If Ok = False Then Exit Sub ‘ta macro, la suite se plante
Ok = True
If Me.Montants.ListIndex <> -1 Then
Me.fournisseurs.List = ListeCmb(Rg, "founisseur", "montant", Me.Montants)
Ok = False
Me.fournisseurs.ListIndex = 0
Me.fournisseurs.Value = Me.fournisseurs.List(, Me.fournisseurs.ListIndex)
End If
Ok = False
End If
End Sub
Cela se plante sur Rst.Open Requete, Conn, adOpenStatic, adLockOptimistic
Aucune valeur donnée pour un ou plusieurs paramètres requis. ! !
1 ) Quelles sont les erreurs dans Montants_Change()
2 ) Comment traiter le Pb du Combo Quantièmes sans passer par le range
RQuantièmes?
http://cjoint.com/?kgicTgNyHj
à+ j'espère


--
Jean-Paul V


"michdenis" wrote:

Bonjour Jean-Paul,

Tu as un petit exemple avec 2 combobox :

http://cjoint.com/?kdnHm2xthI





"Jean-Paul V" a écrit dans le message de groupe de
discussion :
Bonjour à tous
J’ai dans une feuille les champs dynamiques fournisseur et montant
respectivement en colonne A et C
Dans un Userform des ComboBox nommés fournisseurs et montants et des TextBox
nommés fournisseur et montant
J’ai cette macro qui fonctionne :
Private Sub fournisseurs_Change()
If Me.fournisseurs.Value <> "" Then
Me.fournisseur = fournisseurs.Value
MonFournisseur = Me.fournisseur
Me.fournisseurs.ListIndex = -1
'MAJ du ComboBox Montants afin de ne montrer que les montants de ce
fournisseur
Set MonDico = CreateObject("Scripting.Dictionary")
For i = 1 To Range("montant").Count
If Range("fournisseur")(i) = Me.fournisseur Then
temp = Range("montant")(i)
If Not MonDico.Exists(temp) Then MonDico.Add temp, temp
End If
Next i
temp = MonDico.items
Call Tri(temp, LBound(temp), UBound(temp))
Me.Montants.List = temp
Me.Montants.ListIndex = -1
Pourquoi l’opération inverse c’est à dire d’abord sélectionner le montant et
donc faire la liste des fournisseurs pour ce montant ne marche pas ?
Private Sub Montants_Change()
If Me.Montants.Value <> "" Then
Me.Montant = Montants.Value
MonMontant = Montants.Value
MonFournisseur = Me.fournisseur
If Me.fournisseur = "" Then
'Mettre à jour Combobox Fournisseurs but ne montrer que les fournisseurs
avec ce montant
Set MonDico = CreateObject("Scripting.Dictionary")
For i = 1 To Range("fournisseur").Count
' If Range("montant")(i) = Me.Montant Then 'ne marche pas
If Range("montant")(i) = Me.Montants.Value Then 'ne marche pas
' If Range("montant")(i) = Montants.Value Then 'ne marche pas
temp = Range("fournisseur")(i)
If Not MonDico.Exists(temp) Then MonDico.Add temp, temp
End If
Next i
temp = MonDico.items
' Call Tri(temp, LBound(temp), UBound(temp)) 'se plante car pas de liste?
' Me.fournisseurs.List = MonDico.items ‘ne marche pas non plus
Me.fournisseurs.List = temp
Me.fournisseurs.ListIndex = -1

Où est l’erreur ?
NB : j’ai essayé en neutralisant If Me.fournisseur = "" Then, cela ne
marche pas mieux.

à + j’espère

--
Jean-Paul V



Avatar
michdenis
C'est quoi ta question ?

Si tu t'attends à ce que je débogue ton application et toutes
les situations problèmes de ton fichier en mettant ton
fichier en ligne... tu n'es pas à la bonne adresse !
si tu prends le temps de formuler une question qui ne me
demande pas de passer en revue l'ensemble du code du fichier
alors... je veux bien voir.... !

| NB :1) j’ai dû changer mon titre date commande en
| DateCommande car avec le blanc cela ne marche pas.

*** Si le nom du champ contient un espace, il faut mettre
le nom du champ en crochet droit [Nom Champ]

Tu utilises une formule "sommeprod" ... fonctionne-t-elle lorsque
tu l'insères dans une cellule ? Sinon, explique ce que tu cherches et
le résultat attendu.

Quant à ton problème de requête... Explique les manipulations que
tu fais qui mène au "bug" ... je ne vais pas tout tester pour trouver
ce qui cause problème !






"Jean-Paul V" a écrit dans le message de groupe de
discussion :
Bonjour michdenis,
En m’inspirant de ton fichier, j’ai utilisé ta function ListeCmb pour
initialiser mon Userform.
C’est formidable, c’est beaucoup plus court.
Par rapport à votre fichier, Combobox1 devient fournisseurs , Combobox2
devient montants.
Pour mes titres j’ai fournisseur au lieu de fonction et montant au lieu de
contact
Cela donne :
Private Sub UserForm_Initialize()
Me.Caption = ThisWorkbook.Name
Ok = True
'Plage où sont les données
With Worksheets("exemple")
Set Rg = .Range("A1:C" & .Range("A65536").End(xlUp).Row)
End With

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & ";" & _
"Extended Properties=""Excel 8.0;HDR=Yes;"""
'Mise à jour des ComboBox et des ListBox grace à cette fonction géniale du
module 1

Me.fournisseurs.List = ListeCmb(Rg, "fournisseur")
Me.DatesCommande.List = ListeCmb(Rg, "DateCommande")
Me.Montants.List = ListeCmb(Rg, "montant")
'MAJ Combobox Quantièmes NB : il faut trouver autre chose ça fait tache
[RQuantièmes].ClearContents 'vider le champ dynamique en BB
a = 2
For i = 1 To Range("fournisseur").Count
' For i = 1 To Nb 'Nb est une variable dans la fonction ListeCmb ce
n'est pas la bonne 19 ?
Range("BB" & a) = i
a = a + 1
Next i
Formulaire.Quantièmes.RowSource = "RQuantièmes"
NB :1) j’ai dû changer mon titre date commande en DateCommande car avec le
blanc cela ne marche pas.
2) J’ai espéré utiliser Nb pour faire mon Combo Quantième mais Nb me
donne un chiffre faux car pour un fournisseur je peux avoir plusieurs fois le
même montant.
Mais après les PB commencent mon Combo Quantième est faux dans les 2 Change
Private Sub fournisseurs_Change()
If Me.fournisseurs.Value <> "" Then
Me.fournisseur = fournisseurs.Value
MonFournisseur = Me.fournisseur
Mettre à jour Combobox Quantièmes but ne montrer que le bon nbre de Cdes de
ce fsseur
If Me.Montant = "" Then ' le montant n'est pas documenté la suite ne
marche plus
' [AZ3] = Nb ' nous n'avons pas le nbre de commandes pour ce fsseur
' formule = "=SUM((fournisseur=" & """" & MonFournisseur & """" &
")*(fournisseur=" & """" & MonFournisseur & """" & "))" 'permet de
déterminer le nombre de commande
[RQuantièmes].ClearContents 'vider le champ dynamique en BB
formule = "=SUMPRODUCT((fournisseur=" & """" & MonFournisseur & """"
& ")*(fournisseur=" & """" & MonFournisseur & """" & "))" 'permet de
déterminer le nombre de commande
[AZ3] = Evaluate(formule) 'faux trouve 4 au lieu de 6 donc la suite
ne marche plus?

End If
If Ok = False Then Exit Sub ‘ce qui suit fonctionne, c’est ta macro
Ok = True
If Me.fournisseurs.ListIndex <> -1 Then
'MAJ du ComboBox Montants afin de ne montrer que les montants de ce
fournisseur
Me.Montants.List = ListeCmb(Rg, "montant", "fournisseur", Me.fournisseurs)
Me.Montants.Value = ""
End If
Ok = False
'
Else
'ne rien faire
End If
End Sub
Mais si on sélectionne d’abord le montant ça se plante
Private Sub Montants_Change()
'BloquerUtilisationList
If Me.Montants.Value <> "" Then
Me.Montant = Me.Montants.Value
MonMontant = Me.Montants.Value
MonFournisseur = Me.fournisseur
'Mettre à jour Combobox Quantièmes ne marche pas
If Ok = False Then Exit Sub ‘ta macro, la suite se plante
Ok = True
If Me.Montants.ListIndex <> -1 Then
Me.fournisseurs.List = ListeCmb(Rg, "founisseur", "montant", Me.Montants)
Ok = False
Me.fournisseurs.ListIndex = 0
Me.fournisseurs.Value = Me.fournisseurs.List(, Me.fournisseurs.ListIndex)
End If
Ok = False
End If
End Sub
Cela se plante sur Rst.Open Requete, Conn, adOpenStatic, adLockOptimistic
Aucune valeur donnée pour un ou plusieurs paramètres requis. ! !
1 ) Quelles sont les erreurs dans Montants_Change()
2 ) Comment traiter le Pb du Combo Quantièmes sans passer par le range
RQuantièmes?
http://cjoint.com/?kgicTgNyHj
à+ j'espère


--
Jean-Paul V


"michdenis" wrote:

Bonjour Jean-Paul,

Tu as un petit exemple avec 2 combobox :

http://cjoint.com/?kdnHm2xthI





"Jean-Paul V" a écrit dans le message de groupe de
discussion :
Bonjour à tous
J’ai dans une feuille les champs dynamiques fournisseur et montant
respectivement en colonne A et C
Dans un Userform des ComboBox nommés fournisseurs et montants et des TextBox
nommés fournisseur et montant
J’ai cette macro qui fonctionne :
Private Sub fournisseurs_Change()
If Me.fournisseurs.Value <> "" Then
Me.fournisseur = fournisseurs.Value
MonFournisseur = Me.fournisseur
Me.fournisseurs.ListIndex = -1
'MAJ du ComboBox Montants afin de ne montrer que les montants de ce
fournisseur
Set MonDico = CreateObject("Scripting.Dictionary")
For i = 1 To Range("montant").Count
If Range("fournisseur")(i) = Me.fournisseur Then
temp = Range("montant")(i)
If Not MonDico.Exists(temp) Then MonDico.Add temp, temp
End If
Next i
temp = MonDico.items
Call Tri(temp, LBound(temp), UBound(temp))
Me.Montants.List = temp
Me.Montants.ListIndex = -1
Pourquoi l’opération inverse c’est à dire d’abord sélectionner le montant et
donc faire la liste des fournisseurs pour ce montant ne marche pas ?
Private Sub Montants_Change()
If Me.Montants.Value <> "" Then
Me.Montant = Montants.Value
MonMontant = Montants.Value
MonFournisseur = Me.fournisseur
If Me.fournisseur = "" Then
'Mettre à jour Combobox Fournisseurs but ne montrer que les fournisseurs
avec ce montant
Set MonDico = CreateObject("Scripting.Dictionary")
For i = 1 To Range("fournisseur").Count
' If Range("montant")(i) = Me.Montant Then 'ne marche pas
If Range("montant")(i) = Me.Montants.Value Then 'ne marche pas
' If Range("montant")(i) = Montants.Value Then 'ne marche pas
temp = Range("fournisseur")(i)
If Not MonDico.Exists(temp) Then MonDico.Add temp, temp
End If
Next i
temp = MonDico.items
' Call Tri(temp, LBound(temp), UBound(temp)) 'se plante car pas de liste?
' Me.fournisseurs.List = MonDico.items ‘ne marche pas non plus
Me.fournisseurs.List = temp
Me.fournisseurs.ListIndex = -1

Où est l’erreur ?
NB : j’ai essayé en neutralisant If Me.fournisseur = "" Then, cela ne
marche pas mieux.

à + j’espère

--
Jean-Paul V