XL 2010 Concatener selon valeurs

alfredo2000

XLDnaute Nouveau
Bonjour,

Je suis nouveau sur le forum et je vous remercie d'avance pour votre aide.

J'ai 2 colonnes "compte" et "musicien". les valeurs peuvent etre identiques et se repeter

Je souhaite obtenir les colonnes "occurance" et "concatenation"

J'ai essayé avec des formules mais en vain.
A noter que mon fichier fait 4000 lignes

comment faire ?
 

Pièces jointes

  • Question.xlsx
    11.8 KB · Affichages: 9

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Une approche avec le complément Power Query ( page de téléchargement ) qui est très très bien pour traiter les données.
La prise en main est un peu ardue mais une fois qu'on a compris c'est too much. La seule chose à faire lorsque les données de la table changent est de cliquer sur actualiser dans l'onglet 'Données' d'excel.

Cordialement
 

Pièces jointes

  • alfredo2000-Rob.xlsx
    22.1 KB · Affichages: 8

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @alfredo2000, @Roblochon:),

Une autre piste en VBA. Cliquer sur le bouton Hop. Le code est dans le module de la feuille Feuil1.
VB:
Sub test()
Dim t, d, i&, s
t = Range("a4:b" & Cells(Rows.Count, "a").End(xlUp).Row)
Set d = CreateObject("scripting.dictionary")
d.comparemode = vbTextCompare
For i = 1 To UBound(t)
  If Not d.exists(t(i, 1)) Then
    d.Add t(i, 1), t(i, 2)
  Else
    s = d(t(i, 1))
    s = s & ", " & t(i, 2)
    d(t(i, 1)) = s
  End If
Next i
For i = 1 To UBound(t)
  s = d(t(i, 1))
  t(i, 2) = s
  t(i, 1) = UBound(Split(s, ",")) + 1
Next i
Range("c4").Resize(UBound(t), 2) = t
Range("a:d").EntireColumn.AutoFit
End Sub
 

Pièces jointes

  • alfredo2000- concatener- v1.xlsm
    19.6 KB · Affichages: 7
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Préférez cette version v2 en cas de doublons !
VB:
Sub test()
Dim t, d, i&, s, xcompte
t = Range("a4:b" & Cells(Rows.Count, "a").End(xlUp).Row)
Set d = CreateObject("scripting.dictionary")
d.comparemode = vbTextCompare
For i = 1 To UBound(t)
  If Not d.exists(t(i, 1)) Then
    d.Add t(i, 1), CreateObject("scripting.dictionary")
    d(t(i, 1)).comparemode = vbTextCompare
  End If
  If Not d(t(i, 1)).exists(t(i, 2)) Then d(t(i, 1)).Add t(i, 2), ""
Next i

For i = 1 To UBound(t)
  t(i, 2) = Join(d(t(i, 1)).keys(), ",")
  t(i, 1) = d(t(i, 1)).Count
Next i

Range("c3:d" & Cells(Rows.Count, "c").End(xlUp).Row).Offset(1).ClearContents
Range("c4").Resize(UBound(t), 2) = t
Range("a:d").EntireColumn.AutoFit
End Sub
 

Pièces jointes

  • alfredo2000- concatener- v2.xlsm
    20.6 KB · Affichages: 8
Dernière édition:

alfredo2000

XLDnaute Nouveau
Bonjour,

Merci Roblochon et mapomme pour vos retours.
La solution de mapomme m'est un peu plus familière (mais je me renseignerai sur power query)

Une question : dans ce script, le "join" correspond t-il à une concaténation ?

For i = 1 To UBound(t)
t(i, 2) = Join(d(t(i, 1)).keys(), ",")
t(i, 1) = d(t(i, 1)).Count
Next i
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Extrait de l'aide VBA:
Join, fonction

Lien supprimé Lien supprimé Lien supprimé

Description

Renvoie une chaîne créée par la jonction de plusieurs sous-chaînes contenues dans un Lien supprimé.

Syntaxe

Join(sourcearray
[, delimiter])

La syntaxe de la fonction Join comprend les Lien supprimé suivants :

ÉlémentDescription
sourcearrayTableau à une dimension contenant les sous-chaînes à joindre.
delimiterFacultatif. Caractère de chaîne utilisé pour séparer les sous-chaînes dans la chaîne renvoyée. S'il est omis, le caractère espace (" ") est employé. Si l'argument delimiter est une chaîne de longueur nulle (""), tous les éléments de la liste sont concaténés sans séparateur.