Concaténer dans une cellule plusieurs valeurs d'une colonne

Bonjour,

Je dois faire un fichier pour consolider des données issues d'un logiciel.

La demande consiste à regrouper pour chaque utilisateur tous les groupes dont il est membre et les afficher dans une cellule.

Je dispose pour ca d'un fichier avec 2 colonnes, utilisateurs et groupes. (A7:B42)

Je peux avoir plusieurs fois (pour plusieurs lignes) un utilisateur dans un groupe

La première chose que je fais et de créer une liste avec tous les utilisateurs sans doublons (D2:D5)

Ce que je n'arrive pas a faire par contre c'est d'avoir en face de chaque utilisateur (E2:E5) tous les groupes qui lui sont associés.

Le résultat final que je souhaiterais est le tableau à bordure rouge (H1:I5)

J'espère être clair dans mes explications

D'avance merci pour toute aide !

67exemple.xlsx (11.11 Ko)

Bonjour,

un essai, qui m'a permis de "travailler" sur les dictionnaires VBA...

Mais je suis peut-être à coté de la plaque

L'idée :

on passe en paramètre de la fonction "personnelle" la cellule du nom ainsi que la plage "d'activité".

La fonction ajoute "sans doublons" les activité de la personne demandée, et en fin de fonction concatène les différentes valeurs trouvées en supprimant la dernière virgule.

Pas de test d'erreur si aucune activité trouvée...

Le fichier :

266copie-de-exemple.xlsm (18.19 Ko)

il y a une histoire de volatile ou pas à mettre en place si vous voulez que la fonction se re calcul à chaque changement de valeur de la feuille ou pas, si pas alors il faudra faire [F9] pour la mise à jour des résultats.

@ bientôt

LouReeD

Merci beaucoup @LouReeD

C'est exactement ce que je cherchais.

Je pensais qu'une formule aurait fait l'affaire mais une macro c'est bien aussi, c'est juste que j'y comprends pas grand chose

Merci encore !

Bonjour,

voici le code expliqué :

' on force le "programmeur" à définir toutes ses variables
Option Explicit

'programmation d'une fonction personnelle qui pourra être utilisée comme les fonction Excel de base
Function Concatène(Qui As String, La_Plage As Range)
' la fonction attend deux arguments : Qui correspondant au nom de la personne colonne de gauche du tableau final
' La_plage : correspondant à la plage des "activité" des différentes personne

    Dim Cel As Range, Les_Groupes As String, MonDico As New Scripting.Dictionary, TestValeurDico
    ' définition de différente variable utile pour la fonction
    ' Cel : variable de type Range, on va s"en servir pour "tourner" sur les cellule de "La_Plage"
    ' Les_Groupes : variable "alphanumérique (String) qui contiendra le concaténer le de recherche
    ' MonDico : un dictionnaire VBA qui contient les activités "sans doublons"
    ' TesValeurDico : variable permettant de "tourner" dans le dico

    For Each Cel In La_Plage
    ' boucle qui tourne sur les cellules contenues dans La_Plage, Cel est alors l'exacte copie de la cellule testée
        If Cel.Offset(, -1).Value = Qui Then
        ' si la cellule qui se trouve sur la même ligne (argument absent et sur la colonne à gauche (-1) de la cellule testée est égal à QUI
            If Not MonDico.Exists(Cel.Value) Then
            ' si la valeur de la cellule testée n'existe pas dans MonDico
                MonDico.Add Cel.Value, Cel.Value
                ' alors on ajoute une clé ayant pour nom la valeur de la cellule, et on associe à cette clé la valeur de la cellule
            End If
            ' fin du test
        End If
        ' fin du test
    Next Cel
    ' cellule suivante de La_plage

    ' maintenant on concatène le résultat
    For Each TestValeurDico In MonDico.Keys
    ' on boucle sur toutes les clés de MonDico représentées ici par TestValeurDico
        Les_Groupes = Les_Groupes & MonDico(TestValeurDico) & ","
        ' la variable String Les_Groupes est égale à la valeur de cette variable concaténée avec la valeur correspondant à la clé du dico "bouclée" concaténer avec une virgule
    Next TestValeurDico
    ' clé suivante de MonDico

    ' ici on attribue la valeur "les_Groupes" au nom de la fonction, ce qui a pour effet "d'envoyer" le résultat dans la cellule où se trouve la fonction.
    Concatène = Mid(Les_Groupes, 1, Len(Les_Groupes) - 1)
    ' la "formule" ici retire la dernière virgule, car elle prend la partie de la valeur qui par du caractère 1 jusqu'au dernier caractère -1, du coup cela supprime la virgule
End Function
' fin de la programmation de la fonction personnelle

@ bientôt

LouReeD

Re

en modifiant la fin du code avec ceci :

    If Les_Groupes <> "" Then
        ' ici on attribue la valeur "les_Groupes" au nom de la fonction, ce qui a pour effet "d'envoyer" le résultat dans la cellule où se trouve la fonction.
        Concatène = Mid(Les_Groupes, 1, Len(Les_Groupes) - 1)
        ' la "formule" ici retire la dernière virgule, car elle prend la partie de la valeur qui par du carractère 1 jusqu'au dernier carractère -1, du coup cela supprime la virgule
    Else
        Concatène = ""
    End If

Ceci évite s'il n'y a pas le nom qu'il y ait une erreur de type #Valeur!

@ bientôt

LouReeD

Vous pouvez modifier ceci également :

    For Each Cel In La_Plage
    ' boucle qui tourne sur les cellules contenues dans La_Plage, Cel est alors l'exacte copie de la cellule testée
        If UCase(Cel.Offset(, -1).Value) = UCase(Qui) Then

afin que alain soit = à Alain !!!

on test sur les "majuscules", après il y a l'histoire des accents....

@ bientôt

LouReeD

Merci beaucoup pour ces explications plus que limpides !!

Aussi pour l'optimisation du code.

C'est vraiment TOP !!

Merci @ vous pour vos remerciements !

@ bientôt

LouReeD

Rechercher des sujets similaires à "concatener valeurs colonne"