Besoin d'une formule de concaténation/conditionnelle

Bonjour

Je suis entrain de travailler sur un fichier excel ou j'ai des noms de commune dans une première colonne qui se répètent, (par exemple Paris en ligne 2 et Paris en ligne 3), un numéro unique (code SAP) dans une seconde colonne, correspondant à un centre de soin unique
Par exemple

C1 C2 C3
Paris 400001 centre-hospitalier-Delta
Paris 400002 centre-hospitalier-Victor
Lyon 400003 centre-hospitalier-zulu
Lyon 400004 centre-hostitalier-charlie
Je souhaite une formule qui me permettre, dans une 4Ième colonne, d'afficher les deux numéros en colonne deux, dans la première ligne, séparée par un espace pour obtenir la chose suivante

C1 C2 C3 C4
Paris 400001 centre-hospitalier-Delta 400001 400002
Paris 400002 centre-hospitalier-Victor
Lyon 400003 centre-hospitalier-zulu 400003 400004
Lyon 400004 centre-hostitalier-charlie

En gros, une formule qui puisse, sortir les deux numéros de la colonne deux d'une même ville(conditionnelle donc) en colonne 1, pour les placer cote a cote dans la première ligne de la commune en colonne 4, séparés par un espace.

Si quelqu'un peut me proposer une solution, je lui en serais très redevable (celà fait quelques temps que je fais toujours ces milles lignes à la main, et si une formule pouvait résoudre ce problème ce serait des heures de travail gagnées)

5 réponses

  1. Contributeur
    Bonjour,

    Combien as tu de lignes dans ton tableau ?

    Les noms de villes sont ils toujours groupés ?

    Version Excel ?

    Michel
    0
    1. milles lignes, les noms de ville sont en effet toujours groupées, et c'est excel 2010
      0
      1. Contributeur
        re,

        Solution par macro VBA , OK ?
        0
        1. re michel, oui, ca serait ok!
          0
          1. Contributeur
            J'ai annulé le post de 14:41 car je m'étais mélangé les pinceaux entre les variables cptr et Index
            https://www.cjoint.com/?3CCrWVR4AsI

            600 lignes durée: >= 0,03 secondes (Ram 512 Mo, Proc 3 ghz)

            la cellule A2 nommée origine permet de déplacer le tableau où on veut sans avoir d'effet sur la macro

            le code rectifié:
            Option Explicit 
            
            Sub concatener_sap() 
            Dim Deb_lig As Byte, Deb_col As Byte, Der_lig As Integer, Tablo() 
            Dim Cptr As Integer, Ville As String, Concat As String, Index As Integer 
            Dim start As Single 
            start = Timer 
            
            Application.ScreenUpdating = False 
            With Sheets(1) 
            '----- initialisations 
                 Deb_lig = .Range("origine").Row 
                 Deb_col = .Range("origine").Column 
                 Der_lig = .Columns(Deb_col).Find("*", , , , , xlPrevious).Row 
                 'mémorisation en mémoire RAM des données 
                 Tablo = .Range(.Cells(Deb_lig, Deb_col), .Cells(Der_lig, Deb_col + 3)).Value 
            
            '------concaténation  des sap dans la colonne 4 de tablo 
                 For Cptr = 1 To UBound(Tablo) 
                      Ville = Tablo(Cptr, 1) 
                      Index = Cptr 
                      Concat = "" 
                      While Tablo(Cptr, 1) = Ville 
                           Concat = Concat & " " & Tablo(Cptr, 2) 
                           Tablo(Index, 4) = Trim(Concat) 
                           '.Cells(Index + 1, "D") = Concat 'essai 
                            If Cptr = UBound(Tablo) Then Exit For 
                           Cptr = Cptr + 1 
                      Wend 
                      Cptr = Cptr - 1 
                 Next 
                  
            '-----restitution du tableau avec les concaténations 
                 .Range("origine").Resize(UBound(Tablo), 4) = Tablo 
                 .Range(.Cells(Deb_lig, Deb_col), .Cells(Der_lig, Deb_col + 3)).Borders.Weight = xlThin 
                 .Columns(Deb_col + 3).AutoFit 
            End With 
            
            Application.ScreenUpdating = False 
            MsgBox "durée des concaténations: " & Timer - start & " sec." 
            
            End Sub


            Michel
            0