• Initiateur de la discussion Initiateur de la discussion vmax67
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

vmax67

XLDnaute Occasionnel
Bonjour à tous,
je bute sur un soucis d'alimentation de mes combobox.
Le premier combo doit être alimenté par la colonne B par ordre croissant sans doublon.
Le deuxième combo doit être alimenté après validation du combo1 par la colonne C par ordre croissant
ensuite après validation du combo2 ont alimente la combo3 par la colonne D par ordre croissant et pour
terminer la textbox 1 doit afficher la valeur de la colonne E après validation de combo3.

Peut'on également concaténer dans la combo 1 la valeur numérique de la colonne B avec sont équivalence texte
de l'onglet région.
exemple le combo propose 1 ça donne 1 avec texte Alsace (info dans onglet région)
idem pour région si 68 ça donne 68 avec texte Rhône (info dans onglet Cdb)

Voir fichier
 

Pièces jointes

Re : Combobox en cascade

Bonjour.

Voyez si ça vous convient.
Je regarde encore s'il est possible de mettre le nom de la région.

P.S. Oui c'est possible avec :
VB:
Private Sub UserForm_Initialize()
Dim Tv(), R(1 To 50) As String, L As Long
Set CC = New ComboBoxCasc
CC.Plage Feuil3.[A2]
CC.Add Me.Region, "B"
CC.Add Me.Département, "C"
CC.Add Me.NumVille, "D"
'CC.Actualiser remplacé par :
Tv = PlgUti(Feuil4.[A1]).Value
For L = 1 To UBound(Tv): R(Tv(L, 1)) = Format(Tv(L, 1), "00") & " - " & Tv(L, 2): Next L
TabDico = ColUti(Feuil3.[B2:D2]).Value
For L = 1 To UBound(TabDico): TabDico(L, 1) = R(TabDico(L, 1)): Next L
CC.DicArbo LeDictArbo
End Sub
 

Pièces jointes

Dernière édition:
Re : Combobox en cascade

Oh oui, si vous avez les correspondance dans d'autres tables vous pouvez profiter de la boucle pour refondre entièrement les 3 colonnes de TabDico sur le même principe.
Quel rapport voyez vous entre les colonnes de recherches spécifiées aux CC.Add qui serait à changer et la colonne à restituer dans la TextBox ? c'est sans doute simplement le 5 à remplacer par 1 dans la CC_BingoUn
 
Dernière édition:
Re : Combobox en cascade

Non c'est pas ça

Dans le textbox 3 après validation du textbox 2 doit apparaitre la valeur de la colonne "A" en celle de "D"
Comment faire apparaitre le nom du département dans le textbox 2 à coté du n° de département !!

Merci
 
Re : Combobox en cascade

Oh pardon je voulais dire combobox 3 après validation du Combo2 et non des textbox
Dur dur
Je ne suis pas expert en code VB, donc comment faire afficher le département dans la Combobox2
et les valeur de la colonne "A" dans la combobox 3 après validation de la combo 2

Merci
 
Re : Combobox en cascade

C'est plus compliqué à cause des départements 2A et 2B. On pourrait s'en sortir par un accès toujours encore direct en prenant l'interprétation hexadécimale, mais après on tombe sur les 974 qui ne figurent pas dans la Cdb
Je ne sais pas, mais cette feuille Ville ne me semble pas destinée à bouger beaucoup. Ne pourriez vous y mettre directement ce que vous souhaiteriez retrouver dans les ComboBox ?

Sinon on peut y arriver plus facilement, au fond, avec un petit Dictionary :
VB:
Private Sub UserForm_Initialize()
Dim Tv(), Région(1 To 50) As String, Déptmt As New Dictionary, L As Long, N As Long
Set CC = New ComboBoxCasc
CC.Plage Feuil3.[A2]
CC.Add Me.Region, "B"
CC.Add Me.Département, "C"
CC.Add Me.NumVille, "D"
'CC.Actualiser remplacé par :
Tv = PlgUti(Feuil4.[A1]).Value
For L = 1 To UBound(Tv): Région(Tv(L, 1)) = Format(Tv(L, 1), "00") & " - " & Tv(L, 2): Next L
Tv = PlgUti(Feuil5.[A2]).Value
For L = 1 To UBound(Tv): Déptmt.Add Tv(L, 1), Right$("0" & Tv(L, 1), 2) & " - " & Tv(L, 2): Next L
TabDico = ColUti(Feuil3.[B2:D2]).Value
For L = 1 To UBound(TabDico)
   TabDico(L, 1) = Région(TabDico(L, 1))
   TabDico(L, 2) = Déptmt(TabDico(L, 2)): Next L
CC.DicArbo LeDictArbo
End Sub
 
Dernière édition:
Re : Combobox en cascade

Bonjour et merci

c'est presque parfait.

Mais j'ai toujours ce soucis d'affichage de la mauvaise colonne dans le combo3
çà affiche les valeurs de la colonne "D" alors qu'il me faut les valeurs de la colonne "A"

j'ai également essayé d'ajouter un 3ème dictionnaire qui fait le lien entre numville et et le nom de la ville qui
correspond à ce même numville

Exemple dans combo1 on affiche 1 + Alsace ça c'est bon
Exemple dans combo2 on affiche 68 + Rhône ça c'est bon
Exemple dans combo3 on affiche 1016 + Nice, mais la çà ne fonctionne pas

Private Sub UserForm_Initialize()
Dim Tv(), Région(1 To 50) As String, Déptmt As New Dictionary, NumVille As New Dictionary, L As Long, N As Long
Set CC = New ComboBoxCasc
CC.Plage Feuil3.[A2]
CC.Add Me.Region, "B"
CC.Add Me.Département, "C"
CC.Add Me.NumVille, "D" remplacer D par A
'CC.Actualiser remplacé par :

Tv = PlgUti(Feuil4.[A1]).Value
For L = 1 To UBound(Tv): Région(Tv(L, 1)) = Format(Tv(L, 1), "00") & " - " & Tv(L, 2): Next L

Tv = PlgUti(Feuil5.[A2]).Value
For L = 1 To UBound(Tv): Déptmt.Add Tv(L, 1), Right$("0" & Tv(L, 1), 2) & " - " & Tv(L, 2): Next L

Tv = PlgUti(Feuil3.[A2]).Value
For L = 1 To UBound(Tv): NumVille.Add Tv(L, 1), Right$("0" & Tv(L, 2), 1) & " - " & Tv(L, 2): Next L

TabDico = ColUti(Feuil3.[B2😀2]).Value
For L = 1 To UBound(TabDico)
TabDico(L, 1) = Région(TabDico(L, 1))
TabDico(L, 2) = Déptmt(TabDico(L, 2))
TabDico(L, 3) = NumVille(TabDico(L, 3)): Next L
CC.DicArbo LeDictArbo
End Sub

En gras les modifs du code par rapport à votre code

Merci pour votre aide

Vmax
 
Re : Combobox en cascade

Bonjour.
Non, on n'affiche "pas "1 + Alsace" mais "01 - ALSACE" sans cela il risquerait dans le ComboBox d'être suivi de 10 - LANGEDOC ROUSSLLION puis 11 - LORAINE. Le 2 - BRETAGNE, quant à lui, ne viendrait qu'après 19 - MEDITERRANÉE. Il met ensemble tout ce qui commence par "0" puis tous les "1", en dernier tous les "2".
Est-ce que ce ne serait pas plus pratique de ne mettre que le nom de la région ? comme ça elle serait classées par ordre alpha et puis c'est tout !
Eh bien mettez "A" au lieu de dire qu'il faut remplacer D par A
Même remarque pour la ville que pour la région mettez donc juste son nom ! S'il faut quand même le numéro devant qui peut aller jusqu'à 23020 et que c'est sur ce numéro que ça doit apparaître classé dans le ComboBox, mettez Format(Tv(L, 1), "00000") et pas un Right$("0" & Tv(L, etc. Ça, on a seulement été obligé de le faire pour les départements à cause de ces satanés 2A et 2B qui ne sont pas supportés par la fonction Format. Vous pourriez aussi, s'il les faut, mettre les numéros derrière, entre parenthèses par exemple comme ça vous les auriez à la fois eux et l'ordre alpha du nom. Ce n'est que pour le choix, après tout. Vous pouvez toujours reprendre les infos d'origine dans la CC.PlgTablo
Par ailleurs au moment du choix, ne vous arrive-t-il pas de connaître directement le nom de la ville que vous voulez atteindre ?
Dans ce cas cas un ComboBoxLiés, permettant les choix dans un ordre quelconque, serait plus approprié qu'un ComboBoxCasc.
Ah. Il y a une complication du fait que les colonnes ne se suivent plus. Pour fabriquer le TabDico initial, il faut:
VB:
With CC.PlgTablo: CréerTabDicoSpécif .Columns("B"), .Columns("C"), .Columns("A"): End With
Et pour un ComboBoxLiés, tout serait encore différent, mais on pourrait cette fois dans 6 ComboBox choisir dans n'importe que ordre soit les numéros soit les noms pour chacun des trois, Région, Département et Ville…

Et pour votre ajout du nom de la ville, ce nom est bien évidemment en Tv(L 5), pas en Tv(L, 2) ! J'ai vraiment l'impression que vous n'avez pas du tout cherché à comprendre comment ça marche !
 
Dernière édition:
Re : Combobox en cascade

Ça c'est dommage pour vous. Mais je vous explique puisque vous dites que vous ne compreniez pas.
VB:
Tv = PlgUti(Feuil3.[A2]).Value
La fonction PlgUti est écrite dans le module Utilit. Elle cherche toute la plage utilisée d'une feuille à partir d'une cellule de départ spécifiée, et renvoie cette plage sous forme d'un objet Range.
L'instruction récupère les valeurs de cette plage dans un tableau de Variant à deux dimensions d'autant de ligne et de colonnes que la plage. Les noms de villes se trouvent donc dans la colonne 5 de ce tableau ("E" de la plage) et non dans la colonne 2.

Enfin je ne voulais pas vous blesser. Cela dit on peut quand même dire que quand vous avez écrit Tv(L, 2) au lieu de Tv(L, 5) vous n'avez pas cherché à comprendre pourquoi vous pensiez devoir écrire ça ! Cela a procédé d'une démarche empirique. Vous devriez vous en vouloir à vous même pour ça. Moi je ne vous jugeais pas en réalité. Mais vous auriez du me demander si vous aviez le sentiment d'avoir sur le dos le poids de trop de choses à comprendre d'un coup.
 
Dernière édition:
Re : Combobox en cascade

Bonjour c'est pas plus clair.
Pour information, je vous explique l'importance d'afficher la colonne "A" et non la "D", car le n° de la colonne "A" correspond à un identifiant unique d'une association dans une ville et que pour des raisons de confidentialité c'est un nom de ville quelconque qui apparait dans la colonne "E".
Voilà je pense avoir été clair dans mon explication.
C'est au aussi pourquoi il est important pour moi d'afficher le n° d'id de l'asso "A" avec son nom complet qui se trouve dans la colonne "E"

Merci

Vmax
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
40
Affichages
1 K
  • Question Question
Power Query tri powerquery
Réponses
9
Affichages
990
  • Question Question
Microsoft 365 Macro VBA - Excel
Réponses
12
Affichages
626
Réponses
4
Affichages
935
Réponses
4
Affichages
742
Retour