Macro pour concaténer 2 colonnes

NoodleDS

XLDnaute Nouveau
Bonjour,

Je suis débutant en VBA et je souhaiterai pouvoir concaténer 2 colonnes A et B et mettre le résultat en colonne C.
La syntaxe en formule est simple et peut être comme cela si l'on se place en $C1 :

=$A1&$B1

Ce n'est pas ce que je souhaite. Je souhaiterai avoir un petit programme VBA que je pourrai intégrer à ma macro (créer en mode enregistrement) qui permettrai de concaténer 2 colonnes A et B et mettre le résultat en colonne C, en sachant que le contenu de ces colonnes peut être variable d'une utilisation à une autre (de la 1ere ligne jusqu'à la dernière ligne non vide).

Je vous remercie par avance pour votre aide.
 

Pièces jointes

  • Fichier.jpg
    Fichier.jpg
    7.7 KB · Affichages: 113
  • Fichier.jpg
    Fichier.jpg
    7.7 KB · Affichages: 124
  • Fichier.jpg
    Fichier.jpg
    7.7 KB · Affichages: 132

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Macro pour concaténer 2 colonnes

Bonjour NoodleDS,

Un essai dans le fichier joint.

Il faut préciser dans le code la première colonne des deux colonnes à concatener (constante MaColonne)

Le code dans Module1:
VB:
Sub concat()
' la lettre de la constante MaColonne est celle de la
' 1ière colonne des deux colonnes à concaténer

Const MaColonne = "E"

Dim vals, i As Long, result
With Sheets("Feuil1")
  ' on efface les précédents résultats (1ière colonne = MaColonne
  ' translatée de deux colonnes vers la droite)
  .Columns(MaColonne).Offset(, 2).ClearContents
  ' Nombre de la lignes de la 2ième colonne
  i = .Cells(.Rows.Count, MaColonne).Offset(, 1).End(xlUp).Row
  ' si le nombre de lignes de la 1iere colonne est supérieur à celui
  ' de la deuxième colonne alors on retient ce dernier nombre de ligne
  ' i = max des nombres de lignes de la 1ière et 2ième colonne
  If i <= .Cells(.Rows.Count, MaColonne).End(xlUp).Row Then _
    i = .Cells(.Rows.Count, MaColonne).End(xlUp).Row
  ' on transfère le tableau des valeurs des colonnes à concaténer
  ' de la feuille 'Feuil1' dans un tableau en mémoire (vals)
  vals = .Columns(MaColonne).Resize(i, 2).Value
  ' on crée le tableau résultat à la bonne taille
  ' (= nombre de lignes de vals)
  ReDim result(LBound(vals) To UBound(vals))
  ' boucle sur la tableau vals pour concatener
  ' chaque ligne de vals dans result
  For i = LBound(vals) To UBound(vals)
    result(i) = vals(i, 1) & vals(i, 2)
  Next i
  ' on transfère le résultat sur la feuille de calcul
  ' MaColonne déplacée de 2 colonnes vers la droite et redimensionnée
  ' au nombre de lignes du tableau resultat
  ' le "transpose" sert à passer le tableau result d'un tableau en ligne
  ' à un tableau en colonne
  .Columns(MaColonne).Offset(0, 2).Resize(UBound(result) - LBound(result) + 1).Value _
      = Application.Transpose(result)
End With
End Sub
 

Pièces jointes

  • Concat 2 cols v1.xls
    34 KB · Affichages: 144
Dernière édition:

NoodleDS

XLDnaute Nouveau
Re : Macro pour concaténer 2 colonnes

Bonjour mapomme,

Je te remercie beaucoup, cela correspond bien à ce que je demandais. J'abuse un peu, mais peux-tu me donner ton interprétation si je devais ajouter un tiret ("-") ou un espace (" ") au résultat (colonne 3) entre les 2 colonnes concaténées. Voir mes nouveaux fichiers joints.

Je te remercie par avance.
 

Pièces jointes

  • Fichier_Tiret.jpg
    Fichier_Tiret.jpg
    6.1 KB · Affichages: 92
  • Fichier_Espace.jpg
    Fichier_Espace.jpg
    6 KB · Affichages: 84

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Macro pour concaténer 2 colonnes

Bonjour NoodleDS,

(...)peux-tu me donner ton interprétation si je devais ajouter un tiret ("-") ou un espace (" ") au résultat (colonne 3) entre les 2 colonnes concaténées. (...)

Une possibilité:

remplacer la ligne:
VB:
result(i) = vals(i, 1) & vals(i, 2)
par la suivante:
VB:
result(i) = vals(i, 1) & Separ & vals(i, 2)
(Separ est une constante à définir dans le programme et qui est le séparateur comme son nom le suggère)


Autre possibilité, si on ne veut insérer le séparateur que lorsque les deux cellules sont toutes les deux non vides:
remplacer la ligne:
VB:
result(i) = vals(i, 1) & vals(i, 2)
par la suivante:
VB:
result(i) = vals(i, 1) & IIf(vals(i, 1) = "" Or vals(i, 2) = "", "", Separ) & vals(i, 2)

En exemple un fichier avec la première possibilité (la seconde est incluse aussi, voir les commentaires dans le code), voir la partie concernée:
VB:
  ' boucle sur la tableau vals pour concatener
  ' chaque ligne de vals dans result
  For i = LBound(vals) To UBound(vals)
    result(i) = vals(i, 1) & Separ & vals(i, 2)
    ' si on ne désire pas de séparateur quand au moins une cellule est vide
    ' mettre en commentaire l'instruction ci-dessus et réactiver
    ' l'instruction en commentaire ci-dessous.
'    result(i) = vals(i, 1) & IIf(vals(i, 1) = "" Or vals(i, 2) = "", "", Separ) & vals(i, 2)
  Next i
 

Pièces jointes

  • Concat 2 cols v2.xls
    35 KB · Affichages: 136
Dernière édition:

rman

XLDnaute Nouveau
bonjour à tous et bonne année, je me remets un peu sur le sujet car je voudrais savoir comment faire si j'ai plus de 20 colonnes à concaténer?
j'ai déjà essayer avec le code ci dessous mais ça me donne "Erreur 13, incompatibilité de type"

code:
For i = LBound(vals) To UBound(vals)
result(i) = vals(i, 1) & " " & vals(i, 2) & " " & vals(i, 3) & " " & vals(i, 4) & " " & vals(i, 5) & " " & vals(i, 6) & " " & vals(i, 7) & " " & vals(i, 8) & " " & vals(i, 9) & " " & vals(i, 10) & " " & vals(i, 11) & " " & vals(i, 12) & " " & vals(i, 13) & " " & vals(i, 14) & " " & vals(i, 15) & " " & vals(i, 16) & " " & vals(i, 17) & " " & vals(i, 18) & " " & vals(i, 19) & " " & vals(i, 20) & " " & vals(i, 21) & " " & vals(i, 22) & " " & vals(i, 23) & " " & vals(i, 24) & " " & vals(i, 25) & " " & vals(i, 26) & " " & vals(i, 27) & " " & vals(i, 28) & " " & vals(i, 29)
Next i

' on transfère le résultat sur la feuille de calcul
' MaColonne déplacée de 2 colonnes vers la droite et redimensionnée
' au nombre de lignes du tableau resultat
' le "transpose" sert à passer le tableau result d'un tableau en ligne
' à un tableau en colonne
.Columns(MaColonne).Offset(0, 29).Resize(UBound(result) - LBound(result) + 1).Value = Application.Transpose(result)
End With






Merci
 

rman

XLDnaute Nouveau
Bonjour RMAN

Une fonction pratique pour concaténer des plages avec un séparateur à préciser dans le code.

zebanx

merci pour la réponse. a noter que je suis bien novice sous vba excel, cependant il me fait encore la même erreur(ligne en gras), dont voici le code:


Public Function Concat(plage As Range) As Variant
Application.Volatile
For Each ele In plage
If ele <> "" Then
Concat = Concat & " " & ele ' Concat & " " & ", " & ele
End If
Next ele
Concat = Right(Concat, Len(Concat) - 1)
End Function
sub test ()
Const MaColonne = "M"
With Sheets("Feuil1")
.Concat ("M:AO")
End With

end sub
 

Discussions similaires

Réponses
12
Affichages
397
Réponses
2
Affichages
210

Statistiques des forums

Discussions
312 489
Messages
2 088 852
Membres
103 974
dernier inscrit
chmikha