Compléter un tableau selon les references provenant d'un second tableau

Bonjour à toutes et tous,

.comme préliminaire je dois vous dire que je découvre exel et VBA.
Et dans le cadre d'un premier projet, j'ai un tableau qui contient une liste de référence ayant chacune ses propres propriétés

image

Dans un second tableau j'ai une colonne qui fait appel à ces références.
Je voudrais renseigner les colonnes A à D selon ce qui est indiqué par référence dans le premier tableau

image

Ce que je voudrais faire c'est remplir via le VBA les colonnes ABCD du second tableau selon les propriétés du premier tableau.
En réalité mon projet comprend plus ou moins 200 reference et dans les 80000 lignes,

actuellement je FILTRE les R2F2RENCE (A, B, C, D....) et co^pie et étend les propriété manuellement ce qui est long lassant et fastidieux travail.

je vois à peu près la logique à appliquer mais je découvre le VBA et bne trouve pas sur qwant.

quelqu'un peut-il m'aider ou m'apporter un début de solution ?

En vous remerciant par avance,

Bertrand

EDIT : je pensais créer n variables = nb de références, et attribuer à chaque variable une valeur concaténant ses 4 probriétés

donc il me faudrait créer dynamiquement un nb de variables selon le nb de lignes du 1er tableau

ce qui donnerait schématiquement

var A = concat(A:n & B:n & C:n & D:n)
var B = concat(A:n+1 & B:n+1 & C:n+1 & D:n+1)
var C = concat(A:n+2 & B:n+2 & C:n+2 & D:n+2)
...

Ensuite un test

for

cellule (E:x). value = var A then cellules (AàD : x).value = split var A.vlaue
cellule (E:x). value = var B then cellules (AàD : x).value = split var B.vlaue
cellule (E:x). value = var C then cellules (AàD : x).value = split var C.vlaue
...

j'ai deux problèmes mineurs : je ne connais pas le nom des tableaux, et je ne connais pas le nombre de références possibles dans le premier tableau
Mais le problème essentiel c'est que, comme vous avez pu le constater, je ne connais pas le langage VBA

Bonjour et bienvenue sur le forum,

Pourquoi utiliser absolument du VBA ?

Les fonctions d'Excel seront plus rapides. Il suffit d'utiliser INDEX+EQUIV pour résoudre votre problème. Ensuite si jamais vous voulez retirer les fonctions, il suffirait de copier/coller le tableau avec l'option "valeurs seulement" (possible via VBA) ce qui sera beaucoup plus rapide. Il y a aussi PowerQuery qui peut faire ce travail.

Pouvez-vous joindre un fichier pour qu'on puisse vous proposer des solutions ? Merci.

Bonjour Saboh,

Pourquoi absolument en VBA ?
Parce que je découvre et que j'ai déjà commencé à développer un script permettant de supprimer et de réordonner des colonnes du tableau qui m'est envoyé régulièrement.
Je suis un (tout petit) peu plus à l'aise avec les formules, je vais regarder celle que vous indiquez que je ne connaissais pas.
Power query je connais de nom mais ne sais pas de quoi il s'agit précisémment

Pour ce qui est du fichier, il est là en PJ

17exemple-ref.xlsm (12.95 Ko)

Bonjour,

Pas besoin de VBA. Cette récupération de données entre 2 onglets se fait sans code avec formules. C'est très très courant. B.A. BA

Voir PJ

Teste et dis nous.

Ci-joint avec les formules en question. Vous êtes bien sur Excel 2016 ou une autre version ?

Pour ce qui est du VBA, c'est pratique dans certains cas, mais dans d'autres il est préférable de s'en passer.

La fonction utilisée

=INDEX(Tableau2[Prop 1];EQUIV([@Ref];Tableau2[Ref];0))
15exemple-ref.xlsm (13.56 Ko)

EDIT : salut @Alex

Oui effectivement, et je devrais même pour inserer ces formules dans mon script.

Sub Insert_Col_BC()
'
' compléter_tableau_BC Macro

    n = Application.WorksheetFunction.CountA(Columns("A:A"))
    ActiveSheet.Range("A2:A" & n).Value = INDEX(Tableau2[Prop 1];EQUIV([@Ref];Tableau2[Ref];0))
    ActiveSheet.Range("B2:B" & n).Value = INDEX(Tableau2[Prop 2];EQUIV([@Ref];Tableau2[Ref];0))
    ActiveSheet.Range("C2:C" & n).Value = INDEX(Tableau2[Prop 3];EQUIV([@Ref];Tableau2[Ref];0))
    ActiveSheet.Range("D2:D" & n).Value = INDEX(Tableau2[Prop 4];EQUIV([@Ref];Tableau2[Ref];0))

End Sub

il me resterait à régler l'expression "Tableau 2" que je ne suis pas sensé connaître. La seule chose invariable est le nom des feuilles

J'ai testé avec formula et value mais ça marche pas terrible

Sub Insert_Col_BC()
'
' compléter_tableau_BC Macro

    n = Application.WorksheetFunction.CountA(Columns("E:E"))
    ActiveSheet.Range("A2:A" & n).Formula = "INDEX(Tableau2[Prop 2];EQUIV([@Ref];Tableau2[Ref];0))"
    ActiveSheet.Range("B2:B" & n).Formula = "INDEX(Tableau2[Prop 2];EQUIV([@Ref];Tableau2[Ref];0))"
    ActiveSheet.Range("C2:C" & n).Value = "INDEX(Tableau2[Prop 3];EQUIV([@Ref];Tableau2[Ref];0))"
    ActiveSheet.Range("D2:D" & n).Value = "INDEX(Tableau2[Prop 4];EQUIV([@Ref];Tableau2[Ref];0))"

End Sub

donne :

image

Mais on se rapproche.
J'ai tenté le "=...." devant "...INDEX..." mais le script devient tout jaune

Votre code tel quel va provoquer une erreur. Pour insérer une formule il faut utiliser Range.Formula, propriété (Excel) | Microsoft Learn ou bien Propriété Range.FormulaLocal (Excel) | Microsoft Learn.

Soit

ActiveSheet.Range("A2:A" & n).Formula = "=INDEX(Tableau2[Prop 2],MATCH([@Ref],Tableau2[Ref],0))"

Mais je répète qu'a priori il est inutile de travailler avec du VBA. Les tableaux structurés répètent automatiquement les formules dans les lignes insérées. Quant au tableau de référence, il n'a pas de raison de changer de nom, si ? Auquel cas on peut le retrouver avec Worksheet.ListObjects.

Mais bon restons simples, pourquoi se forcer à utiliser du VBA ? En plus vous débutez vous risquez d'avoir beaucoup d'erreurs chronophages.

Pourquoi le VBA ?
Bah parce que ça m'intéresse. Autrefois je développais en Lingo (un dérivé du Java) et avec le temps j'arrivais à des développements assez fins et élégants.
De plus dans le cadre de ce projet,
réguliérement je reçois le tableau BASE qui comprend 80 000 lignes environ, sur 70 colonnes
Dans un premier temps, pour éviter les erreurs je n'ai trouvé que le script VBA pour supprimer les colonnes inutiles, (j'en garde 10 à la fin) les réagencer dans un ordre logique pour l'humain qui lira le tableau à la fin.

En tout cas je te remercie pour la solution apportée dans ton dernier message, elle convient à merveille après avoir remplacé le "EQUIV" par "MATCH" (j'essaierai de comprendre la différence demain), je pourrais passer plus de temps à la machine à café, et il n'y aura plus les erreurs inhérentes à un remplissage manuel.

Bonne soiré

Ok pas de soucis. Prenez le temps de regarder les 3 liens que je vous ai transmis. Vous aurez la réponse à vos questions (equiv/match : français/anglais), et il y a des indications sur comment gérer les tableaux structurés en VBA. De manière générale, voici la doc correspondant à l'objet tableau structuré dans Excel.

Bonne fin de journée également.

Si je comprends bien ton dernier message cette recherche de valeurs sera récurrente sur x exports. Et en plus avant d'obtenir un fichier à partir de cet export tu retravailles ses données et son format.

Dans ce cas il serait effectivement beaucoup plus interessant d'envisager un code qui fait tout ça à ta place à chaque fois.

L'idée c'est d'avoir un code dans un fichier qui contient un bouton "parcourir". L'utilisateur va sélectionner l'export et fait tout ton traitement manuel. Enfin, au choix, soit ton fichier export lui-même est enregistré modifié soit le code crée un troisième fichier résultat.

Édit :

"L'utilisateur va sélectionner l'export et LE CODE fait tout ton traitement manuel."

Bonjour Alex,

Tu as effectivement tout compris, à la seule différence que je suis l'utilsateur final... avec un collègue si je suis absent.
Mon script avance bien, grâce notamment à l'aide de Saboh
Actuellement je cale la dessus :

image

Où je dois remplacer ces chaînes de texte par des nombres au format "000.000"
Jusqu'à présent je le fais à la main avel le "convertir en nombre" du triangle

    Columns("AA:AB").Select
    Selection.Replace What:="+", Replacement:=".", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
    Columns("AA:AB").Select
    Selection.NumberFormat = "000+000" '(mon excel est paramétré pour afficher un + comme séparateur décimale)

Malheureusement ça donne rien, j'arrive à modifier le séparateur, mais pas à convertir en nombre

+

SNCF ou autoroute ?

Les PK. Que de souvenirs.

Bonjour à tous,

Essayez peut etre ceci tout simplement

With Columns("AA:AB")
    .Replace What:="+", Replacement:=".", LookAt:=xlPart
    .Value2 = .Value2
    .NumberFormat = "000+000"
End With

Pour le format je ne suis pas sûr si ça fonctionne, jamais utilisé le + pour séparer des milliers c'est étrange.

Dans le cas des PK c'est logique. Un PK est un Point Kilométrique sur un axe (voie SNCF, autoroute, ...). Tu peux voir cet affichage sur le séparateur terre plein sur les autoroutes (panneaux blancs) ou sur les bornes d'urgence orange.

image

La première partie avant le séparateur "+" indique le nombre de km depuis l'origine et la seconde partie un ajout de distance inférieur au km. Le "+" n'est pas un séparateur de milliers.

"79+933" veut dire à 79 kilomètres et 933 mètres à partir du point de départ.

Dans le cas des PK c'est logique. Un PK est un Point Kilométrique sur un axe (voie SNCF, autoroute, ...). Tu peux voir cet affichage sur le séparateur terre plein sur les autoroutes (panneaux blancs) ou sur les bornes d'urgence orange.

La première partie avant le séparateur "+" indique le nombre de km depuis l'origine et la seconde partie un ajout de distance inférieur au km. Le "+" n'est pas un séparateur de milliers.

"79+933" veut dire à 79 kilomètres et 933 mètres à partir du point de départ.

Ah merci Alex je comprends mieux. Après pour le calcul ça équivaut à un séparateur de milliers puisqu'on sépare les km des mètres.

Je disais ça car dans Excel forcément voir des "+" qui ne sont pas des additions porte à confusion. Mais bon si c'est le séparateur de milliers du système ça ne devrait pas poser problème.

Les 2 codes me retournent bien un format numérique également.

As-tu un fichier exemple anonymisé ?

Les PK sont mes restes SNCF.

Sub Macro7()
'
' Macro7 Macro
'
   With Columns("AA:AB")
    .Replace What:="+", Replacement:=",", LookAt:=xlPart
    .Value2 = .Value2
    .NumberFormat = "000+000"
    End With
End Sub

ça fonctionne nickel, j'avais un petit dysfonctionnement au départ car je suppose que pour VBA le "." est un séparateur de milliers, j'azi juste eu à le remplacer par ","

néammoins il reste un souci sur les PK <1 :

image
Rechercher des sujets similaires à "completer tableau references provenant second"