0
votes

Fusionner les valeurs de la colonne B en fonction des valeurs communes de la colonne A

Dans Excel, comment fusionner les valeurs de la Colonne B en fonction des valeurs communes de la Colonne A ?

Ce dont j'ai besoin, c'est quelque chose comme ça

 entrez la description de l'image ici


10 commentaires

Quelle version d'Excel possédez-vous?


Vos données réelles ont-elles une ligne de titre?


J'utilise Excel Plus 2016


voir ici: stackoverflow .com / questions / 54582741 /… pour un UDF qui renverra la concaténation.


Merci Scot, mais c'est un peu différent de ce que vous avez recommandé car je n'ai pas de chaîne codée en dur comme "approuvé"


La formule en C2 serait: = IF (A2 <> A1, TEXTJOINIFS (B: B, ",", A: A, A2), "")


C1 de votre exemple serait simplement la partie TEXTJOINIFS (B: B, ",", A: A, A2)


En fait, utilisez celui-ci en C1 et copiez vers le bas: = IF (MATCH (A1, A: A, 0) = ROW (A1), TEXTJOINIFS (B: B, ",", A: A, A1), " ") Cela fonctionnera si les données sont triées ou non et ne placera la sortie que dans la première occurrence de la valeur de la colonne A.


Mona: vous avez été assez facilement ici pour savoir que les questions non recherchées sont déconseillées ici.


Je voudrais également noter (encore une fois) que vos questions ne sont toujours pas de très bonne qualité. Votre anglais me semble correct, vous avez donc parfaitement compris les nombreuses demandes d'écriture technique qui vous ont été faites - vous venez de choisir de les ignorer, afin de pouvoir mendier, vous incliner, gratter et plaider à la place. Ce n'est pas idéal pour le site, car cela éloigne les rédacteurs bénévoles de la résolution des problèmes dans d'autres publications.


3 Réponses :


1
votes

Voici mon code non testé bien sûr. Le code ci-dessous utilise 2 boucles pour ajouter les informations.

dim X as integer
dim X2 as integer

dim match as string

X = 1

do while sheets("sheet1").range("A" & X).value <> ""

    sheets("sheet1").range("C" & X).value = sheets("sheet1").range("B" & X).value
    match = sheets("sheet1").range("A" & X).value        
    X2 = X + 1

        do while sheets("sheet1").range("A" & X2).value = match

            sheets("sheet1").range("C" & X).value = sheets("sheet1").range("C" & X).value + ", " + sheets("sheet1").range("B" & X2).value 
            X2 = X2 + 1

        loop

    X = X2
    X = X + 1

Loop


5 commentaires

Si vous le formatez avec des cas et des indentations appropriés, alors - pourquoi pas? 🤣


Ok, je comprends votre point - c'était une réponse paresseuse @JohnyL - j'ai fait les modifications et ajouté les déclarations de variables :)


Ok, gagné pour les efforts))


Merci @JohnyL, vous m'avez officiellement accueilli dans la communauté, mon représentant avait 14 ans et c'était ma première réponse :)


Jonathan: c'est correct de faire savoir aux nouveaux utilisateurs que nous avons des systèmes de vote / acceptation ici, mais en général, nous préférerions que les gens ne demandent pas de votes. Si vous créez du bon matériel, les votes viendront de manière organique.



9
votes

Vous pouvez utiliser cette UDF:

=IF(MATCH(A1,A:A,0)=ROW(A1),TEXTJOINIFS(B:B,", ",A:A,A1),"")

Vous l'appelleriez comme ceci:

Function TEXTJOINIFS(rng As Range, delim As String, ParamArray arr() As Variant)
    Dim rngarr As Variant
    rngarr = Intersect(rng, rng.Parent.UsedRange).Value

    Dim condArr() As Boolean
    ReDim condArr(1 To Intersect(rng, rng.Parent.UsedRange).Rows.Count) As Boolean


    Dim i As Long
    For i = LBound(arr) To UBound(arr) Step 2
        Dim colArr() As Variant
        colArr = Intersect(arr(i), arr(i).Parent.UsedRange).Value
        Dim j As Long
        For j = LBound(colArr, 1) To UBound(colArr, 1)

            If Not condArr(j) Then
                Dim charind As Long
                charind = Application.Max(InStr(arr(i + 1), ">"), InStr(arr(i + 1), "<"), InStr(arr(i + 1), "="))
                Dim opprnd As String
                If charind = 0 Then
                    opprnd = "="
                Else
                    opprnd = Left(arr(i + 1), charind)
                End If
                Dim t As String
                t = """" & colArr(j, 1) & """" & opprnd & """" & Mid(arr(i + 1), charind + 1) & """"
                If Not Application.Evaluate(t) Then condArr(j) = True
            End If
        Next j
    Next i

    For i = LBound(rngarr, 1) To UBound(rngarr, 1)
        If Not condArr(i) Then
            TEXTJOINIFS = TEXTJOINIFS & rngarr(i, 1) & delim
        End If
    Next i

    TEXTJOINIFS = Left(TEXTJOINIFS, Len(TEXTJOINIFS) - Len(delim))

End Function

Maintenant, peu importe si les données est trié ou non, il ne mettra la sortie que dans la colonne C là où la valeur de la colonne A apparaît en premier.

entrez la description de l'image ici


entrez la description de l'image ici


4 commentaires

Merci Scot mais = IF (MATCH (A1, A: A, 0) = ROW (A1), TEXTJOINIFS (B: B, ",", A: A, A1), "") it ne fonctionne pas J'obtiens l'erreur #NAME?


Vous devez mettre le code ci-dessus dans un module. Ensuite, cela fonctionnera comme n'importe quelle formule.


J'ai ajouté le code dans un module mais la même chose se passe


L'avez-vous mis dans un module général ou dans le code de la feuille de calcul? Si c'est dans un module général, cela devrait fonctionner. Les exemples ci-dessus utilisent ce code non modifié. Je l'ai placé dans un module, puis j'ai utilisé la formule comme décrit.



1
votes

Utilisez une formule matricielle:

=TEXTJOIN(", ",TRUE,IF(A$1:A$15=A1,B$1:B$15,""))

(Utilisez CTRL-SHIFT-ENTER au lieu de ENTER pour entrer la formule)


3 commentaires

Je ne pense pas qu'Excel Plus 2016 a TEXTJOIN


On dirait que Scott a raison, je ne trouve pas TEXTJOIN ici


@MonaCoder J'ai un UDF qui imite également le TEXTJOIN normal. Il peut être trouvé ici: stackoverflow.com/questions/39532189/...