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,
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.
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
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
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