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é.

14classeur1.pdf (47.50 Ko)

Ç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 :

7exo-fruits.xlsm (15.51 Ko)

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.

8test.xlsx (26.88 Ko)

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 ?

6copie-de-test.xlsx (40.30 Ko)

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 ! J'ai réussi à détruire mon message... trop pressé, je reprends:

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!

Rechercher des sujets similaires à "fusionnant texte repondant critere"