Bonjour,
Je souhaiterais fusionner deux listes via une "clé primaire" et via une macro et non une formule de type RECHERCHEV par exemple
Quelqu'un connait-il une solution ?
Voici un fichier exemple de ce que je souhaite obtenir...
Merci d'avance
Bonjour,
Je souhaiterais fusionner deux listes via une "clé primaire" et via une macro et non une formule de type RECHERCHEV par exemple
Quelqu'un connait-il une solution ?
Voici un fichier exemple de ce que je souhaite obtenir...
Merci d'avance
Bonjour,
Il faut que tu regardes l'utilisation des tableaux (cf tutoriel ci dessous)
http://silkyroad.developpez.com/vba/tableaux/
sinon, reviens vers nous...
Elise
Merci pour votre réponse,
Je ne connais pas grand chose aux macros alors c'est un peu compliqué..
OK... sinon, on peut faire autrement, et plus simple en compréhension si tu es novice...
1) Pour le moment, il n'y a pas de "clé primaire" ds tes listes.
2) est-ce que liste 1 peut être + ou moins longue que liste 2 ?
Sont-elle toujours ds le même ordre toutes les deux ?
3) Qu'est-ce qui t'ennuie avec la recherche V ?
sinon, toujours au niveau des formules, peut-être que la formule index / equiv serait + adapté ?
L'une ou l'autre des formules peuvent s'enregistrer par macro et à la fin tu finis par "copier coller valeur" pour figer les données.
J'entends par clé primaire, une colonne en commun aux deux listes qui permet de les fusionner.
Les listes n'ont pas forcément la même taille
Bon je vais regarder pour enregistrer les différentes fonctions en macro...
bonsoir
dans ton cas apres avoir regardé ton exemplaire
l'utilisations des tableau me sembles tout indiqué
liste 1 tu a
colonne 1.2.3.4
dans liste 2 tu a:
1.5.6.7
ce qui veut dire que l'on pourrai prendre la colonne des "1" en cle primaire en l'occurence la colone "A"
donc on créé 2 tableaux
tablo1 et tabo2
nous savons aussi que le plus grand c'est "7"
donc notre resultat devra etre
1.2.3.4.5.6.7
voila j'ai pris comme parametre la colonne "A" etant donné que je ne voyais pas d'autre point de similarité entre les 2 tableaux
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Sub rassemble2tablos() Dim tablo1, tablo2 tablo1 = Sheets("Liste 1").Range("a1:g" & Sheets("Liste 1").UsedRange.Rows.Count) 'on prend toute les lignes de la page liste1 sur 7 colonnes 'il y aura donc des colonne dans notre tableaux qui seront vides 'maintenant nous savons que dans liste 2 seule la colonne "a" est commune on a donc pas besoins de la prendre tablo2 = Sheets("liste 2").Range("a1:d" & Sheets("Liste 2").UsedRange.Rows.Count) 'on prend toute les lignes de la page liste2 sur 7 colonnes 'maintenant que nous avons nos 2 tableaux on va en quelque sorte faire un merge For i = 1 To UBound(tablo1) 'on boucle sur tout les items du tablo1 qui sont apparament egale a tablos 2en terme de lignes 'i representant la ligne le chiffre representant la colonne tablo1(i, 5) = tablo2(i, 2): tablo1(i, 6) = tablo2(i, 3): tablo1(i, 7) = tablo2(i, 4) 'voila tout ce qui avait dans la colonne B C D DE LA LISTE 2 SE TROUVE MAINTENANT DANS liste1 en E.F.G Next 'il nous reste maintenant a transposer notre tablo1dans le sheets fusion 'donc Sheets("Fusion").Range("a1:g" & UBound(tablo1)) = tablo1 'et voila c'est fini End Sub
au plaisir
Salut.
Mon grain de sel: un fichier joint tel que celui-là ne sert pas à grand-chose...
Il faudrait préciser quelle est la colonne "clé primaire" et montrer des données réelles (je n'ai pas dit confidentielles).
Il est de loin préférable d'utiliser Excel (et donc RECHERCHEV ou INDEX/EQUIV comme proposé par Lilou51), quitte à s'appuyer sur du VBA pour le faire...
Des infos complémentaires seraient bienvenues...
Merci pour vos réponses.
Je viens de me rendre compte que mon exemple n'était pas approprié...
Je pense que le fichier joins est plus clair...
J'ai deux listes, avec une colonne (prénom) et d'autres colonnes avec des valeurs.
Les prénoms sont parfois présent dans les deux tableaux, je veux donc concaténer les colonnes de valeurs correspondantes aux même prénoms
J'ai énormément de lignes et je voudrais le faire via une macro...
Merci d'avance
Bonjour
C'est bien ce que j'ai dis précédemment.
A partir du moment ou les lignes sont dans le même ordre tu créés 2, voir 3 tableaux de même dimensions
Ensuite du ajoutes les données de la même manière que l'exemple que je t'ai fait.
Le petit code étant largement commenté tu devrais trouver ton chemin facilement.
L'exemple que je t'ai donné fonctionne encore avec ton dernier exemple. Il suffit de changer le nombre de lignes et de colonnes.
Si tu n'y arrive pas je te ferai un exemple
Mais essaie avant de modifier le code à ton nouvel exemple.
Au plaisir
Bonjour,
De ce que j'en voie, les données doivent juste être agrégées sur une même ligne ? Indépendamment de la colonne d'origine ? Comme on n'aurait des notes d'une bulletin scolaire à mettre ensemble, mais en se moquant de la date de l'interro ? Est-ce exact ?
Si oui, normalement, ceci devrait répondre à ta problématique...
a+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 Sub ListesEnsemble() Set plage1 = ThisWorkbook.Worksheets("Feuil1").Range("A1").CurrentRegion Set Plage2 = ThisWorkbook.Worksheets("Feuil2").Range("A1").CurrentRegion plage1.Copy ThisWorkbook.Worksheets("Feuil3").Range("A1") For Each cellule In Plage2.Resize(, 1) Set Plage3 = ThisWorkbook.Worksheets("Feuil3").Range("A1").CurrentRegion nbligne3 = 0 On Error Resume Next nbligne3 = Application.WorksheetFunction.Match(cellule, Plage3.Resize(, 1), 0) On Error GoTo 0 If nbligne3 = 0 Then 'ajout de la nouvelle ligne nbligne3 = Plage3.Rows.Count + 1 For i = 1 To Plage2.Columns.Count If IsEmpty(cellule.Offset(, i - 1)) = False Then ThisWorkbook.Worksheets("Feuil3").Cells(nbligne3, i) = cellule.Offset(, i - 1) Else Exit For End If Next Else 'agrégation des infos sur la ligne existante For j = 1 To Plage3.Columns.Count + 1 If IsEmpty(ThisWorkbook.Worksheets("Feuil3").Cells(nbligne3, j)) Then For i = 2 To Plage2.Columns.Count If IsEmpty(cellule.Offset(, i - 1)) = False Then ThisWorkbook.Worksheets("Feuil3").Cells(nbligne3, j + i - 2) = cellule.Offset(, i - 1) Else Exit For End If Next Exit For End If Next End If Next End Sub
Elise
Nota : le code de Patrick semble effectivement plus beau, plus pro... Le fait est que les tableaux ne sont pas toujours accessibles quand on est novice... L'exemple ci-dessus doit être plus simple à comprendre...mais sans doute plus lent...
Re
Je viens de relever une incohérence dans tes tableaux 1 et 2. Pour ton 2ème dans le résultat final il y a quelque chose qui ne va pas en tout cas pour moi :
- dans le tableau 1 tu as la colonne 1 pleine 1.5.6
- dans le tableau 2 tu as la colonne 1 pleine 2.6.6
Comment est il possible de te retrouver en tableau 3 avec en 2ème colonne 2.2.6
Là je crois que ta question manque de précision sur les critères
A quoi vont correspondre ces colonnes. Certainement à un critère. Si c'est le cas alors le tableau 3 est faux.
Tu vois ce que je veux dire ??
Et merci pour le pouce -
au plaisir
Non le tableau est bon, il ne faut pas regarder en terme de colonne mais plutot de ligne pour chaque prénom...
Sinon la macro est bien, sauf que les lignes peuvent être dans n'importe quel ordre d'un tableau a l'autre. Je vais essayer d'adapte
Il faudrait mieux expliquer ce que tu souhaites obtenir, car c'est un peu le brouillard.
Les données de la première colonne de la troisième feuille existent-elles ou faut-il récupérer les données sans doublons des deux premières feuilles?
A voir tes tableaux, les données peuvent glisser de colonne lors de l'agrégation, en fonction des colonnes déjà remplies pour la feuille 1 => Y-a-t-il un nombre maximum de colonnes? Ce nombre est-il le même pour chaque feuille?
Tes données contiennent-elles une ligne d’entête ou pas?
Combien de lignes peuvent avoir tes tableaux? Pour des tableaux relativement petits, on pourra se passer d'utiliser des tableaux VBA, plus lourds à mettre en place...
Comme tu le vois, bien exposer son problème, c'est déjà le résoudre.
La feuille 3 est vide,
Les lignes peuvent être dans n'importe quel ordre selon le tableau 1 ou 2
Il n'y a pas de nombre de colonne maxi, et le nombre de colonne n'est pas le même pour les deux tableaux
Pour un prénom donné, les infos le concernant venant des tableaux 1 et 2 doivent être reuni sur la meme ligne dans un 3 eme tableau
Si un prénom n'est présent que dans un seul tableau, il doit quand meme apparaitre dans le 3 eme tableau
Il y a des entêtes de colonne mais pas de lignes
Les tableaux peuvent avoir plus de 1000 lignes
Je sais pas si c'est plus clair...
Et les colonnes "glissent" bien pour remplir les trous sur une même ligne?
L'ordre de récupération des colonnes a-t-il de l'importance?
Peut-il y avoir des "trous" sur une ligne entre les données d'une même ligne des tableaux 1 et 2, ou peut-on arrêter le traitement dès que l'on trouve du vide sur une ligne?
Les colonnes ne glissent pas de se fait il peut y avoir des trous.
L'ordre de récupération des colonnes n'a pas forcément d'importance non
bonjour
tu dis que tes colonnes ont des en têtes mais que l'ordre n'a pas d'importance
c'est un peu contradictoire pour moi sinon a quoi servent les entêtes si c'est pas pour désigner quelque chose
au plaisir
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager