Macro concatener 2 colonnes

Bonjour,

Je souhaite concaténer le contenu de ma colonne B avec le contenu de la colonne C et afficher la concaténation en colonne D.

Par exemple :

en B2 : bon

en C2 : jour

en D2 : bonjour

et appliquer la concaténation vers le bas tant que les cellules de la colonne B contiennent du texte.

je cherche à adapter la macro suivante ;

Sub Concat()

  Dim c As Range  ' Ce range pointera sur chacune des cellules parcourues par la boucle For Each
  Dim r As Range  ' Ce range pointera sur l'ensemble des cellules à traiter
  Set r = Range(Sheets("Feuil1").Cells(5, 10), Sheets("Feuil1").Cells(Sheets("Feuil1").Rows.Count, 10).End(xlUp))
  For Each c In r
    If Not IsEmpty(c) Then
      c = c.Text & c.Offset(0,1).Text
    End If
  Next c

    'Recopie vers le bas
  [D2].AutoFill Range("D2:D" & [B65536].End(xlUp).Row)
   Range("D2:D" & [D65536].End(xlUp).Row).

Le problème est que je voudrais que cette macro s'execute dans la feuille active (donc éviter de renseigner le nom exact de la feuille car le nom change selon le fichier...), mais j'ai du mal avec la syntaxe "ActiveSheet...

si qq'un pouvait m'aider là-dessus, merci

Bonjour,

bonjour Raja

voici le fichier ci-joint,

ca fait que 3 jours que je passe mes journées dans le VBA... et je maitrise pas encore sa syntaxe. En fait je crois que le plus dur pour moi n'est pas de "concevoir l’enchaînement des commandes à écrire", mais de les écrire sans faire de faute sans que ca devienne du charabia

196classeur1.xlsm (15.66 Ko)

Salut Ruliann

Tu peux tester ce bout de code, ça fonctionne

Sub Concat2()

DLigneB = Range("B1000000").End(xlUp).Row 'Recherche de la dernière ligne dans la colonne B
DligneC = Range("C1000000").End(xlUp).Row 'Recherche de la dernière ligne dans la colonne C
Dligne = Application.Max(DLigneB, DligneC)

Range("D2:D" & Dligne).Select '==>Sélectionne la plage dans laquelle la concaténation est faite
Selection.FormulaR1C1 = "=RC[-2]&RC[-1]" '==>Incrémente la plage avec la formule D2=B2&C2

End Sub

merci boobafoot ça fonctionne très bien! (1000000 de lignes je crois que je suis tranquille )

bonne journée à toi

Bonjour,

Tes spécifications ne sont pas très claires, on ne sait si on concatène systématiquement ou sous condition et laquelle...

Enfin, cela reste adaptable...

Habituellement, ton problème se règle facilement par formule simple, et ne requiert pas l'usage de VBA, sauf volume important ou particularités... (donc en général, je n'y réponds pas sans justification de la nécessité de passer par VBA).

Je fais exception, à titre didactique, car tant qu'à utiliser VBA, autant coder vraiment en VBA sans singer des procédures Excel manuelles !

Proposition :

Sub Concat()
    Dim conc(), n%, i%
    With ActiveSheet
        n = .Cells(.Rows.Count, 2).End(xlUp).Row
        ReDim conc(1 To n - 1, 1 To 1)
        For i = 2 To n
            If .Cells(i, 2) <> "" Then conc(i - 1, 1) = .Cells(i, 2) & .Cells(i, 3)
        Next i
        .Cells(2, 4).Resize(n - 1).Value = conc
    End With
End Sub

Remarques par rapport à ta tentative de code :

1) Une procédure ordinaire a son emplacement normal dans un module standard, et non dans un module dédié (feuille ou classeur) destiné à accueillir principalement des procédures évènementielles, et qu'il est tout à fait inutile d'encombrer avec des procédures qui ont leur place ailleurs.

2) La propriété par défaut de l'objet Range est Value (on peut l'omettre dès lors qu'il n'y a pas ambiguïté entre l'appel de la propriété ou de l'objet lui-même). La propriété Text n'est utile que s'il s'agit de valeurs formatées par format de cellule et que ce qu'on recherche est ce qui apparaît dans la cellule et non la valeur qu'elle contient.

3) Par rapport au présent code, la méthode proprement VBA aurait été de prélever globalement les deux colonnes dans deux tableaux et parcourir les tableaux pour concaténer... Ici on se contente de la moitié de la chose, on affecte le résultat de la concaténation à un tableau. Dans tous les cas, on fait l'affectation finale à la colonne cible en affectant globalement le tableau résultant (et non cellule par cellule !)

4) Si la liste doit dépasser 32000 lignes, modifier les déclarations de variables Integer en Long (remplacer % par &).

Cordialement.

une dernière chose.

si je souhaite rajouter un espace entre les 2 mots dans ma concaténation, je rajoute dans la macro un espace " " comme ceci? c'est ce qui est indiquer pour la fomrule Concatener mais ds le cadre de cette macro j'ai un doute...en tt cas, la manière dont je l'ai mais ci-dessous ne fonctionne pas

Sub Concaténer()

DLigneB = Range("B1000000").End(xlUp).Row 'Recherche de la dernière ligne dans la colonne B
DligneC = Range("C1000000").End(xlUp).Row 'Recherche de la dernière ligne dans la colonne C
Dligne = Application.Max(DLigneB, DligneC)

Range("D2:D" & Dligne).Select '==>Sélectionne la plage dans laquelle la concaténation est faite
Selection.FormulaR1C1 = "=RC[-2]&" "&RC[-1]" '==>Incrémente la plage avec la formule D2=B2&" "&C2

End Sub

Bonjour MFerrand

merci pour ton message didactique que je viens de voire. Tu ne me croiras pas si je te dis que toutes mes procédures sont dans un module dédié... Je retiens la leçon!

J'utilise le VBA car cette procédure de concaténation je l'intègre à l'intérieure d'une macro sur laquelle je travaille et qui consiste à définir plusieurs procédures de mise en page visant à ordonner une extraction de données qui m'arrive un peu brute de décoffrage.

Si je réordonne ma pensée de manière un peu plus claire :

  • En colonne B j'ai des prénoms (Michel)
    En colonne C j'ai des noms (Martin)
    En colonne D je souhaite avoir prénom nom (Michel Martin) avec un espace entre le nom et le prénom
    et ainsi de suite tant qu'il y a un nom ou un prénom de renseigné en colonne B ou C
    enfin, si les colonnes B ou C sont vides de textes, alors pas de concaténation.

A savoir que, chose que je n'avais pas soulignée et à laquelle tu me fais penser en parlant de condition, j'ai effectivement quelques exceptions : des fois je n'ai que la colonne B de renseignée et rien en colonne C, ou inversement. Pour ces exceptions, la concaténation consiste donc à ne reprendre que le prénom seul, ou bien le nom. --mais c'est plus de la concaténation...--

Je me suis bien compliqué le problème là

pause dej, bon ap

edit, pour l'espace j'ai rajouté les guillemets. Il faut maintenant que je réfléchisse à l'utilité de rajouter une condition? ptetr que cela n'en vaut pas la peine? merci pour vos avis

If .Cells(i, 2) <> "" Then conc(i - 1, 1) = .Cells(i, 2) & " " & .Cells(i, 3)

Rebonjour,

Quand je parlais de singer Excel en VBA, je ne me doutais pas que tu venais d'en recevoir une illustration, tout ce qu'il a de plus caricatural en la matière...

L'avantage de VBA pour une opération de ce type est de ne pas mettre de formule et donc d'alléger d'autant le poids du fichier... alors utiliser VBA pour justement mettre des formules...

Macro rectifiée selon tes dernières indications :

Sub Concat()
    Dim conc(), n&, i&
    With ActiveSheet
        n = .Cells(.Rows.Count, 2).End(xlUp).Row
        i = .Cells(.Rows.Count, 3).End(xlUp).Row
        n = IIf(i > n, i, n)
        ReDim conc(1 To n - 1, 1 To 1)
        For i = 2 To n
            If .Cells(i, 2) <> "" Or .Cells(i, 3) <> "" Then
                conc(i - 1, 1) = Trim(.Cells(i, 2) & " " & .Cells(i, 3))
            End If
        Next i
        .Cells(2, 4).Resize(n - 1).Value = conc
    End With
End Sub

Bonne journée.


NB- la condition est que l'une ou l'autre cellule ne soit pas vide. Si les deux le sont, l'élément du tableau résultant reste vide. Si le premier ou le second l'est, Trim supprimera l'espace intermédiaire mise à tort (par la même occasion supprimera aussi les espaces parasites de début ou fin de chaîne...)

merci pour le correctif MFerrand

parmi les multiples support d'apprentissage du VBA (livres ou tuto internet), en as-tu 2 ou 3 à conseiller? que ce soit de par leur approche originale ou par les études de cas qu'ils utilisent (par approche j'entends que c'est pas évident de rentrer dans le monde du langage informatique, de se représenter les objets, etc... ce sont des notions abstraites pour bcp)

bonne journée également

La particularité de VBA est d'être lié à des applications. L'avantage est que tu n'as pas à créer d'instances d'objets de l'application porteuse, tu disposes d'emblée de sa bibliothèque. L'inconvénient est de produire facilement du code restant englué dans l'application, donc peu efficace et nettement moins rapide si tu ne prends pas le temps d'apprendre à utiliser les outils VB fournis avec VBA...

Te casse pas trop la tête sur les notions d'objets, ça se précise avec l'usage... Il m'a fallu pas mal de temps pour saisir vraiment que les objets n'étaient accessibles qu'à travers des propriétés ou des méthodes (ce qui est un peu masqué par les facilités qu'offre VBA) : si tu écris Range(...), tu fais en fait appel à la propriété Range de la feuille active qui renverra un objet Range, si tu écris .Range(...) c'est toujours une propriété que tu invoques mais qui peut être celle d'une feuille (Worksheet) ou d'un autre objet Range, selon ce à quoi réfère le point placé devant... Si je peux faire en sorte que d'autres mettent moins de temps à comprendre ces subtilités de la programmation, c'est un gain pour tout le monde !

Tu as les cours des sites spécialisés, et tu trouveras également des tutos approfondissant tel ou tel aspect important (tels l'utilisation de Userforms ou de tel ou tel contrôle, la manipulation de données de type date, ...les sujets spécifiques sont inombrables).

J'ajouterai que l'un des éléments promordiaux à maîtriser dans la programmation VBA concerne les procédures et variables, et leur portée (il convient de s'y attacher un peu et la maîtrise progressera avec l'usage). Egalement, il faut savoir que outre les variables, ce qu'on utilisera le plus en VBA, ce sont d'une part les instructions décisionnelles ou répétitives (conditions, boucles, ...) et d'autres part des variables tableaux...

Un petit exemple : tu fais une boucle sur les cellules d'une plage : il est plus efficace de qualifier tes expressions qui testeront chaque cellule par l'objet Worksheet à laquelle la plage testée appartient, en le plaçant dans une instruction With Worksheets("Feuil1") ou With ActiveSheet, le Range ou Cells figurant dans la boucle sera qualifié par .Range... ou .Cells... (le point référant à l'objet mis en mémoire avec With). With... End With ne se contente pas de faire gagner du volume de code en évitant des répétitions, mais VBA met également en mémoire la référence d'objet, n'aura plus à la rechercher ou recalculer lors de l'exécution à l'intérieur de cette instruction et sera donc plus rapide...

Cordialement.

Bonjour,

Je suis novice ici et je recherche à concaténer plusieurs colonnes. J'ai récupéré le code proposé, mais je ne comprends pas comment je peux l'adapter à mon document excel, en choisissant la plage à concaténer.

Ma plage va de la colonne K à la colonne S et doit être concaténée à la colonne T. Il n'y a que 3 éléments à concaténer aux maximum et pas plus de 400 lignes. Chacun des 3 éléments doit être séparé par un espace.

J'avoue que je ne trouve pas vraiment d'exemple adaptable.

Merci d'avance pour votre lecture et vos propositions.

Rechercher des sujets similaires à "macro concatener colonnes"