Utilisation dictionary

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 !

cathodique

XLDnaute Barbatruc
Bonjour la communauté,

ne trouvant pas de solution après plusieurs jours de recherche, je fais appel aux compétences des membres.

ayant des connaissances limitées en VBA, je voudrai récupérer des données d'une feuille principale vers d'autres feuilles nommées (les noms des feuilles sont des données d'une colonne de la feuille principale); les données à récupérer d'autres colonnes sont à récupérer sans doublons sur chaque feuille.

je joins le fichier qui est plus explicite.

nb: en apprentissage du VBA, je souhaite apprendre utilisation du dictionnaire d'excel. je suis parvenu à adapter un code de cet outil dans un formulaire en cascade mais cette fois-ci je sèche.

je vous remercie par avance.
 

Pièces jointes

Re : Utilisation dictionary

Bonjour Lolote83,

je te remercie mais le TCD ne répond pas à mes attentes pour la simple raison que les valeurs ont des paramètres relevés sur des instruments de mesures. ces données sont archivées, les calculs effectués sont basés sur des formules mathématiques.
mon souci est de récupérer certaines valeurs de la base de données (saisie sur une feuille excel), sur des feuilles à part selon des critères pour faire les calculs. Je suis sur une piste avec une formule avec sommeprod mais encore de erreurs,en faisant un test sur un petit fichier ça fonctionne bien mais quand je teste avec ma base de données, j' ai des erreurs #Valeurs ou #Nom.
Encore merci, pour tes efforts.
 
Re : Utilisation dictionary

Bonjour cathodique, Lolotte83,

Je n'ai pas essayé de m'y retrouver dans la série des modules existants ... Je te laisse ce soin! Dans un module, donc, tu peux tester le code suivant:
VB:
Sub nomsFeuilles()
For Each f In ThisWorkbook.Worksheets
    If f.Name <> "ResultatDésiré" And f.Name <> "BD" Then répartir f.Name
Next f
End Sub

Sub répartir(feuil As String)
With Sheets("BD")
Set MonDicoOutils = CreateObject("Scripting.Dictionary")
Set MonDicoPostes = CreateObject("Scripting.Dictionary")

  For Each c In .Range("B2:B" & .[B65000].End(xlUp).Row)
    If c = feuil Then
        MonDicoOutils(c.Offset(0, 1).Value) = ""
        MonDicoPostes(c.Offset(0, 2).Value) = ""
    End If
  Next c
  Sheets(feuil).[C2].Resize(MonDicoOutils.Count, 1) = Application.Transpose(MonDicoOutils.keys)
  Sheets(feuil).[D1].Resize(1, MonDicoPostes.Count) = MonDicoPostes.keys
End With
End Sub

Attention, quelques "contrôles" seraient à ajouter ... par exemple, la feuille correspondant au "type" renseigné en colonne B existe-t-elle?
 
Re : Utilisation dictionary

Bonjour le fil, bonjour le forum,

Une proposition VBA :
Code:
Sub Macro1()
Dim bd As Object 'déclare la variable bd (onglet BD)
Dim dico As Object 'déclare la variable dico (DICtiOnnaire)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim temp As Variant 'déclare la variable temp (tableau TEMPoraire)
Dim i As Integer 'déclare la variable i (Incrément)
Dim dics As Object 'déclare la variable dics (DICtionnaireS)
Dim o As Object 'déclare la variable o (Onglet)

Set bd = Sheets("BD") 'définit l'onglet bd
Set dico = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dico
dl = bd.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 1 (=A) de l'onglet bd
Set pl = bd.Range("B2:B" & dl) 'définit la plage pl
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    dico(cel.Value) = "" 'alimente le dictionnaire dico
Next cel 'prochaine cellule de la boucle
temp = dico.keys 'récupère le dictionnaire sans doublon dans le tableau temp

For i = 0 To UBound(temp) 'boucle 1 : sur toutes les valeurs uniques du tableau temp
    Set o = Sheets(temp(i)) 'définit l'onglet o
    bd.Range("A1").AutoFilter 'lance le filtre automatique
    bd.Range("A1").AutoFilter field:=2, Criteria1:=temp(i) 'filtre automatique sur la colonne 2 (=B) avec la valeur temp(i) comme critère
    Set dics = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dics
    For Each cel In pl.Offset(0, 1).SpecialCells(xlCellTypeVisible) 'boucle 2 : sur toutes les cellules visibles cel de la plage pl déclalée d'un colonne à droite
        dics(cel.Value) = "" 'alimente le dictionnaire dics
    Next cel 'prochaine cellule de la boucle 2
    o.Range("A2").Resize(dics.Count) = Application.Transpose(dics.keys) 'renvoie en colonne à partir de A2 la liste des outils sans doublons
    Set dics = CreateObject("Scripting.Dictionary") 'redéfinit la dictionnaire dics (réinitialise)
    For Each cel In pl.Offset(0, 2).SpecialCells(xlCellTypeVisible) 'boucle 3 : sur toutes les cellules visibles cel de la plage pl déclalée de deux colonnes à droite
        dics(cel.Value) = "" 'alimente le dictionnaire dics
    Next cel 'prochaine cellule de la boucle 3
    o.Range("B1").Resize(, dics.Count) = dics.keys 'renvoie en ligne à partir de B1 la liste des numéros de poste sans doublons
    bd.Range("A1").AutoFilter 'annule le filtre automatique
Next i 'prochaine valeur de la boucle 1
End Sub

[Édition]
Damned ! grillé par Modeste... J'avais pas rafraîchi...
 
Dernière édition:
Re : Utilisation dictionary

Cher Modeste tu es vraiment trop modeste,

je viens de faire un test et ton code fonctionne parfaitement. toutes excuses, je suis vraiment un amateur débutant en VBA. j'avais fait tellement de recherches et de tests que je me suis trompé sur mon fichier, en fait c'est l'inverse dont j'ai besoin. c'est à dire, ce qui doit être reporter en ligne est en colonne et pour l'autre l'inverse.

je te remercie beaucoup. je joins mon fichier corriger.
 

Pièces jointes

Re : Utilisation dictionary

Mon cher Georges ton code fonctionne parfaitement, j'ai essayé d'apporter des modifications mais n'y suis pas parvenu, je suis nul en VBA. en fait, le résultat souhaité est en quelque sorte un peu différent.

De ma feuille "BD" contient toutes les données, je voudrais transférer ces données sur d'autres feuilles ayant une disposition différente. j'ai déjà mon fichier corrigé en répondant à Modeste.

je vous remercie et vous dit:"Bravo"!
 
Re : Utilisation dictionary

Bonjour le fil, bonjour le forum,

C'est parce que tu as mis un fichier compatible 2003 que j'ai compris que tu t'adressais à moi avec Georges... Peut-être une allusion au grand Georges de Sète, mais moi c'est Robert !
Une version 2 avec la macro modifiée ci-dessous :
Code:
Sub Macro_Robert2()
Dim bd As Object 'déclare la variable bd (onglet BD)
Dim dico As Object 'déclare la variable dico (DICtiOnnaire)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim temp As Variant 'déclare la variable temp (tableau TEMPoraire)
Dim i As Integer 'déclare la variable i (Incrément)
Dim dics As Object 'déclare la variable dics (DICtionnaireS)
Dim o As Object 'déclare la variable o (Onglet)
Dim dest As Range 'déclare la variable dest (cellule de DESTination)
Dim teo As Variant 'déclare le tableau de variables teo (tableau TEmporaire Outils)
Dim x As Integer 'déclare la variable x
Dim y As Integer 'déclare la variable y

Set bd = Sheets("BD") 'définit l'onglet bd
Set dico = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dico
dl = bd.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 1 (=A) de l'onglet bd
Set pl = bd.Range("B2:B" & dl) 'définit la plage pl
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    dico(cel.Value) = "" 'alimente le dictionnaire dico
Next cel 'prochaine cellule de la boucle
temp = dico.keys 'récupère le dictionnaire sans doublon dans le tableau temp

For i = 0 To UBound(temp) 'boucle 1 : sur toutes les valeurs uniques du tableau temp
    Set o = Sheets(temp(i)) 'définit l'onglet o
    o.UsedRange.Clear 'efface les anciennes données
    bd.Range("A1").AutoFilter 'lance le filtre automatique
    bd.Range("A1").AutoFilter field:=2, Criteria1:=temp(i) 'filtre automatique sur la colonne 2 (=B) avec la valeur temp(i) comme critère
    Set dics = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dics
    For Each cel In pl.Offset(0, 1).SpecialCells(xlCellTypeVisible) 'boucle 2 : sur toutes les cellules visibles cel de la plage pl déclalée d'un colonne à droite
        dics(cel.Value) = "" 'alimente le dictionnaire dics
    Next cel 'prochaine cellule de la boucle 2
    teo = dics.keys 'définit le tabeau teo
    y = 0 'initialise la variable y
    For x = 0 To UBound(teo) 'boucle 3 : sur toutes les outils (sans doublon)
        o.Cells(1, y + 2).Value = teo(x) 'place l'outil dans le tableau
        y = y + 2 'incrément y
    Next x 'prochain outil de la boucle 3
    For Each cel In pl.Offset(0, 2).SpecialCells(xlCellTypeVisible) 'boucle 4 : sur toutes les cellules visibles cel de la plage pl déclalée de deux colonnes à droite
        Set dest = IIf(o.Range("A2").Value = "", o.Range("A2"), o.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0)) 'définit la cellule de destination
        dest.Value = cel.Value 'récupère dans dest la valeur de la cellule cel
    Next cel 'prochaine cellule de la boucle 4
    bd.Range("A1").AutoFilter 'annule le filtre automatique
Next i 'prochaine valeur de la boucle 1
End Sub
Le fichier :
 

Pièces jointes

Re : Utilisation dictionary

Bonsoir,

Pour le coup et même si nous n'avons plus d'écho de cathodique, je présume que la dernière proposition de Robert (bien aidé de Georges 😉) correspond aux attentes 😕

Bonne swâârée, à Sète, à Montreuil et ailleurs!
 
Re : Utilisation dictionary

Bonsoir ou plutôt Bonjour (il est 1h46),
toutes excuses mon cher Robert pour la confusion avec Georges (un bon copain de Paris que j'ai perdu de vue). je te remercie beaucoup. je ferai un test demain et te tiens au courant.
Merci aussi à Modeste, j'ai essayé d'adapter ton code mais sans succès, j'ai soit une erreur 13 ou 1004 (je voulais mettre "outils" en ligne et "postes" en colonne (inverser) la disposition. merci à vous deux.
 
Re : Utilisation dictionary

Bonjour Robert, encore une fois toutes mes excuses.

je te remercie infiniment pour ton aide, ton code fonctionne parfaitement. je constate que vous avez (Robert et Modeste) un très bon niveau en VBA, je vous envie un peu. je me permets de vous demander:

1- et si je voulais faire la même chose mais en créant un nouveau classeur;
2- comment faire pour exclure une valeur après filtrage.
je m'explique: filtre sur "Olé", récupération de toutes les valeurs de la colonne "outils" (sans doublons) sauf la valeur "DP", car je voudrais que les valeurs de la ligne correspondant à "DP" et par conséquent à TR04 (colonne "poste") soient mises dans une nouvelle colonne "Observation" (les cellules seront concaténées), sur la ligne correspondant à TR04 et ceci sur la feuille portant le même nom que le critère de filtrage; en excluant la valeur "DP" sa colonne ne sera pas créée.

* je pense qu'en créant un nouveau groupe dans la colonne "Type" regroupant les valeurs "DP", on crée une feuille "DP" et ensuite on dispatche sur les autres feuilles. enfin, ce n'est qu'une idée pour facilité peut être le codage (je suis presque null en VBA)

Pour le transfert des données (avec Sommeprod), je pense que c'est bon. Il ne reste qu'à essayer de l'intégrer à ton code, j'espère y parvenir.

je joins le fichier voir feuille "Olé".

Merci beaucoup

Bonne journée.
 

Pièces jointes

Re : Utilisation dictionary

Je reviens encore une fois pour te remercier d'avoir commenter ton code. J'ai bien compris le déroulement mais je ne saisis pas encore les subtilités des écritures du VBA. Je suis autodidacte, et par conséquent j'essaie d'apprendre sur des exemples concrets.

Merci.
 
Re : Utilisation dictionary

Bonsoir le fil, bonsoir le forum,

Tojours sur le même classeur mais en tenant compte des outils DP...
Code:
Sub Macro_Robert3()
Dim bd As Object 'déclare la variable bd (onglet BD)
Dim dico As Object 'déclare la variable dico (DICtiOnnaire)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim temp As Variant 'déclare la variable temp (tableau TEMPoraire)
Dim i As Integer 'déclare la variable i (Incrément)
Dim dics As Object 'déclare la variable dics (DICtionnaireS)
Dim o As Object 'déclare la variable o (Onglet)
Dim dest As Range 'déclare la variable dest (cellule de DESTination)
Dim teo As Variant 'déclare le tableau de variables teo (tableau TEmporaire Outils)
Dim x As Integer 'déclare la variable x
Dim y As Integer 'déclare la variable y
Dim test As Boolean 'déclare la variable test
Dim v As String 'déclare la variable v (Valeur)
Dim ref As String 'déclare la variable ref (REFérence)
Dim dc As Integer 'déclare la variable dc (Dernière Colone)

Set bd = Sheets("BD") 'définit l'onglet bd
Set dico = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dico
dl = bd.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 1 (=A) de l'onglet bd
Set pl = bd.Range("B2:B" & dl) 'définit la plage pl
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    dico(cel.Value) = "" 'alimente le dictionnaire dico
Next cel 'prochaine cellule de la boucle
temp = dico.keys 'récupère le dictionnaire sans doublon dans le tableau temp
For i = 0 To UBound(temp) 'boucle 1 : sur toutes les valeurs uniques du tableau temp
    test = False 'réinitialise la variable test
    Set o = Sheets(temp(i)) 'définit l'onglet o
    o.UsedRange.Clear 'efface les anciennes données
    bd.Range("A1").AutoFilter 'lance le filtre automatique
    bd.Range("A1").AutoFilter field:=2, Criteria1:=temp(i) 'filtre automatique sur la colonne 2 (=B) avec la valeur temp(i) comme critère
    Set dics = CreateObject("Scripting.Dictionary") 'définit le dictionnaire dics
    For Each cel In pl.Offset(0, 1).SpecialCells(xlCellTypeVisible) 'boucle 2 : sur toutes les cellules visibles cel de la plage pl déclalée d'un colonne à droite
        If cel.Value = "DP" Then 'condition : si la valeur de cel est "DP"
            test = True 'définit la variable test
            v = cel.Offset(0, 5).Value & "mV/" & cel.Offset(0, 6).Value & "mA" 'définit la valeur v
            ref = cel.Offset(0, 1).Value 'définit la référence ref
            GoTo suite 'va à l'étiquette suite (sans alimwenter le dictionnaire)
        End If 'fin de la condition
        dics(cel.Value) = "" 'alimente le dictionnaire dics
suite: 'étiquette
    Next cel 'prochaine cellule de la boucle 2
    teo = dics.keys 'définit le tableau teo
    y = 0 'initialise la variable y
    For x = 0 To UBound(teo) 'boucle 3 : sur toutes les outils (sans doublon)
        o.Cells(1, y + 2).Value = teo(x) 'place l'outil dans le tableau
        y = y + 2 'incrément y
    Next x 'prochain outil de la boucle 3
    For Each cel In pl.Offset(0, 2).SpecialCells(xlCellTypeVisible) 'boucle 4 : sur toutes les cellules visibles cel de la plage pl déclalée de deux colonnes à droite
        Set dest = IIf(o.Range("A2").Value = "", o.Range("A2"), o.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0)) 'définit la cellule de destination
        dest.Value = cel.Value 'récupère dans dest la valeur de la cellule cel
    Next cel 'prochaine cellule de la boucle 4
    If test = True Then 'condition : si la variable test est vraie
        dc = o.Cells(1, Application.Columns.Count).End(xlToLeft).Column 'définit la dernière colonne éditée de la ligne 1
        o.Cells(1, dc + 2) = "observations" 'place "observations" dans la ligne 1
        'place la valeur v dans la première occurrence trouvée par la recherche de la référence dans la colonne 1
        o.Cells(o.Columns(1).Find(ref, o.Cells(1, 1), xlValues, xlWhole).Row, dc + 2).Value = v
    End If
    bd.Range("A1").AutoFilter 'annule le filtre automatique
Next i 'prochaine valeur de la boucle 1
End Sub

[Édition]
Ça commence à sentir un peu le gaz tu ne trouves pas...?
 
- 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
6
Affichages
321
Retour