Cellule fusionnant plusieurs cellules texte répondant à un critère
Bonjour,
C'est une fonction que je suis presque sûr d'avoir utilisé, il y a longtemps. Mais je n'arrive tout simplement pas à me rappeler comment j'y suis parvenu. Et pourtant, ça semble assez simple.
Disons que dans la feuille 1, colonne A, j'ai des numéros de référence, qui peuvent apparaître plusieurs fois.
Toujours sur la même feuille 1, colonne B, j'ai des cellules.texte..
FEUILLE 2 maintenant, où je veux résumer ces infos
Colonne A => les mêmes numéros de référence de la feuille 1 colonne A, apparaissant 1 fois chacun, par ordre croissant
Colonne B => je veux fusionner, en une chaîne texte, toutes les cellules de la feuille 1 colonne B qui sont sur une ligne correspondant au no de réf.
J'ai joins un PDF qui montre assez bien je pense le comportement espéré.
Ça vous dit quelque chose?
Bonjour
A priori pas faisable par formules sauf colonnes intermédiaires
VBA ou PowerQuery (add on gratuit sur 2010, intégré à partir de 2016)
Bonjour Fred,
je te propose ce fichier Excel :
la feuille 2 est bien entièrement vide, n'est-ce pas ?
va sur la feuille 1 ; Ctrl e ➯ travail effectué !
Alt F11 pour voir le code VBA, puis revenir sur Excel
si besoin, tu peux demander une adaptation.
merci de me dire si ça te convient.
dhany
Bonjour Fred,je te propose ce fichier Excel :
Exo fruits.xlsm
la feuille 2 est bien entièrement vide, n'est-ce pas ?
va sur la feuille 1 ; Ctrl e ➯ travail effectué !
Alt F11 pour voir le code VBA, puis revenir sur Excel
si besoin, tu peux demander une adaptation.
merci de me dire si ça te convient.
dhany
En fait, il y a une difficulté supplémentaire à ce que je veux faire et que je n'ai pas bien expliqué.
Ma feuille2, où je veux fusionner des cellules textes, n'est pas vide. Il s'agit d'un tableau, dont une des colonnes comporte les numéros-référence. Et une autre de ces colonnes doit donc fusionner toutes les cellules-texte de la feuille1 ayant ce même numéro de référence.
Pour reprendre mon exemple un peu simpliste:
au départ, j'ai ce tableau en feuille 1
Colonne A / Colonne B
10 / Pomme
10 / Orange
15 / Carottes
10 / Citron
20 / Liqueur
15 / Céleri
et en feuille 2...
en A2, si j'écris 10
je veux voir apparaître en B2: Pomme / Orange / Citron
et si je remplace par 15
B2 change pour Carottes / Célerri
alors envoie un fichier exemple représentatif, sans données confidentielles (donc à remplacer par des données fictives).
attention : représentatif, ça signifie aussi qu'il doit y avoir ta feuille2 où tu saisis ton numéro de référence.
dhany
Bien sûr, la voici.
Explication:
J'ai une liste de DÉCORS sur la feuille 1, auquel correspond un no de LOCATION (ou lieu de tournage si vous préférez) qui apparaît dans la colonne D. Plusieurs DÉCORS peuvent être tournés dans la même LOCATION.
J'ai une LISTE DES LOCATIONS sur la feuille 2. Et je veux qu'en colonne C, dans la cellule-texte DÉCORS, il y ait fusion de tous les DÉCORS tournés dans cette LOCATION.
Comme cette LISTE DE LOCATIONS comportera plusieurs autres infos (adresses, contacts, contrat, no de réquisition, etc), je ne peux utiliser une macro qui va balayer toute cette info. La seule colonne qui doit être dynamiquement générée, c'est la colonne C. Le reste doit demeurer intact.
bonjour à tous
salut dhany, Chris
une proposition un peu décalée, sans "fusion"
un simple TCd pour remettre en forme ton tableau de saisie
on peut améliorer la présentation
je déteste concaténer des données, car on perd de l'information. Je préfère les garder en l'état et faire une présentation.
reste la question à 2 € : pourquoi fusionner ?
pour faire un publipostage ?
Bonjour, Salut à tous !
Sub ListerDécors()
Dim d As Object, loc, k, i&
Set d = CreateObject("Scripting.Dictionary")
loc = ActiveSheet.Range("A1").CurrentRegion.Value
For i = 1 To UBound(loc)
If loc(i, 4) <> "" Then
k = loc(i, 5)
If d.exists(k) Then
d(k) = d(k) & " / " & loc(i, 3)
Else
d(k) = loc(i, 3)
End If
End If
Next i
loc = [Tableau1].Columns(2).Value
For i = 1 To UBound(loc)
k = loc(i, 1)
If d.exists(k) Then loc(i, 1) = d(k) Else loc(i, 1) = Empty
Next i
[Tableau1].Columns(3).Value = loc
End Sub
NB- Un impératif (si tu veux éviter de nombreux problèmes) : ton tableau Excel doit demeure à la dimension de tes données, pas une ligne de plus ! Il s'étendra tout seul sans que tu aies à t'en préoccuper.
Cordialement.
J'aime beaucoup! C'est simple, très rapide, efficace!
Si j'avais une adaptation à faire à partir de cette macro, ce serait la suivante. Et comme je ne m'y connais pas du tout en Visual Basic, je vais l'expliquer du mieux que je peux.
Lorsque la macro cherche la location dans la feuille 1, elle semble se servir de la colonne "texte" "Nom de la location". Je préférerais qu'elle se serve du "No de la location", la colonne juste à la gauche.
La raison étant que deux locations peuvent porter le même nom (par exemple: "TBD", pour To Be Determined ou "Salle d'appui" ou "Stationnement, véhicules techniques") et c'est pourquoi j'ai créé des numéros de location, qui sont uniques à chaque location.
Évidemment, je pourrais changer un peu ma manière de faire et utiliser des noms de location uniques. Peut-être que c'est ce que je ferai.
Et, question, pour aider le néophyte que je suis: puis-je changer les numéros de colonne dans la macro, par des noms définis? Au cas où l'envie me prendrait d'ajouter une colonne au tableau en vitesse, sans changer la macro?
Bon !
Je n'avais pas utilisé la colonne numéro car l'outil Dictionnaire est un outil texte et qu'il fallait ensuite comparé à un numéro formaté différemment par rapport au premier tableau...
Mais tu peux dans la première boucle remplacer : k = loc(i, 5) par k = loc(i, 4)
, puis remplacer ce code :
loc = [Tableau1].Columns(2).Value
For i = 1 To UBound(loc)
k = loc(i, 1)
par:
loc = [Tableau1].Columns(1).Value
For i = 1 To UBound(loc)
k = Format(loc(i, 1), "0")
Pour ce qui est des noms de colonnes, ils ne sont utilisables que s'ils existent dans le gestionnaire de noms, j'utilise ainsi Tableau1, nom de ton tableau Excel mis automatiquement par Excel dans le gestionnaire de noms, et qui exclu l'en-tête du tableau, parce que cela simplifie le code.
Mais avoir des noms pour toutes les colonnes utilisées (ou faire évaluer des références structurées renvoyant telle ou telle colonne d'un tableau Excel) compliquerait plutôt les choses...
Si les colonnes doivent être variables, on en utilise 4, 2 par tableau, il est alors plus simple de prévoir des variables pour les colonnes utilisées, et de parcourir préalablement les lignes d'en-tête pour détecter les libellés d'en-tête et initialiser les variables avec leur numéro...
Note aussi qu'on travaille sur tableau VBA, le plus possible hors Excel (plus rapide) : loc est dans un premier temps un tableau correspondant à la totalité de ton tableau source, puis ensuite un tableau limité à une colonne de ton tableau cible, avant d'être modifié pour être ensuite affecté à la colonne cible (en une fois). Et les adressages tableaux VBA ne se font que par indices numériques.
Cordialement.
Merci pour le code, et merci pour la précieuse explication! Bien hâte de l'essayer, ce soitr (heure du Québec) si possible!