On pourrait essayer le truc suivant en VBA...
Toujours sur base de mes 3 tableaux t_Désignations, t_Matières et t_Fournisseurs et du tableau de résultat t_Résultat qui reprend les différentes colonnes des trois premiers tableaux, voici un code d'une dizaine de lignes
Pièce jointe 583584
L'idée est de
- coller les colonnes de référence les unes en dessous des autres;
- d'en supprimer les doublons;
- d'ajouter les INDEX/EQUIV formulés;
- optionnellement, de transformer en valeur (copier/collage spécial valeurs à la sauce VBA).
On retrouve ici les différentes étapes du Power Query...
A voir sur tes 50000 lignes pour les performances, mais je pense que ça devrait tenir la route. On peut désactiver l'affichage et le calcul en début de macro et les restaurer en fin de macro pour accélérer l'exécution de manière significative.
Pièce jointe 583586Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 Sub Merge() If Not Range("t_Résultat").ListObject.DataBodyRange Is Nothing Then Range("t_Résultat").ListObject.DataBodyRange.Delete ' Création de la plage des références Range("t_Résultat[Référence]").Resize(Range("t_Désignations").Rows.Count).Value = _ Range("t_Désignations[Dénomination]").Value Range("t_Résultat[Référence]")(Range("t_Résultat").Rows.Count + 1).Resize(Range("t_Matières").Rows.Count).Value = _ Range("t_Matières[Référence]").Value Range("t_Résultat[Référence]")(Range("t_Résultat").Rows.Count + 1).Resize(Range("t_Fournisseurs").Rows.Count).Value = _ Range("t_Fournisseurs[Référence]").Value ' Suppression des doublons Range("t_Résultat").RemoveDuplicates Columns:=Range("t_Résultat").ListObject.ListColumns("Référence").Index, Header:=xlYes ' Ajout des formules Range("t_Résultat[Désignation]").Formula = _ "=IFERROR(INDEX(t_Désignations[Désignation],MATCH([@Référence],t_Désignations[Dénomination],0)),"""")" Range("t_Résultat[Matière]").Formula = _ "=IFERROR(INDEX(t_Matières[Matière],MATCH([@Référence],t_Matières[Référence],0)),"""")" Range("t_Résultat[Finition]").Formula = _ "=IFERROR(INDEX(t_Matières[Finition],MATCH([@Référence],t_Matières[Référence],0)),"""")" Range("t_Résultat[Fournisseur]").Formula = _ "=IFERROR(INDEX(t_Fournisseurs[Fournisseur],MATCH([@Référence],t_Fournisseurs[Référence],0)),"""")" ' Collage spécial valeur sauce VBA optionnel Range("t_Résultat[[Désignation]:[fournisseur]]").Value = _ Range("t_Résultat[[Désignation]:[fournisseur]]").Value End Sub
Le code VBA travaille avec des tableaux structurés, et donc tu peux bien sûr les déplacer dans ton classeur (le tableaut_Résultat" ne peut normalement pas se trouver sous les autres tableaux mais sur une feuille à part) sans que ton code doive être modifié. Tu as juste à adapter les noms des tableaux et des colonnes et, bien sûr, les formules utilisées.
Pour les formules, l'idée est de les saisir dans Excel dans le tableau de résultat pour les récupérer en VBA et les inclure dans ton code (attention à doubler les guillemets)
Pièce jointe 583589