XL 2016 VBA pour compiler les résultats de deux tableaux en 1 avec id unique

Tomas82

XLDnaute Nouveau
Bonjour,

J'ai un fichier excel avec deux sources de données (deux onglets) complémentaires pour un id donné que j'aimerai compilé dans un seul onglet Résultat par exemple.

J'ai dans mon master (qui ne sera pas joint) fait la solution en formule mais compte-tenu de la volumétrie, le temps d'action est relativement long : Recherche v imbriqué; concatener; Si...

Étant débutant en vba, je souhaite à partir du fichier joint en exemple avoir une idée du code que je devrais réadapter à mes besoins mais je ne sais pas par quoi commencer.

L'idée est de récupérer l'Id de la colonne A de l'onglet Source1 (qui est commun à la source2), de le coller en A de l'onglet Résultat et de ramener les autres informations dans ce même onglet Résultat.

Petite subtilité, j'aimerai que les données de la source1 soient collées à partir de la colonne C de l'onglet Résultat car dans la colonne B j'aimerai qu'à partir de la première lettre de l'id écrire un texte qui est surligné en jaune dans mon fichier d'exemple.
Autre particularité : La Valeur1 de l'onglet Source1 est une donnée qui ne peut-être comprise. Par conséquent, j'aimerai effectuer un RechercheV sur une table pour ramener la description à la place du numéro (voir onglet Data support).
Par la suite les valeurs contenues dans Source2 devront se mettre à la suite des données de la source1.

PS : je n'ai pas besoin de récupérer les en-têtes car mon onglet résultat est déjà prêt!

Dans l'attente de vos retours, un gros merci!!!

Thomas
 

Pièces jointes

  • Classeur1-test.xlsx
    16.9 KB · Affichages: 10

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Tomas, bonjour le forum,

En pièce jointe ton fichier modifier avec le code ci-dessous :

VB:
Sub Macro1()
Dim DS As Worksheet 'déclare la variable DS (onglet Data Support)
Dim S1 As Worksheet 'déclare la variable S1 (onglet Source1)
Dim S2 As Worksheet 'déclare la variable S2 (onglet Source2)
Dim R As Worksheet 'déclare la variable R (onglet Résultat)
Dim TS1 As Variant 'déclare la variable TS1 (Tableau Source1)
Dim TS2 As Variant 'déclare la variable TS2 (Tableau Source2)
Dim I As Integer 'déclare la variable I (Incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)

Set DS = Worksheets("Data support") 'définit l'onglet DS
Set S1 = Worksheets("Source1") 'définit l'onglet S1
TS1 = S1.Range("A1").CurrentRegion 'définit le tableau TS1
Set S2 = Worksheets("Source2") 'définit l'onglet S2
TS2 = S2.Range("A1").CurrentRegion 'définit le tableau TS2
Set R = Worksheets("Résultat") 'définit l'onglet R
R.Range("A1").CurrentRegion.Offset(1, 0).ClearContents 'efface les anciennes données de l'onglet R
For I = 2 To UBound(TS1, 1) 'boucle sur toutes les lignes I du tableau des valeurs TS1 (en partant de la seconde)
    K = K + 1 'incrémente K
    ReDim Preserve TL(1 To 14, 1 To K) 'redimensionne le tableau des lignes (14 lignes, K colonnes)
    TL(1, K) = TS1(I, 1) 'récupère dans la ligne 1 colonne K de TL la donnée en ligne I colonne 1 de TS1
    'TL(2, K) = je n'ai pas compris, je te laisse gérer
    TL(3, K) = TS1(I, 2) 'récupère dans la ligne 3 colonne K de TL la donnée en ligne I colonne 2 de TS1
    TL(4, K) = TS1(I, 3) 'récupère dans la ligne 4 colonne K de TL la donnée en ligne I colonne 3 de TS1
    TL(5, K) = DS.Columns(1).Find(TS1(I, 4), , xlValues, xlWhole).Offset(0, 1) 'récupère dans la ligne 5 colonne K de TL la donnée correspondante à ligne I colonne 4 de TS1 dans le tableau de l'onglet DS
    TL(6, K) = TS1(I, 5) 'récupère dans la ligne 6 colonne K de TL la donnée en ligne I colonne 5 de TS1
    TL(7, K) = TS1(I, 6) 'récupère dans la ligne 7 colonne K de TL la donnée en ligne I colonne 6 de TS1
    TL(8, K) = TS1(I, 7) 'récupère dans la ligne 8 colonne K de TL la donnée en ligne I colonne 7 de TS1
    TL(9, K) = TS1(I, 8) 'récupère dans la ligne 9 colonne K de TL la donnée en ligne I colonne 8 de TS1
    TL(10, K) = TS2(I, 2) 'récupère dans la ligne 10 colonne K de TL la donnée en ligne I colonne 2 de TS2
    TL(11, K) = TS2(I, 3) 'récupère dans la ligne 11 colonne K de TL la donnée en ligne I colonne 3 de TS2
    TL(12, K) = TS2(I, 4) 'récupère dans la ligne 12 colonne K de TL la donnée en ligne I colonne 4 de TS2
    TL(13, K) = TS2(I, 5) 'récupère dans la ligne 13 colonne K de TL la donnée en ligne I colonne 5 de TS2
    TL(14, K) = TS2(I, 6) 'récupère dans la ligne 14 colonne K de TL la donnée en ligne I colonne 6 de TS2
Next I 'prochaine ligne de la boucle
R.Range("A2").Resize(K, 14).Value = Application.Transpose(TL) 'renvoie dans A2 redimensionnée de l'onglet R, le tableau TL transposé
End Sub
Le fichier :
 

Pièces jointes

  • Tomas_ED_V01.xlsm
    31.8 KB · Affichages: 9

Tomas82

XLDnaute Nouveau
Juste pour info à la ligne :
'TL(2, K) = je n'ai pas compris, je te laisse gérer
Voici ce que je voulais faire! Cela fonctionne tr`s bien.
TL(2, K) = IIf(Left(TL(1, K), 1) = "C", "Coucou", IIf(Left(TL(1, K), 1) = "P", "Parler", "Toctoc"))
 

Tomas82

XLDnaute Nouveau
Re bonjour,

J'ai observé une petite subtilité que je savais pas initialement...
Mais ma source 1 et ma source 2 ne sont pas forcément dans le même ordre et ne comporte pas forcément le même nombre de ligne... Comment je pourrais faire pour que cela match??

Dans l'attente de vous lire merci le forum!
 

Tomas82

XLDnaute Nouveau
Ok super merci beaucoup, j'ai essayé de faire un filtre A-Z sur mes deux onglets pour avoir les id dans le même sens et d'ajouter si pas de correspondance alors uniquement source 1.
C'est la source 2 qui ne sera jamais équivalente donc plus de datas source 1 que source 2...
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

Finalement pas tant que ça... Le code adapté :

VB:
Sub Macro1()
Dim DS As Worksheet 'déclare la variable DS (onglet Data Support)
Dim S1 As Worksheet 'déclare la variable S1 (onglet Source1)
Dim S2 As Worksheet 'déclare la variable S2 (onglet Source2)
Dim R As Worksheet 'déclare la variable R (onglet Résultat)
Dim TS1 As Variant 'déclare la variable TS1 (Tableau Source1)
Dim TS2 As Variant 'déclare la variable TS2 (Tableau Source2)
Dim TM() As Variant
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable I (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TL(1 To 14) As Variant 'déclare la variable TL (Tableau des Lignes)
Dim LI As Integer 'déclare la variable LI (Ligne)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set DS = Worksheets("Data support") 'définit l'onglet DS
Set S1 = Worksheets("Source1") 'définit l'onglet S1
TS1 = S1.Range("A1").CurrentRegion 'définit le tableau TS1
Set S2 = Worksheets("Source2") 'définit l'onglet S2
TS2 = S2.Range("A1").CurrentRegion 'définit le tableau TS2
Set R = Worksheets("Résultat") 'définit l'onglet R
R.ListObjects(1).DataBodyRange.ClearContents 'efface les anciennes données de l'onglet R
For I = 2 To UBound(TS1, 1) 'boucle 1 : sur toutes les lignes I du tableau des valeurs TS1 (en partant de la seconde)
    TL(1) = TS1(I, 1) 'récupère dans la ligne 1 colonne K de TL la donnée en ligne I colonne 1 de TS1
    TL(3) = TS1(I, 2) 'récupère dans la ligne 3 colonne K de TL la donnée en ligne I colonne 2 de TS1
    TL(4) = TS1(I, 3) 'récupère dans la ligne 4 colonne K de TL la donnée en ligne I colonne 3 de TS1
    TL(5) = DS.Columns(1).Find(TS1(I, 4), , xlValues, xlWhole).Offset(0, 1) 'récupère dans la ligne 5 colonne K de TL la donnée correspondante à ligne I colonne 4 de TS1 dans le tableau de l'onglet DS
    TL(6) = TS1(I, 5) 'récupère dans la ligne 6 colonne K de TL la donnée en ligne I colonne 5 de TS1
    TL(7) = TS1(I, 6) 'récupère dans la ligne 7 colonne K de TL la donnée en ligne I colonne 6 de TS1
    TL(8) = TS1(I, 7) 'récupère dans la ligne 8 colonne K de TL la donnée en ligne I colonne 7 de TS1
    TL(9) = TS1(I, 8) 'récupère dans la ligne 9 colonne K de TL la donnée en ligne I colonne 8 de TS1
    For J = 2 To UBound(TS2, 1) 'boucle 2 : sur toutes les lignes J du tableau des valeurs TS2 (en partant de la seconde)
        If TS1(I, 1) = TS2(J, 1) Then 'condition : si les données sont identiques
            TL(10) = TS2(J, 2) 'récupère dans la ligne 10 colonne K de TL la donnée en ligne J colonne 2 de TS2
            TL(11) = TS2(J, 3) 'récupère dans la ligne 11 colonne K de TL la donnée en ligne J colonne 3 de TS2
            TL(12) = TS2(J, 4) 'récupère dans la ligne 12 colonne K de TL la donnée en ligne J colonne 4 de TS2
            TL(13) = TS2(J, 4) 'récupère dans la ligne 13 colonne K de TL la donnée en ligne J colonne 5 de TS2
            TL(14) = TS2(J, 6) 'récupère dans la ligne 14 colonne K de TL la donnée en ligne J colonne 6 de TS2
            Exit For 'sort de la boucle 2
        End If 'fin de la condition
    Next J 'prochaine ligne de la boucle 2
    LI = IIf(Range("A2").Value = "", 2, Range("A1").End(xlDown).Row + 1) 'définit la ligne LI
    R.Cells(LI, "A").Resize(1, 14).Value = TL 'renvoie le tableau TL dans la cellule ligne LI colonne A (redimensionnée) de l'onglet R
Next I 'prochaine ligne de la boucle
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
End Sub
 

Discussions similaires