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
3 Réponses :
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
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.
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.
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.
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)
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/...
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.