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

Bonjour

ne serait-ce pas par hasard ?

Dim Dico_2000 As scriptig.dictionary

crdlt,

André

Bonjour

ne serait-ce pas par hasard ?

Dim Dico_2000 As scriptig.dictionary

crdlt,

André

Bonjour André,

Oui en effet, merci André vous avez raison ! Je me suis trompé en rédigeant le post

Cependant, cela ne m'avance pas plus.

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 Sub

klin89

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 Sub

klin89

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.

Rechercher des sujets similaires à "remplir dictionnaire partir plage vba"