Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Concatener plusieurs lignes

miliev83

XLDnaute Occasionnel
Bonjour,
Je souhaite regrouper le contenu des lignes de la colonne R et S lorsque dans la colonne A cela concerne le même identifiant.

Voici le code :
Code:
Option Explicit
Private Sub Concatener_Click()
Dim DerLigD As Long, LigneC As Long
Dim Dico, k
Dim C As Range
Dim WsC As Worksheet
Dim n As Integer
Dim Texte As String
    Application.ScreenUpdating = False
    With Worksheets("feuil1")
        DerLigD = .Range("A" & Rows.Count).End(xlUp).Row
        Set Dico = CreateObject("Scripting.dictionary")
        Set WsC = Worksheets("feuil2")
        For Each C In .Range("A2:A" & DerLigD)
           If Not Dico.Exists(C.Value) Then Dico.Add C.Value, C.Offset(0, 1).Value
        Next C
        k = Dico.keys
        LigneC = 2
        WsC.Range("A2:B" & WsC.Range("A1").End(xlDown).Row).ClearContents
        For n = 0 To Dico.Count - 1
            WsC.Range("A" & LigneC).Value = k(n)
            For Each C In .Range("A1:A" & DerLigD)
                If C = k(n) Then Texte = Texte & C.Offset(0, 1) & Chr(10)
            Next C
            WsC.Range("B" & LigneC).Value = Left(Texte, Len(Texte) - 1)
            Texte = ""
            LigneC = LigneC + 1
        Next n
        Set WsC = Nothing: Set Dico = Nothing
    End With
End Sub


Merci d'avance!!
 
Dernière édition:

Papou-net

XLDnaute Barbatruc
Re : Concatener plusieurs lignes

Bonsoir miliex83,

Essaie en modifiant ton code comme ceci:

Code:
Private Sub Concatener_Click()
Dim DerLigD As Long, LigneC As Long
Dim Dico, k
Dim C As Range
Dim WsC As Worksheet
Dim n As Integer
Dim TexteB As String, TexteC As String
    Application.ScreenUpdating = False
    With Worksheets("feuil1")
        DerLigD = .Range("A" & Rows.Count).End(xlUp).Row
        Set Dico = CreateObject("Scripting.dictionary")
        Set WsC = Worksheets("feuil3")
        For Each C In .Range("A2:A" & DerLigD)
           If Not Dico.Exists(C.Value) Then Dico.Add C.Value, C.Offset(0, 1).Value
        Next C
        k = Dico.keys
        LigneC = 2
        WsC.Range("A2:B" & WsC.Range("A1").End(xlDown).Row).ClearContents
        For n = 0 To Dico.Count - 1
            WsC.Range("A" & LigneC).Value = k(n)
            For Each C In .Range("A1:A" & DerLigD)
                If C = k(n) Then
                  TexteB = TexteB & C.Offset(0, 17) & Chr(10)
                  TexteC = TexteC & C.Offset(0, 18) & Chr(10)
                End If
            Next C
            WsC.Range("B" & LigneC).Value = TexteB
            WsC.Range("C" & LigneC).Value = TexteC
            TexteB = "": TexteC = ""
            LigneC = LigneC + 1
        Next n
        Set WsC = Nothing: Set Dico = Nothing
    End With
End Sub
A +

Cordialement.
 

miliev83

XLDnaute Occasionnel
Re : Concatener plusieurs lignes

Merci Papou-net, ta macro donne le résultat attendu à 2 3 détails près mais c'est ma faute je n'ai pas donné toutes les infos dès le départ, je m'explique :

En fait, je souhaiterai récupérer seulement les info des identifiants qui ont une donnée dans la colonne R ou S
Est-il possible également de ne pas avoir les sauts de ligne dans les cellules avant et après le texte ?

Merci encore
 

Papou-net

XLDnaute Barbatruc
Re : Concatener plusieurs lignes

RE:

Voici donc une version corrigée.

J'en ai profité pour simplifier la structure de la macro ce qui permet d'accélérer son déroulement.

Code:
Private Sub Concatener_Click()
Dim Cel As Range, lgC As Long

lgC = 1
Application.ScreenUpdating = False
With Feuil2
  .Range("A:C").ClearContents
  .Range("A1") = Feuil1.Range("A1")
  .Range("B1") = Feuil1.Range("B1")
  .Range("C1") = Feuil1.Range("C1")
  For Each Cel In Feuil1.Range("A2:A" & Rows.Count).SpecialCells(xlCellTypeConstants)
    If ((Cel.Offset(0, 17) = "") * 1) * ((Cel.Offset(0, 18) = "") * 1) = False Then
      If Cel = Cel.Offset(-1, 0) And ((Cel.Offset(0, 17) = "") * 1) * ((Cel.Offset(0, 18) = "") * 1) = False Then
        .Cells(lgC, 2) = .Cells(lgC, 2) & Chr(10) & Cel.Offset(0, 17)
        .Cells(lgC, 3) = .Cells(lgC, 3) & Chr(10) & Cel.Offset(0, 18)
        Else
        lgC = lgC + 1
        .Cells(lgC, 1) = Cel
        .Cells(lgC, 2) = Cel.Offset(0, 17)
        .Cells(lgC, 3) = Cel.Offset(0, 18)
      End If
    End If
  Next
End With
Application.ScreenUpdating = True
End Sub
Bonne soirée.

Cordialement
 

miliev83

XLDnaute Occasionnel
Re : Concatener plusieurs lignes

Merci Papou-net, c'est presque parfait mais c'est encore de ma faute désolé

J'ai oublié de demander, lorsque cela concatène est il possible de ne pas répéter les doublons dans des colonnes R et S ?
 
Dernière édition:

klin89

XLDnaute Accro
Re : Concatener plusieurs lignes

Bonsoir le forum, miliev83

A tester, restitution en Feuil3.
VB:
Option Explicit

Sub test()
Dim a, i As Long, j As Long, n As Long, w()
    ReDim w(1 To 3)
    With Sheets("Feuil1").Range("A1").CurrentRegion
        a = Application.Index(.Value, Evaluate("row(1:" & _
                         .Rows.Count & ")"), Array(1, 18, 19))
        n = 1
        With CreateObject("Scripting.Dictionary")
            .CompareMode = 1
            For i = 2 To UBound(a, 1)
                If Not .exists(a(i, 1)) Then
                    n = n + 1
                    w(1) = n
                    For j = 2 To UBound(a, 2)
                        Set w(j) = _
                        CreateObject("Scripting.Dictionary")
                        w(j).CompareMode = 1
                        If (a(i, j)) <> "" Then
                            w(j)(a(i, j)) = Empty
                        End If
                    Next
                    For j = 1 To UBound(a, 2)
                        a(n, j) = a(i, j)
                    Next
                    .Item(a(i, 1)) = w
                Else
                    w = .Item(a(i, 1))
                    For j = 2 To UBound(a, 2)
                        If a(i, j) <> "" Then
                            If Not w(j).exists(a(i, j)) Then
                                If a(w(1), j) <> "" Then
                                    a(w(1), j) = Join$(Array(a(w(1), j), a(i, j)), " - ")
                                Else
                                    a(w(1), j) = a(i, j)
                                End If
                                w(j)(a(i, j)) = Empty
                                .Item(a(i, 1)) = w
                            End If
                        End If
                    Next
                End If
            Next
        End With
    End With
    'Restitution
    Application.ScreenUpdating = False
    With Sheets("Feuil3").Cells(1)
        .CurrentRegion.Clear
        .Parent.Columns("b:c").NumberFormat = "@"
        With .Resize(n, UBound(a, 2))
            .Value = a
            .Font.Name = "Calibri"
            .BorderAround Weight:=xlThin
            .Borders(xlInsideVertical).Weight = xlThin
            .Borders(xlInsideHorizontal).Weight = xlThin
            .VerticalAlignment = xlCenter
            .HorizontalAlignment = xlCenter
            With .Rows(1)
                .Interior.ColorIndex = 36
            End With
            .Columns.AutoFit
        End With
        .Parent.Activate
    End With
    Application.ScreenUpdating = True
End Sub
Bonne nuit
klin89
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…