Remplir un dictionnaire à partir d'une plage de cellules [VBA]
Bonsoir à tous,
Je souhaiterais manipuler une base de données (8 feuilles d'environ 2450 lignes par 21 colonnes).
Pour vous expliquer un peu plus en détails, cette base de données recense les données sur 8 années (admettons de 2000 à 2007) de différentes sociétés. Mais attention : chaque société n'est pas présente toutes les années, leur position varie au cours du temps et le nombre de sociétés varie chaque année. La première colonne correspond au nom de la société et les colonnes qui suivent correspondent à différents critères (et ce, sur chacune des feuilles).Prenons par exemple la société VOLVO. Elle se situe en l'année 2000 ligne 2150, en 2001 ligne 2152 mais n'est plus dans la base de données les années suivantes.
Du fait de ces contraintes, je pense que l'utilisation de dictionnaires serait judicieuse, cependant je n'en ai jamais manipulé et j'ai une expérience assez faible en VBA...
Je comptais donc créer un dictionnaire de dictionnaires : Dico_Principal (Key : Annee, Item : Dico_ Annee) et 8 dictionnaires (Key : Nom_Societe, Item : Array/Vecteur (des données de la société (donc à une année donnée pour une société donnée) : une donnée par colonne)).
Mais voilà, je bloque sur la création de ces dictionnaires. Je n'arrive pas à "pointer"/"ajouter" les celles de ma base données afin de les transférer dans ces dictionnaires.
--------------- MAJ suite aux questions ---------------
Nombreux d'entre-vous me demandent quelle est la finalité de transférer toute cette data dans des dictionnaires et il est vrai que je ne l'avais pas spécifier haha ! Il s'agit tout simplement de créer un processus automatique d'extraction de sociétés et les données auxquelles elles sont rattachées vers un autre ficher afin de pouvoir analyser leur évolution, leur performance et bien d'autres !
-----------------------------------------------------------------------
Ci-dessous une ébauche du code :
Sub Ajoute_Donnees()
Dim sh As Worksheet
Dim Dico_Principal As scripting.dictionary
Dim Dico_2000 As scripting.dictionary
Dim Dico_2001 As scripting.dictionary
Dim Dico_2002 As scripting.dictionary
Dim Dico_2003 As scripting.dictionary
Dim Dico_2004 As scripting.dictionary
Dim Dico_2005 As scripting.dictionary
Dim Dico_2006 As scripting.dictionary
Dim Dico_2007 As scripting.dictionary
Set Dico_Principal = New scripting.dictionary
Set Dico_2000 = New scripting.dictionary
Set Dico_2001 = New scripting.dictionary
Set Dico_2002 = New scripting.dictionary
Set Dico_2003 = New scripting.dictionary
Set Dico_2004 = New scripting.dictionary
Set Dico_2005 = New scripting.dictionary
Set Dico_2006 = New scripting.dictionary
Set Dico_2007 = New scripting.dictionary
For Each sh In ThisWorkbook.Worksheets
For ligne = 1 To Range("A1").End(xlDown).Row
For colonne = 1 To Range("A1").End(xlToRight).Column
'Code
'Ajouter les valeurs de la cellule (i,j) au dictionnaire Dico_Annee correspondant
Next colonne
Next ligne
Next sh
End sub
Merci d'avance pour votre aide,
Alexandre
- Messages
- 2'417
- Excel
- 2019
- Inscrit
- 13/07/2017
- Emploi
- Formateur, animateur,tech.informatique
Bonjour
ne serait-ce pas par hasard ?
Dim Dico_2000 As scriptig.dictionary
crdlt,
André
Bonsoir à tous,
Comme ceci Alexandre74006, mais c'est quoi la finalité
Option Explicit
Sub test()
Dim a, b, i As Long, ws As Worksheet, dico As Object
'creation du dictionnaire parent
Set dico = CreateObject("Scripting.Dictionary")
For Each ws In Worksheets
Set dico(CStr(ws.Name)) = CreateObject("Scripting.Dictionary")
dico(CStr(ws.Name)).CompareMode = 1
With ws
a = .Range("A1").CurrentRegion.Value
For i = 2 To UBound(a, 1)
If Not dico(CStr(ws.Name)).exists(a(i, 1)) Then
dico(CStr(ws.Name))(a(i, 1)) = Application.Index(a, i, 0)
End If
'pour visualiser dans la fenetre espion l'item associé
b = dico.Items()(i - 2).Items()(0)
Next
End With
Next
Set dico = Nothing
End Subklin89
Bonjour,
quel est le but final ?
les données sont déjà classées par année (un onglet pour chacune des années)
Bonsoir à tous,
Comme ceci Alexandre74006, mais c'est quoi la finalité
Option Explicit Sub test() Dim a, b, i As Long, ws As Worksheet, dico As Object 'creation du dictionnaire parent Set dico = CreateObject("Scripting.Dictionary") For Each ws In Worksheets Set dico(CStr(ws.Name)) = CreateObject("Scripting.Dictionary") dico(CStr(ws.Name)).CompareMode = 1 With ws a = .Range("A1").CurrentRegion.Value For i = 2 To UBound(a, 1) If Not dico(CStr(ws.Name)).exists(a(i, 1)) Then dico(CStr(ws.Name))(a(i, 1)) = Application.Index(a, i, 0) End If 'pour visualiser dans la fenetre espion l'item associé b = dico.Items()(i - 2).Items()(0) Next End With Next Set dico = Nothing End Subklin89
Merci beaucoup pour ton aide klin89 !
Il s'agit tout simplement de créer un processus automatique d'extraction de sociétés (qui répondent à certains critères) et les données auxquelles elles sont rattachées vers un autre ficher afin de pouvoir analyser leur évolution, leur performance et bien d'autres ! Il faut donc que je rajoute à ceci les étapes "filtrage" et "exportation"
Bonjour,
quel est le but final ?
les données sont déjà classées par année (un onglet pour chacune des années)
Bonjour SabV,
Il s'agit tout simplement de créer un processus automatique d'extraction de sociétés (qui répondent à un certain nombre de critères - année par année) et les données auxquelles elles sont rattachées vers un autre ficher afin de pouvoir analyser leur évolution, leur performance et bien d'autres !
Bonjour à tous,
Pour le fun, une autre piste.
Un exemple de construction de dictionary dont la clef est l'entreprise et l'item un tableau (dont le nombre d'élément est égal au nombre de feuilles concernées). Le tableau comporte pour chacun de ces éléments N, le numéro de la ligne de la Nème feuille où figure l'entreprise ou bien l'élément n est vide si l'entreprise n'est pas sur la Nème feuille.
Les noms des feuilles concernées et leur ordre sont dans la constante Feuilles.
La macro se termine par un affichage du dictionary obtenu pour mieux le visualiser.
Le dico permet d'avoir un accès pratiquement direct aux enregistrements d'une entreprise. Après faut voir le projet plus en détail...
nota: on pourrait aussi faire un dictionnaire avec comme clef l'entreprise et avec l'item qui serait lui-même un dictionnaire ayant pour clef les feuilles où figure l'entreprise et comme item le numéro de ligne de l'entreprise. On aurait ainsi un dictionnaire de dictionnaires.
Bonjour, Salut à tous !
Un seul dico suffit pour opérer, soit selon la méthode indiquée par MaPoire, soit avec une clé EntrepriseAnnée.
Mais il faut savoir ce qu'on fait une fois le dico constitué.
Cordialement.