Remplir un tableau à plusieurs dimensions sans doublons

Bonsoir,

Comme énoncé dans le titre je souhaiterais remplir un tableau multidimensionnel en évitant les doublons.

Je m'explique:

Je dispose de plusieurs onglets de données. Sur chaque onglet les données sont présentés de la même manière.

Quelle serait la méthode la plus efficiente pour faire un onglet récapitulatif dans lequel apparaitrait dans une première colonne la référence (selon une colonne fixe de mes onglets de données) suivie dans les colonnes adjacentes d'un argument spécifique à chaque onglet ?? L'idée serait de remplir un tableau et de n'avoir plus qu'à le coller sur l'onglet récapitulatif.

Je ne sais pas si cette courte explication est très parlante... Bref je vous ai mis un petit exemple en pièce jointe.

Par avance, je vous remercie pour le temps que vous consacrerez à ma demande.

Cordialement,

Darzou

66tbu-multi.xlsx (10.59 Ko)

Bonjour,

Une solution en pièce jointe.

A+

243tbu-multi.xlsm (19.22 Ko)

Merci pour votre réponse.

Maintenant pour approfondir un peu : en attribuant un string à chaque valeur enregistrée dans "mondico" tel que

  For Each c In bb
    MonDico(c) = MaValeur
  Next c

sachant que pour chaque "c" il existe un unique "MaValeur" mais que pour un "MaValeur" il puisse exister plusieurs "c", comment réalise-t-on un tri par ordre alphabétique de "Mondico" selon les valeurs qui ont été attribuées ??

Un exemple en pj.

Cdlt,

Darzou

78tbu-multi.xlsm (19.24 Ko)

Bonjour,

Je ne comprend pas trop la question.

Un dictionary à l'inverse du petit Larousse n'est pas trié mais indexé selon une clef. On l'utilise uniquement parce que la clef d'index étant unique on obtient en sortie une liste sans doublon.

Une fois transposé tu récupères un Array (dans mon exemple : Tablo) que tu peux trier selon une méthode traditionnelle : Il existe des algo de tri d'Array multidimension mais à mon sens tu as plus vite fait de trier la plage d'arrivée.

Voici la macro modifiée pour trier le tableau d'arrivée selon la colonne B

Sub Synt()
Dim a, b, c, aa, bb, i, j, k, Tablo, Plage$
'Détermination des dernières lignes de chaques feuilles
a = Feuil2.Range("A" & Feuil1.Rows.Count).End(xlUp).Row
b = Feuil3.Range("A" & Feuil2.Rows.Count).End(xlUp).Row
'Listage de chaque item dans un dictionary
  Set mondico = CreateObject("Scripting.Dictionary")
  aa = Feuil2.Range("A1:A" & a)
  bb = Feuil3.Range("A1:A" & b)
  For Each c In aa
    mondico(c) = Application.VLookup(c, Feuil4.Range("A:B"), 2, 0)
  Next c
  For Each c In bb
    mondico(c) = Application.VLookup(c, Feuil4.Range("A:B"), 2, 0)
  Next c
  'Préparation de la plage de réception
  Range("A2").Resize(mondico.Count, 1) = Application.Transpose(mondico.keys)
  'Récupération dans un tableau 2D
  Tablo = Range("A2:C" & mondico.Count + 1)
  'Remplissage du tableau
  For i = 1 To mondico.Count
    For j = 1 To a
      If Tablo(i, 1) = Feuil2.Cells(j, 1) Then Tablo(i, 2) = Feuil2.Cells(j, 2)
    Next
    For k = 1 To b
    If Tablo(i, 1) = Feuil3.Cells(k, 1) Then Tablo(i, 3) = Feuil3.Cells(k, 2)
    Next
  Next
  'Vidage du tableau dans la plage cible
  Plage = "A2:C" & mondico.Count + 1
  Range(Plage) = Tablo
  Range(Plage).Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlNo, _
  OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
  DataOption1:=xlSortNormal

End Sub

Remarque : Je ne répond qu'indirectement à ta question. En effet je n'affecte pas de Valeur à chaque Key du Dictionary.

En effet ici le Dictionnary est le résultat de la fusion de :

  For Each c In aa
    mondico(c) = Application.VLookup(c, Feuil4.Range("A:B"), 2, 0)
  Next c
  For Each c In bb
    mondico(c) = Application.VLookup(c, Feuil4.Range("A:B"), 2, 0)
  Next c

... Mais rien ne t'empêche en effet d'affecter une valeur (Item) correspondant à chaque clef. (Mais cela a-t-il un intéret autre qu'intellectuel ? Dans ton cas de figure sur quelle base ?)

Il suffira ensuite de restituer les item dans une colonne supplémentaire

après Range("A2").Resize(mondico.Count, 1) = Application.Transpose(mondico.keys)

Range("D2").Resize(mondico.Count, 1) = Application.Transpose(mondico.items)

Et bien sur tu récupéreras une colonne supplémentaire dans ton Tablo...

C'est clair ?

Merci pour votre réponse et excusez moi pour mon retour tardif...

Bref j'ai pu adapter vos suggestions à mon problème et vous en remercie.

Cdt,

Darzou

Rechercher des sujets similaires à "remplir tableau dimensions doublons"