Remplir Dictionnaire VBA

  • Initiateur de la discussion Initiateur de la discussion Wisigoth
  • 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 !

Wisigoth

XLDnaute Nouveau
Bonjour,

Après d'innombrables essais, échecs et recherches infructueuses sur le web, je m'en remets à vous.
J'essaie de créer un dictionnaire avec pour clés une liste de noms sur une 1ere colonne et qui pourra contenir différents items pour chacune des clés. Ces items sont contenus dans les autres colonnes comme présenté sur le fichier exemple.
Dans cet exemple je voudrais pouvoir stocker pour chaque nom les 2 items disponibles et les récupérer ensuite.

Le but de ce programme étant de me permettre d'extraire à partir d'un tableau des informations concernant une liste d'entreprises et de pouvoir les comparer une à une ou par groupe sur une ou plusieurs de ses informations. C'est pour cela que je me suis lancé dans l'utilisation des dictionnaires que je ne maitrise pas vraiment.

Merci d'avance.
 

Pièces jointes

Re : Remplir Dictionnaire VBA

Merci Beaucoup Pierrejean, ça fonctionne également sur mon fichier de travail.
J'aurais une autre question: Pour définir les items tu désignes les colonnes comme ça:

Code:
 dico(x) = Range("B" & n) & ";" & Range("C" & n)

J'aimerais pouvoir le faire en utilisant le nom que j'ai préalablement donné à la colonne

Code:
CA_2014 = a.Range("CA_2014").Column

De plus j'essaie d'extraire le dico ensuite sous forme de tableau, j'ai essayé avec ce code mais j'obtiens seulement les clés et des données aberrantes pour les 2 items.

Code:
Set b = Sheets("Recap")
   b.Range("A1", Cells(dico.Count, "A")) = Application.Transpose(dico.Keys)
   b.Range("B1", Cells(dico.Count, "B")) = Application.Transpose(dico.Items()(0))
   b.Range("C1", Cells(dico.Count, "C")) = Application.Transpose(dico.Items()(1))
 
Re : Remplir Dictionnaire VBA

Bonjour Wisigoth, pierrejean, BOISGONTIER,

à moins que ce ne soit pour l'apprentissage, il me semble que l'utilisation d'un dictionary, dans la situation présente, ne se justifie pas que ce soit en termes d'élimination de doublons,de rapidité d'exécution, de facilité d'utilisation, et de limpidité du code.

Un simple tableau de la plage souhaitée permet un accès rapide à chaque élément du tableau, et la 'recopie' dans la feuille tient en une ligne.

A+
 
Re : Remplir Dictionnaire VBA

Bonjour Paf,

Dsl Pierrejean je n'avais pas compris que les items étaient stockés ensemble avec une séparation et que tu les récupérais individuellement en utilisant le split.

@Paf: En fait je voudrais stocker des noms d'entreprises avec des caractéristiques associées à chacune (d'où mon exemple avec les 3 colonnes) et j'aimerais arriver par là à selectionner dans une listbox certaines des entreprises, ensuite certaines caractéristiques à comparer et imprimer les tableaux et graphiques de comparaison. L'utilisateur final ne doit avoir à faire que le choix des entreprises et des caractéristiques à comparer.
Je pensais qu'en utilisant les dico, je pourrais associer les noms d'entreprises, comme clés, aux caractéristiques, comme items.
Les caractéristiques étant dispatchées sur plusieurs onglets, est ce que ça ne serait pas plus simple si je crée un dico pour chaque caractéristique (clé=entreprise, item=valeur caractéristique) ou tu penses que je peux faire ça avec des tableaux?
 
Re : Remplir Dictionnaire VBA

Re

Les caractéristiques étant dispatchées sur plusieurs onglets, est ce que ça ne serait pas plus simple si je crée un dico pour chaque caractéristique (clé=entreprise, item=valeur caractéristique) ou tu penses que je peux faire ça avec des tableaux?
l'énoncé initial ne correspond plus vraiment à la situation finale; ma réponse du post #6 non plus.

Dans la mesure où les données sont réparties sur plusieurs onglet, bien que tout soit possible :
- ce serait moins simple d'utiliser un seul tableau.
- s'il n'y a pas plus d'une caractéristique par feuille, l'emploi du dictionnaire est envisageable

Je pense qu'une réponse claire ne pourra être donnée qu'à la vue d'un classeur sans données confidentielles, reflétant le classeur réel, avec l'ébauche de la userform utilisée.

peut-être dans un nouveau fil ?

A+
 
Re : Remplir Dictionnaire VBA

Bonjour.
Pour paraphraser un item du dernier post :
- s'il y a plus d'une caractéristique par feuille, l'emploi d'un dictionnaire arborescent est envisageable.
Peut être…
Mais j'ai peur. Je me mêle peut être d'une discussion à laquelle je ne devrais pas. Les dictionnaires arborescents sont surtout faciles à élaborer à partir d'infos situées sur une seule feuille.
 
Re : Remplir Dictionnaire VBA

Oui et puis il est aussi question d'UserForm. Or pour ceux ci je n'utilise même plus les dictionnaires arborescents. J'utilise ce que j'appelle des 'Sujets': un Variant …
contenant un Array à deux éléments :
' Élément 0: Un tableau base 0 de valeurs de clés destiné en principe à la propriété List d'un ComboBox.
' Élément 1: Un tableau base 0 de Variant dont chaque élément est une liste (Base To n) As Long de
' numéros des lignes portant toutes la valeur de clé correspondante.
Mais là aussi il faudrait que tout soit dans une seule feuille pour pouvoir constituer un Sujet pour chaque critère, les différents Sujets pouvant s'entre-filtrer selon des choix effectués dans des ComboBox, ce qu'assume complètement automatiquement mon module de classe ComboBoxLiées.
 
Re : Remplir Dictionnaire VBA

Bonjour Dranreb,

J'ai l'impression qu'en utilisant les 'Sujets', je peux arriver à avoir ce que je cherche.
J'aurais la liste des entreprises sur l'élément 0, les caractéristiques de chacune dans une liste à l'intérieur de l'élément 1.
Est ce que la fonction filter peut être utilisée dans ce cas de figure?
Et est ce que vous pourriez m'envoyer un exemple de votre code pour implémenter ça?

Merci.
 
Re : Remplir Dictionnaire VBA

Bonjour.
Ce n'est pas exactement ça, mais si l'organisation des sujets vous inspire pour faire autre chose d'analogue tant mieux.
En fait l'élément 1 du Sujet contient un tableau base 0 de Variant dont chaque élément est une liste de numéros des lignes portant toutes la valeur de clé correspondante. Et les filtrages entre plusieurs Sujets sont possible du fait qu'ils portent tous les numéros de lignes d'un même tableau mais correspondant à des clés prises de colonnes différentes, et qu'il est donc possible d'isoler les numéros en commun jusqu'à ce qu'il n'en reste qu'un.
 

Pièces jointes

Re : Remplir Dictionnaire VBA

Bonjour.
J'ai cependant la vague impression que ce qu'il vous faudrait serait assez différent, soit bien plus compliqué soit bien plus simple !
C'est selon la façon dont il faut interpréter ça dans le 1er poste :
Le but de ce programme étant de me permettre d'extraire à partir d'un tableau des informations concernant une liste d'entreprises et de pouvoir les comparer une à une ou par groupe sur une ou plusieurs de ses informations. C'est pour cela que je me suis lancé dans l'utilisation des dictionnaires que je ne maitrise pas vraiment.
Avec "par groupe" dedans. Ah, il y a alors dans une des colonnes un numéro de groupe auquel appartient l'entreprise ?
Le plus simple serait peut être de dessiner l'UserForm que vous voudriez pour interroger la base, on verrait mieux ce qu'il y faudrait comme programmation.
S'il y avait par exemple juste un CBxNom pour le nom, un CBxCri pour le titre de colonne et un LabVal pour la valeur à l'intersection des deux, ce code suffirait :
VB:
Option Explicit
Dim PlgTablo As Range
Private Sub UserForm_Initialize()
Set PlgTablo = PlgUti(Feuil1.[B2])
Me.CBxNom.List = PlgTablo.Columns(0).Value
Me.CBxCri.List = WorksheetFunction.Transpose(PlgTablo.Rows(0))
End Sub
Private Sub CBxNom_Change()
RestitVal
End Sub
Private Sub CBxCri_Change()
RestitVal
End Sub
Sub RestitVal()
Dim L As Long, C As Long
Me.LabVal.Caption = ""
L = CBxNom.ListIndex + 1: C = CBxCri.ListIndex + 1
If L * C > 0 Then Me.LabVal.Caption = PlgTablo.Cells(L, C).Value
End Sub
 
- 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
1
Affichages
2 K
Réponses
2
Affichages
2 K
Retour