Concatener des valeurs de plusieurs cellules

Bonjour

Je débute dans le VBA. J'ai crée ma macro commande, et j'ai presque fini, mais je bute sur une partie:

J'ai une colonne B, avec des identifiants. Je peux avoir plusieurs lignes avec le même identifiant consécutif, et c'est que les valeurs de la colonne G qui varient.

J'ai besoin de concaténer ces valeurs de la colonne G, les séparer d'un slash, et copier tout dans la feuille 2 dans la colonne G.

J'ai déclaré ma ligne i et ma ligne j=i+1 dans la feuille1

et m et n=m+1 dans la feuille 2

Merci pour tout commentaire

Bonjour, avec un fichier c'est plus simple... Sinon concaténer des chaines sous VBA vous pouvez utiliser Ma_Chaine = Range("A1") & "/" & Range("B1") & "-" & Range("C1")

Ici la valeur de la cellule A1 est concaténée avec celle de B1 avec ajout d'un slash, et C1 à la suite du reste avec un tiret...

A adapter dans votre code en fonction des colonnes et des lignes...

vbMBHB

Bonjour

Merci pour ta réponse vbMsgBoxHelpButton.

Précision:

J'ai un fichier avec 3000 lignes. Un même client (identifiant) peut avoir plusieurs caractéristiques (codes). Dans mon fichier de départ, j'ai une ligne par caractéristique. Alors que j'ai besoin d'avoir une ligne par client, avec les caractéristiques concaténées dans la même cellule.

Dans ma commande je dis:

  • si les identifiants de la ligne i et de la ligne j sont différents, copie la ligne i entière et va sur next i.
  • si les identifiants de la ligne i et j sont identiques, il faut copier la ligne i sauf la colonne G,
mais j'arrive pas dire "regarde combien il y a de lignes avec le même identifiant consécutif et prend le contenue des cellules G et concatène les dans la feuille 2.

Je ne sais pas si c'est plus claire.

Peut-être je n'ai pas la bonne logique, j'aimerai comprendre comment construire cette commande.

Merci d'avance pour votre/vos aide(s).

Fichier en PJ.

125macrovbauf.zip (110.68 Ko)

Toujours est-il qu'une question mal posée sans fichier sera toujours moins bien comprise que la même question avec un fichier...

Je vois le fichier joint... C'est un bon début, pour le reste il faut que je me penche dessus !

vbMBHB

Une proposition de code à mettre dans un module standard :

Sub vbMBHB()
    ' tri du tableau en fonction de la colonne B du plus petit au plus grand
    ActiveWorkbook.Worksheets("Feuil1").AutoFilter.Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Feuil1").AutoFilter.Sort.SortFields.Add Key:=Range _
        ("B1:B2620"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("Feuil1").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    ' définition des variables
    Dim Ligne_testée As Long, Identifiant_testé As String, Identifiant_en_cours As String, Cumul_Valeur As String
    Dim Ligne_Feuil2 As Long
    Ligne_testée = 2
    Ligne_Feuil2 = 2
    Identifiant_en_cours = ""
    Cumul_Valeur = ""
    With Sheets("Feuil1")
        Do
            If .Cells(Ligne_testée, 2).Value = "" Then Exit Do
            Identifiant_testé = .Cells(Ligne_testée, 2).Value
            If Identifiant_testé = Identifiant_en_cours Then
                Cumul_Valeur = Cumul_Valeur & "/" & .Cells(Ligne_testée, 7).Value
            Else
                If Cumul_Valeur <> "" Then
                    Sheets("Feuil2").Cells(Ligne_Feuil2, 2).Value = Identifiant_en_cours
                    Sheets("Feuil2").Cells(Ligne_Feuil2, 7).Value = Cumul_Valeur
                    Cumul_Valeur = ""
                    Ligne_Feuil2 = Ligne_Feuil2 + 1
                Else
                    Identifiant_en_cours = Identifiant_testé
                    Cumul_Valeur = .Cells(Ligne_testée, 7).Value
                End If
            End If
            Ligne_testée = Ligne_testée + 1
        Loop
        If Cumul_Valeur <> "" Then
            Sheets("Feuil2").Cells(Ligne_Feuil2, 7).Value = Cumul_Valeur
            Cumul_Valeur = ""
            Ligne_Feuil2 = Ligne_Feuil2 + 1
        End If
    End With
End Sub

Je suis partis sur le nom des feuilles du fichier "test" ainsi que sur le colonnes G et B

vbMBHB

Salut

Merci pour ta réponse.

Je ne trie pas les identifiants car ils sont déjà triés par date.

Mais quand je "run" ta macro ça ne marche pas comme j'ai besoin.

Par exemple dès la 3eme/4eme ligne j'ai un identifiant identique, et deux codes différents, mais il me met qu'un seul, celui de la ligne 4, au lieu de mettre les deux séparés d'un /.

Voici mon code, mais je ne sais pas formuler la partie avec les codes (ccam - colonne G).

Comment faire pour que mon code apparait comme le tien avec les couleurs, au lieu de faire copier/coller? Merci!

Sub InterventionParLigne()

'compare ligne i et j sur la colonne 2 de la feuille 1 (qui etait triée par date)

'i correspond à la première ligne de la série

'j correspond à i+1

Dim i As Long, j As Long, m As Long, n As Long, x As Long, sCCAM As String, nombre As Integer

i = 2

j = i + 1

m = 2

n = m + 1

sCCAM = " "

'regarde les lignes de 2 à 3000

For i = 2 To 3000

'si la celulle de la ligne i et de la colonne 2 est differente de la celulle au dessous

If Cells(i, 2).Value <> Cells(j, 2).Value Then

'alors copie toute la ligne i dans la feuille 2

Sheets("Feuil1").Select

Range("A" & i & ":I" & i).Select

Selection.Copy

Sheets("Feuil2").Select

Range("A" & m & ":I" & m).Select

ActiveSheet.Paste

'et revient sur la feuille 1 sur la ligne i+1, et sur la m+1 de la feuille 2

Sheets("Feuil1").Select

i = i + 1

Sheets("Feuil2").Select

m = m + 1

'sinon, si la ligne i est egale à la ligne j

ElseIf Cells(i, 2).Value = Cells(j, 2).Value Then

'copie les valeurs

Sheets("Feuil1").Select

Range("A" & i & ":F" & i).Copy

Sheets("Feuil2").Select

Range("A" & m & ":I" & m).Select

ActiveSheet.Paste

Sheets("Feuil1").Select

Range("H" & i & ":I" & i).Copy

Sheets("Feuil2").Select

Range("H" & m & ":I" & m).Select

ActiveSheet.Paste

'et revient sur la feuille 1 sur la ligne i+1, et sur la m+1 de la feuille 2

Sheets("Feuil1").Select

i = i + 1

Sheets("Feuil2").Select

m = m + 1

'concatener les codes

End If

Next i

If Application.CountA(Rows(i)) = Empty Then

End If

End Sub

Bonsoir, n'hésitez pas à utiliser les balises pour rendre le code plus facile à lire...

Après sans me pencher dessus, je vous indique une erreur d'interprétation du problème par rapport à mon code :

mon code est fait avec un tri au niveau des identifiants, en effet il est fait qu'il vérifie si l'identifiant du "dessous" est égale ou pas à l'identifiant "actuel", car avec le tri tous les identifiants égaux sont à la suite !

Rien n'empêche à l'issue de la procédure de remettre le tableau source en tri par date.

vbMBHB

Bonjour

Merci pour les messages. Malheureusement, le code proposé ne fonctionne pas comme j'ai besoin.

J'aimerai que quelqu'un m'aide à résoudre le problème avec la macro que j'ai déjà construit. Je pense qu'il manque pas grande chose,

tout est déjà là, car il y a des lignes pour lesquelles j'arrive bien à obtenir ce que je veux dans la feuille 2, avec les codes concaténés.

Mais il y a des lignes que ma macro va ensuite sauter, et ne regarde pas les codes pour toutes les lignes avec le même identifiant.

Donc je me dis que ça doit être une histoire de i+1 ou j+1 ou Integer vs. autre chose... mais des choses que j'essaye ne marchent pas.

Je ne sais toujours pas comment insérer correctement le code dans le corps du texte de mon message, donc je fais que la copie. Désolé.

Merci beaucoup d'avance pour votre aide

Sub InterventionParLigne()

'compare ligne i et j sur la colonne 2 de la feuille 1 (qui etait triée par date)

'i correspond à la première ligne de la série

'j correspond à i+1

Dim i As Integer, j As Integer, m As Integer, n As Integer

i = 2

j = i + 1

m = 2

n = m + 1

'regarde les lignes de 2 à 3000

For i = 2 To 3000

'si la celulle de la ligne i et de la colonne 2 est differente de la celulle au dessous

If Cells(i, 2).Value <> Cells(j, 2).Value Then

'alors copie toute la ligne i dans la feuille 2

Sheets("Feuil1").Select

Range("A" & i & ":I" & i).Copy

Sheets("Feuil2").Select

Range("A" & m & ":I" & m).Select

ActiveSheet.Paste

'et revient sur la feuille 1 sur la ligne i+1, et sur la m+1 de la feuille 2

'Sheets("Feuil1").Select

'i = j + 1

'Sheets("Feuil2").Select

m = m + 1

'sinon, si la ligne i est egale à la ligne j

ElseIf Cells(i, 2).Value = Cells(j, 2).Value Then

'copie les valeurs

Sheets("Feuil1").Select

Range("A" & i & ":F" & i).Copy

Sheets("Feuil2").Select

Range("A" & m & ":I" & m).Select

ActiveSheet.Paste

Sheets("Feuil1").Select

Range("H" & i & ":I" & i).Copy

Sheets("Feuil2").Select

Range("H" & m & ":I" & m).Select

ActiveSheet.Paste

'et concatene les codes ccam des lignes avec le meme id

Sheets("Feuil2").Cells(m, 7) = Sheets("Feuil1").Range("G" & i & ":G" & j).Value & "/"

'& Sheets("Feuil1").Cells(j, 7).Value

'Sheets("Feuil1").Select

i = j + 1

'Sheets("Feuil2").Select

m = m + 1

End If

Next i

If Application.CountA(Rows(i)) = Empty Then

End If

End Sub

En PJ je joins le fichier

Bonjour,

Effectivement ... joindre le fichier est une Excellente idée ... !!!

Concernant l'usage du Forum ... pour poster du Code .... il faut utiliser les balises Code ... Bouton N°5 photo jointe ...

balise code

Salut

Merci pour ta réponse.

Sub InterventionParLigne()

'compare ligne i et j sur la colonne 2 de la feuille 1 (qui etait triée par date)
'i correspond à la première ligne de la série
'j correspond à i+1

Dim i As Integer, j As Integer, m As Integer, n As Integer

i = 2
j = i + 1
m = 2
n = m + 1

'regarde les lignes de 2 à 3000
For i = 2 To 3000
    'si la celulle de la ligne i et de la colonne 2 est differente de la celulle au dessous
     If Cells(i, 2).Value <> Cells(j, 2).Value Then

        'alors copie toute la ligne i dans la feuille 2
        Sheets("Feuil1").Select
        Range("A" & i & ":I" & i).Copy
        Sheets("Feuil2").Select
        Range("A" & m & ":I" & m).Select
        ActiveSheet.Paste
        'et revient sur la feuille 1 sur la ligne i+1, et sur la m+1 de la feuille 2
         'Sheets("Feuil1").Select
          'i = j + 1
         'Sheets("Feuil2").Select
          m = m + 1

     'sinon, si la ligne i est egale à la ligne j
     ElseIf Cells(i, 2).Value = Cells(j, 2).Value Then

        'copie les valeurs
         Sheets("Feuil1").Select
         Range("A" & i & ":F" & i).Copy
         Sheets("Feuil2").Select
         Range("A" & m & ":I" & m).Select
         ActiveSheet.Paste

         Sheets("Feuil1").Select
         Range("H" & i & ":I" & i).Copy
         Sheets("Feuil2").Select
         Range("H" & m & ":I" & m).Select
         ActiveSheet.Paste

        'et concatene les codes ccam des lignes avec le meme id
         Sheets("Feuil2").Cells(m, 7) = Sheets("Feuil1").Range("G" & i & ":G" & j).Value & "/"
        '& Sheets("Feuil1").Cells(j, 7).Value

        'Sheets("Feuil1").Select
          i = j + 1
         'Sheets("Feuil2").Select
          m = m + 1

      End If

Next i

If Application.CountA(Rows(i)) = Empty Then
End If

End Sub
43intparligne.xlsx (191.08 Ko)

Une photo mise à jour des boutons de mise en forme....

code

Et oui James007, le forum à évolué... La base de données des images est à refaire !

vbMBHB

Bonsoir Olivia

Fichier modifié :

67macrovbauf-v1.xlsm (336.76 Ko)

A voir

Bonsoir, je ré édite ce que j'ai dis : votre code ne peut fonctionner car vous ne faite pas le tri par identifiant, du coup vous faite un test d'égalité d'identifiant avec "juste" la ligne du dessous, mais il se peut que l'identifiant testé se retrouve 5 lignes plus bas...

Donc mon code fait un tri par identifiant (colonne 2) afin de "regrouper" les identifiants égaux.

Ensuite, en partant de la ligne 2 je contrôle la ligne du dessous, la ligne 3, si c'est le même identifiant je concatène les codes avec un slash de séparation, et je teste la ligne 4, si c'est le même identifiant, je rajoute à la concaténation le nouveau code, je contrôle la ligne 5 et là ce n'est pas le même identifiant, je copie les données de l'identifiant d'avant sur la feuille 2, avec la valeur concaténée en colonne G.

j'initialise à la valeur du code du nouvel identifiant la concaténation, et je teste la ligne 6 etc...

A l'issue du code je tri la feuille 1 en fonction des dates de la colonne 3.

A savoir que dans votre code la ligne :

Sheets("Feuil2").Cells(m, 7) = Sheets("Feuil1").Range("G" & i & ":G" & j).Value & "/"

ne concatène pas du tout les valeur de la colonne G de la ligne "i" et de la ligne "j", ce qu'elle fait c'est de prendre la valeur de la ligne i avec le slash qui suit...

Donc, vous aurez compris que ce sera le dernier essai avec ce fichier :

vbMBHB

Rechercher des sujets similaires à "concatener valeurs"