XL 2016 Réunir les données de plusieurs colonnes non contigües

matamata

XLDnaute Nouveau
Hello à tous,

De façon générale je trouve mon bonheur ce le forum mais là je coince.
J'aimerai regrouper les données du premier tableau Source dans un second Resultat (en jaune) afin de l'analyser à partir de TCD.
Le tableau source étant prévu de s'agrandir en fonction des ID ajoutés.

Dans l'exemple de classeur je veux :
- regrouper les données Noms et Prénoms dans deux colonnes sans cellules vides
- garder les doublons si existant
- mettre sous format tableau pour un traitement via TCD

Le tout par formules, power query ou VBA en dernier recours ou en partie.

J'ai une formule en L3 mais avec des vides (0).

Merci d'avance pour votre aide.
 

Pièces jointes

  • Classeur1.xlsx
    16.5 KB · Affichages: 20

Robert

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

Peut-être comme ça :

VB:
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TS1 As ListObject 'déclare la variable TS (Tableau Structuré 1)
Dim TS2 As ListObject 'déclare la variable TS (Tableau Structuré 2)
Dim PL1 As Range 'déclare la variable PL1 (PLage 1)
Dim PL2 As Range 'déclare la variable PL2 (PLage 2)
Dim TV As Variant 'déclare la variable TV (Tableau des |Valeurs)
Dim TR() As Variant 'déclare la variable TR (Tableau des Résultats)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (Incrément)
Dim K As Integer 'déclare la variable K (Incrément)

Set O = Worksheets("Feuil1") 'définit l'onglet O
Set TS1 = O.ListObjects("Source") 'définit le tableau structuré TS1
Set PL1 = TS1.DataBodyRange 'définit la plage PL1
Set TS2 = O.ListObjects("Resultat") 'définit le tableau structuré TS2
TV = PL1 'définit la tableau des valeurs TV
For J = 2 To UBound(TV, 2) Step 2 'boucle 1 : sur toutes les colonnes J de TV par pas de deux (en partant de la seconde)
    For I = 1 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I de TV
        If TV(I, J) <> "" Then 'condition : si la donnée ligne I colonne J de TV n'est pas vide
            K = K + 1 'incrémente K
            ReDim Preserve TR(1 To 2, 1 To K) 'redimensionne le tableau des résultats TR (2 lignes, K colonnes)
            TR(1, K) = TV(I, J) 'récupère le nom dans la ligne 1 de TR
            TR(2, K) = TV(I, J + 1) 'récupère le prénom dans la ligne 2 de TR
        End If 'fin de la condition
    Next I 'prochaine ligne de la boucle 1
Next J 'prochaine colonne de la boucle 2
If TS2.ListRows.Count = 0 Then TS2.ListRows.Add 'si le tableau structuré TS2 ne contient aucune ligne, ajoute une ligne au tableau structuré TS2
TS2.DataBodyRange.Delete 'efface toutes les données du tableau structuré TS2
TS2.Resize Range(Range("I2").Resize(K, 2).Address) 'redimensionne le tableau structuré TS2
Set PL2 = TS2.DataBodyRange 'définit la plage PL2
PL2(1, 1).Resize(K, 2).Value = Application.Transpose(TR) 'renvoie dans la première cellule de la plage PL2, redimensionnée, le tableau TR transposé
End Sub
 

matamata

XLDnaute Nouveau
Merci à vous

Chris,
Il faut vraiment que je me mettes à Power Query....j'ai commencé mais ne maitrise pas les formules.
J'imagine que l'on peut actualiser le tableau par VBA via un bouton ou à l'ouverture du classeur car la source sera mise à jour en permanence?

Robert,
Pas encore testé le code, je vais voir celà.

Encore merci
 

matamata

XLDnaute Nouveau
Non, il est vrai que tu as fait un tri a->z
Je veux dire que dans ta solution on a:

Hochon
Hochon
Maurice...etc donc par ligne, il faudrait

Hochon
Audine
Rouana...etc

La solution VBA fonctionne mais j'aimerai éviter dans un premier temps...

Merci, je ne sais pas si je me fait bien comprendre
 

matamata

XLDnaute Nouveau
Oups, désolé je n'avais pas capté le " Si on avait Nom, Prénom, Nom1, Prenom1, Nom2, Prénom2"
J'ai copié cet exemple qui correspondait à mes besoins mais effectivement je suis plutôt dans de le cas que tu décris.
j'essaye de faire celà.
 

Discussions similaires

Statistiques des forums

Discussions
311 733
Messages
2 082 015
Membres
101 868
dernier inscrit
pierreselo33