Excel: concaténer des valeurs différentes

saend -  
JvDo Messages postés 1924 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je souhaite concaténer des valeurs dans une plage de données, mais uniquement les valeurs différentes (en éviter les doublons, donc !)
Exemple; dans ma colonnne A j'ai :
A1: pierre
A2: ciseau
A3: pierre
A4: caillou

je voudrais concaténer tout ca en B2 comme suit:
B2: pierre-ciseau-caillou (et donc ignorer le doublon de la cellule A3)!

c'est un exemple bien sur, après je devrai adapter la formule à chaque plage de données concernée (parfois 2 cellules, parfois 10, etc.) Ma feuille excel fait 15.000 lignes !

Est-ce possible ? (je précise que je me débrouille sous excel mais suis pas non plus une pro des macros, etc. !!)
Merci d'avance !

1 réponse

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour

    On pourrait le faire avec une matricielle-doliprane, mais avec 15000 lignes, tu aurais largement le temps d'aller papoter devant la machine à café

    avec une tite macro
    Sub transposer_uniques() 
    Dim dico As Object, derlig As Integer, cptr As Integer, ref As String, liste 
    
    derlig = Columns("A").Find("*", , , , , xlPrevious).Row 
    Set dico = CreateObject("scripting.dictionary") 
    
    For cptr = 1 To derlig 
         ref = Cells(cptr, "A") 
         If Not dico.exists(ref) Then dico.Add ref, 1 
    Next 
    liste = dico.keys 
    Range("B2") = Join(liste, "-") 
    
    End Sub

    Michel
    0
    1. saend
       
      dingue! j'essaie, merci !
      par contre, en l'occurrence c'était un exemple mais mon cas ne se limite pas à concaténer des donnees en colonne A, mais sur pls colonnes différentes, donc plutot en colonne "-1". Est il possible d'adapter la macro pour qu'elle agisse sur les données de la colonne d'avant sans fixer le n° de la colonne?
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      en l'occurrence c'était un exemple mais mon cas ne se limite pas à concaténer des donnees en colonne A, mais sur pls colonnes différentes, donc plutot en colonne "-1".


      1/ Pourquoi ne pas l'avoir écrit au 1° post ? :-((

      2/ nouvelle demande incompréhensible
      0
    3. saend
       
      ah désolée, en fait je pensais que la réponse serait une formule et que je pourrais l'adapter aux plages de donnes concernées dans ma feuille excel !
      :(
      donc: j'ai donné l'exemple pour le cas où mes données à concaténer sont en colonne A, mais j'ai plusieurs plages de données à concaténer, qui sont dans différentes colonnes, et je les concatène dans la colonne à droite de celle où se trouvent les données!
      Le nombre de lignes n'est pas fixe non plus :-(

      En résumé: parfois je dois concaténer les cellules A1 à A4 (et le résultat de la concaténation va en cellule B1) comme ds mon exemple initial, et parfois je cherche à concaténer les cellules F6 à F14 en cellule G6... etc... je sais c pas simple.... en tout cas j'espère avoir été plus claire et te remercie pour ton aide!!

      bonnes fêtes !
      0
    4. JvDo Messages postés 1924 Date d'inscription   Statut Membre Dernière intervention   859
       
      Bonsoir à vous deux.

      Saend : as-tu un moyen d'identifier les colonnes à traiter et les lignes de début et de fin des zones à concaténer sans doublon?
      Sans une telle identification, même avec une fonction vba avec sélection de la zone à traiter, tu vas passer un sacré temps avec tes 15.000 lignes!
      Par défaut, et en reprenant la solution de michel_m, voici la fonction que tu peux utiliser :
      Function concat_zone(vZone As Range) As String
          Dim dico As Object, vCell As Range, liste
          Set dico = CreateObject("scripting.dictionary")
          For Each vCell In vZone
               If Not dico.exists(vCell.Value2) Then dico.Add vCell.Value2, 1
          Next
          liste = dico.keys
          concat_zone = Join(liste, "-")
      End Function
      
      Cordialement
      0