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

Macro pour concaténer 2 colonnes

  • Initiateur de la discussion Initiateur de la discussion NoodleDS
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

N

NoodleDS

Guest
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
    7.7 KB · Affichages: 123
  • Fichier.jpg
    7.7 KB · Affichages: 138
  • Fichier.jpg
    7.7 KB · Affichages: 140
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

Dernière édition:
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
    6.1 KB · Affichages: 102
  • Fichier_Espace.jpg
    6 KB · Affichages: 94
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

Dernière édition:
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
 
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
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
7
Affichages
247
  • Question Question
Microsoft 365 problème d'index
Réponses
19
Affichages
385
Réponses
4
Affichages
225
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…