Excel: concatenation et format

Salut,

j'ai un souci de concatenation avec Excel.
Un exemple: valant mieux qu'un long discours:
dans ma premiere cellule, j'ai "Bonjour" (en gras, c'est important)
dans ma deuxieme cellule, j'ai "ca va" (pas en gras)
je voudrais concatener les deux textes dans une troisieme cellule en gardant ces formats pour ainsi obtenir:
"Bonjour ca va"

Là, comme ca, je n'y arrive pas. Meme en faisant une macro, je vois pas comment faire.

Merci de vos conseils
Cordialement,
Thierry

24 réponses

Résumé de la discussion

Concaténation dans Excel et conservation du formatage pose une problématique centrale concernant la fusion de textes avec mise en forme (gras) entre deux cellules. Plusieurs réponses suggèrent des approches liées à la concaténation: certaines visent à obtenir une chaîne finale tout en préservant les attributs, d'autres proposent des solutions via des macros ou des fonctions personnalisées. La discussion évoque aussi des méthodes liées à la mise en forme en VBA, des limites de concaténation sans macro et des alternatives comme des formats personnalisés ou des outils tiers.

Bobot (l’IA à votre service)
  1. Contributeur
    De rien :-)
    Bonne soirée à toi
    9
    1. J'ai très simple pour les nombres !
      => voir dans le forum suivant, j'ai essayé et ca marche.. :
      https://www.excel-downloads.com/threads/format-nombre-dans-concatener.67464/

      Il reste à transposer avec la bonne formule pour le format du texte.. là dessus je ne peux vous aider car ne connait pas l'équivalent du format "millier" qui s'écrit "# ###" pour le format "CaractèreGras"

      .. Peut être en précisant <gras> ??
      0
      1. J'ai le même genre de problême actuellement...
        En fait, moi je veux assigner un nouveau format aux texte écris dans ma cellule source, dans ma cellule finale...

        Quelqu'un vient de me donner un bon coup de pouce avec la formule excel texte....

        j'avais un format de chiffre que je voulais avoir en format monétaire... fac ma concatener ressemble maintenant à.. =CONCATENER(QW589;RJ589;TW589&TEXTE(UB589;"# ## ##0_ $");UO589;QW590;QW591)

        Cela dit j'ai un autre problême... je veux que RJ589 et TEXTE(UB589;"# ## ##0_ $" affichent leur résulat en gras... comment faire ?

        Je veux procéder sans macro si possible, ce fichier opèrera sur plusieurs ordinateurs....
        1
        1. Bonjour

          Copie de la réponse faite au post 'CONCATENER' :

          On peut aussi faire tout simple :

          Le tableau commençant en A1
          On écrit en C1 :
          =B1

          On écrit en C2 :
          =SI(A2=A1;CONCATENER(C1&B2);B2)

          On copie C2 jusqu'à la fin de la colonne C

          On peut faire disparaitre les concaténations intermédiaires pour ne voir que la dernière
          par la mise en forme conditionnelle.

          Soit pour C1 :
          'La formule est'
          =A1=A1
          (ne pas laisser les $ en cas de sélection par clic)

          A recopier jusqu'en bas de la colonne C.
          0
          1. re demande je pense ne pas avoir été clair dans ma demande

            colonne A colonne B colonne C
            08GSAV3703 (CC0810-140/6000076520749.) OC133 OC133
            08TUNI3757 (88520) CF083
            08TUNI3757 (88520) CF084
            08TUNI3757 (88520) CF088 CF083/CF084/CF088/CF130
            08TUNI3757 (88520) cF130
            07HITR0059 (CC0804-73/07GB04052) KIT194 KIT194
            08ANSA4463 REPRISE 100 PANIERS PESR ZF218
            08ANSA4463 REPRISE 100 PANIERS PESR ZC426 ZC426 / ZF218

            Dans ma colonne A j'ai des lignes de textes identiques
            Je souhaite concatener l'ensemble des données des cellules de la colonne B qui ont un texte indentique dans la colonne A dans une colonne C
            Les textes de kla colonne A seront toujours triées donc les textes identiques à suivre

            Merci de me donner un exemple de formule
            0
            1. BONJOUR

              VOICI COMMENT FAIRE

              A1 Bonjour
              a2 ça va

              a3 =a1 & a2
              réslutat Bonjour ça va dans celulle a3

              @+
              coco
              0
              1. Contributeur
                Bonsoir,

                C'est possible mais tes valeurs perdront le type numérique, ce sera une chaine de caractère.
                C1: ="[" & DROITE("0000" & A1;4) & ";" & DROITE("0000" & B1;4) & "]"

                eric
                1
                1. Merci MONSIEUR eriiic !

                  Je me galérais en en demandant trop à chaque cellule (j'avais simplifié mon pb dans l'exemple), mais avec ta solution toute simple et un meilleur découpage de mes formules, c réglé.
                  Meric encore !
                  0
              2. très belle démo pour les styles appliqués au texte, mais qu'en est-il quand il s'agit d'un format personnalisé ?

                exemple :

                valeurs entrées : A1=5 B1=10
                valeurs affichées : A1=0005 B1=0010

                et j'aimerais réussir à concatener les valeurs en conservant leur format (ex : C1 = [0005;0010]

                Est-ce possible ?

                Merci pour votre aide !

                ...faut vraiment que je me mette aux macro -_-
                0
                1. Contributeur
                  Derniere version avec choix de l'offset : http://www.cijoint.fr/cij77852548227558.xls
                  (offset 0 remplace les formules par les chaines mises en forme)

                  Const LF As String = "vblf"
                  Sub RecupFormatCel()
                  Dim c1 As Range, c2 As Range, dest As Range
                  Dim i As Integer, long1 As Long, ptr1 As Long, offset1 As Long
                  Dim formatCel As Variant
                  Dim ListeRef As Variant
                  Dim msg As String
                  msg = "A quel offset (en colonnes) coller le résultat ?" & vbCrLf
                  msg = msg & "(si offset = 0 la formule d'origine " & vbCrLf
                  msg = msg & "sera remplacée par la chaine formatée)"
                  offset1 = InputBox(msg, "Choix offset résultat")

                  For Each c1 In Selection
                  f = c1.Formula
                  If Left(f, 1) <> "=" Then 'formule ?
                  MsgBox ("Erreur" & vbCrLf & "La cellule " & c1.Address & " ne contient pas de formule de concatenation")
                  Exit Sub
                  Else
                  f = Mid(c1.Formula, 2) 'oui: eliminer =
                  End If
                  Set dest = c1.Offset(0, offset1) 'cellule de destination
                  dest.Value = c1.Value
                  ListeRef = Split(f, "&") ' découper la formule
                  '
                  ' remplacement des "vbLF" par vbLf
                  While InStr(1, LCase(dest.Value), LF)
                  pos = InStr(1, LCase(dest.Value), LF)
                  dest = Left(dest.Value, pos - 1) & vbLf & Mid(dest.Value, pos + Len(LF))
                  Wend

                  ' récupération des formats
                  ptr1 = 1
                  For i = 0 To UBound(ListeRef)
                  Set c2 = Range(ListeRef(i)) ' adresse de la chaine
                  long1 = Len(c2.Value) ' longueur de la chaine
                  If LCase(c2.Value) = LF Then
                  ' traitement vbLF
                  long1 = 1
                  Else
                  With c2.Font
                  formatCel = .FontStyle
                  dest.Characters(Start:=ptr1, Length:=long1).Font.FontStyle = formatCel
                  formatCel = .ColorIndex
                  dest.Characters(Start:=ptr1, Length:=long1).Font.ColorIndex = formatCel
                  formatCel = .Underline
                  dest.Characters(Start:=ptr1, Length:=long1).Font.Underline = formatCel

                  End With
                  End If
                  ptr1 = ptr1 + long1
                  Next i
                  Next c1
                  End Sub
                  Sub test()
                  Range("H3:H5,H7:H8").Select
                  RecupFormatCel
                  End Sub
                  Sub raz()
                  Range("I3:I8").ClearContents
                  End Sub
                  0
                  1. Salut

                    merci beaucoup "eriiic" pour les infos, l'aide, et la conversion pour OpenOffice.org Calc !

                    (merci à tous aussi, de réfléchir au problème) ou auX problèmeS soulevés dans les réponses ! :-)

                    (Essayons de donner une solution, à toutes les questions posées ici, indirectement dans les réponses)

                    * Le tableur, Microsoft Excel ou OpenOffice.org Calc, c'est pas facile ! ...

                    merci "eriiic", et merci à tous, pour plus d'infos et d'aide . merci .

                    à+
                    0
                    1. Bonjour,

                      Merci de vous pencher autant sur ma question, j'en attendais pas tant. Visiblement il n'y a pas de reponse pas trop compliquée.
                      Mais mettre à la main en gras la quantité de données que j'ai est bien inférieur au temps passer a essayer de faire ca rapidement, du coup il n'y a pas trop de valeur ajoutée.

                      Si vous voulez continuer à chercher une solution, il n'y a pas de problème, je garderai un oeil sur la discussion, mais de mon perspective, c'est plus simple de laisser tomber et de faire a la main. Merci a eriiic et a anonyme.

                      Ciao
                      Thierry
                      0
                      1. Contributeur
                        Slt Thierry,
                        tu es sûr d'avoir bien lu les réponses ?

                        Tu ouvres le fichier joint au post 10, tu ouvres ton fichier, tu sélectionnes les cellules de ton fichier où se trouve les formules de concatenation, et tu lances la macro et dans les cellules à coté tu trouves la chaine formatée avec les gras, couleurs etc

                        et si tu ouvres celui ci : http://www.cijoint.fr/cij77852548227558.xls
                        tu peux même choisir d'écraser tes formules (offset 0) ou de coller le résultat 20 colonnes plus loin si tu veux préserver tes cellules occupées
                        eric
                        0
                      2. @eriiicBonsoir,
                        Effectivement j'ai lu un peu trop vite les reponses. Tes macros m'aident bien en fait donc merci beaucoup.
                        Par contre de toute facon je dois avoir fini demain, donc pour ma part je vais en rester là.

                        A plus
                        0
                    2. Contributeur
                      Slt Anonyme,

                      Pour Open Office je ne me suis jamais penché sur les macros. Sans doute adaptable facilement.
                      Pour ce qui est de faire une fonction c'était mon idée de départ mais pas si facile crois moi. Dès que l'on retourne la valeur plus moyen de continuer le traitement pour faire la mise en forme et d'acceder à l'adresse sans avoir une référence circulaire, et si on s'y prend autrement on perd les attributs déjà mis... (à creuser mais pour l'instant j'en suis là)
                      A la limite l'option de faire une proc présente un avantage : pouvoir traiter un tableau déjà fait pour peu qu'on libère les cellules recevant le résultat, par contre pas de mise à jour dynamique :-s
                      Mais bon, il y a des améliorations possibles, c'était au départ pour voir la faisabilité sans faire trop de contrôles ni d'analyse trop poussée de la formule.

                      A défaut du viewer voici une capture écran.
                      Les formules de concaténation sont en colonne H, le résultat de la macro en colonne I
                      J'ai pris l'option d'une chaine spécifique pour les retours à ligne, d'où les "vbLf"
                      http://www.cijoint.fr/cij73148756327527.jpg

                      Le code en VBA pour adaptation en Open Office:
                      Const LF As String = "vblf"
                      Sub RecupFormatCel()
                          Dim c1 As Range, c2 As Range, dest As Range
                          Dim i As Integer, long1 As Long, ptr1 As Long, ptr2 As Long
                          Dim formatCel As Variant
                          Dim ListeRef As Variant
                          For Each c1 In Selection
                              f = c1.Formula
                              If Left(f, 1) <> "=" Then 'formule ?
                                  Exit Sub
                              Else
                                  f = Mid(c1.Formula, 2) 'oui: eliminer =
                              End If
                              Set dest = c1.Offset(0, 1) 'cellule de destination
                              dest.Value = c1.Value
                              ListeRef = Split(f, "&") ' découper la formule
                              '
                              ' remplacement des "vbLF" par vbLf
                              While InStr(1, LCase(dest.Value), LF)
                                  pos = InStr(1, LCase(dest.Value), LF)
                                  dest = Left(dest.Value, pos - 1) & vbLf & Mid(dest.Value, pos + Len(LF))
                              Wend
                      
                              ' récupération des formats
                              ptr1 = 1
                              For i = 0 To UBound(ListeRef)
                                  Set c2 = Range(ListeRef(i)) ' adresse de la chaine
                                  long1 = Len(c2.Value) ' longueur de la chaine
                                  'ptr2 = ptr2 + long1
                                  If LCase(c2.Value) = LF Then
                                      ' traitement vbLF
                                      long1 = 1
                                  Else
                                      With c2.Font
                                          formatCel = .FontStyle
                                          dest.Characters(Start:=ptr1, Length:=long1).Font.FontStyle = formatCel
                                          formatCel = .ColorIndex
                                          dest.Characters(Start:=ptr1, Length:=long1).Font.ColorIndex = formatCel
                                          formatCel = .Underline
                                          dest.Characters(Start:=ptr1, Length:=long1).Font.Underline = formatCel
                      
                                      End With
                                  End If
                                  ptr1 = ptr1 + long1
                              Next i
                          Next c1
                      End Sub
                      Sub test()
                          Range("H3:H5,H7:H8").Select
                          RecupFormatCel
                      End Sub
                      Sub raz()
                          Range("I3:I8").ClearContents
                      End Sub


                      eric
                      0
                      1. Contributeur
                        Pour compléter les difficultés rencontrées sur la fonction, les attributs texte appliqués sur le texte d'une cellule (et non pas de la cellule elle même) sont perdus dès la mise dans une variable VBA. Ils ne sont manipulables que dans la cellule elle-même.
                        Si tu trouves une astuce pour les manipuler directement dans VBA je suis preneur, tous les pb seraient réglés, moi je n'ai pas trouvé
                        Maintenant il faut essayer avec des fonctions séparées comme dans ton exemple, je n'ai pas pensé à cette piste. A tester...
                        eric
                        0
                    3. Salut

                      Si tu peux "eriiic", s'il te plaît, utilises "Microsoft Excel Viewer", pour voir comment on voient la chose ; merci .
                      => Ce sera très instructif ; pas de macro, vba, ou "autres trucs" activés ...

                      Regardes aussi avec OpenOffice.org Calc ; merci ; tous le monde n'a pas office ...
                      Essayes, si tu veux et si tu peux, heinn ;-), de faire des exemples visibles correctement par tous .
                      (merci)

                      Pour ma part ; je ne dit pas de faire ; comme l'exemple proposé au Post #8 :

                      B1: =A1&A2&A3&A4 (pour concaténer)
                      Mais plutôt ; si c'est possible :
                      B1: =MettreEnGras(A1)&MettreEnItalique(A2)&NeutreDefaut(A3)&NeutreDefaut(A4) (pour concaténer)

                      => On appelle la fonction ; ici pour la mise en forme du texte, dans la formule ! ;-)
                      (Fonction que l'on fait soit-même!!)

                      heu, dans Excel, c'est pas possible d'utiliser la fonction caché "style", comme dans OpenOffice.org Calc ?
                      Je dit caché, car j'ai pas trouvé d'infos ... (voir svp liens posts précédents) .

                      merci "eriiic" et merci à tous .

                      à+
                      1
                      1. Bonjour,

                        Bon... ce post est un peu ancien mais je suis devant le même problème.
                        Mon but est également de concaténer des cellules qui pourront selon une variable de date être en gras ou pas.
                        La solution que j'envisage est donc de créer en VBA une fonction "conservformat" qui me permettra de garder le format de la cellule source tel que dans l'exemple suivant:

                        =CONCATENER(A1;conservformat(A2);A3)

                        Ainsi le format de la cellule A2 sera conservé dans ma cellule de destination.

                        Voici mon début de code:

                        Function ConservFormat(rngCells As Range) As Double
                        Application.Volatile
                        Dim cell As Range
                        ConservFormat = ???
                        On Error Resume Next
                        For Each cell In rngCells
                        If cell.Font.Bold Then ConservFormat = ???
                        Next cell
                        End Function

                        Comme vous le voyez l'idée est de détecter quelles cellules sont en gras pour mettre une condition de format dans la fonction. Mais il me manque justement la condition de format...
                        bon je ne sais pas si je suis clair, mais dans le cas où vous comprendriez mon problème, avez-vous une idée de comment faire?

                        Merci à vous
                        0
                    4. Contributeur
                      Re,

                      nouvelle version qui permet d'inserer une chaine "vbLf" forçant le retour à la ligne à l'intérieur du texte d'une cellule
                      http://www.cijoint.fr/cij2036478627532.xls

                      Attention toujours faire référence à une cellule, je ne traite pas (encore?) les formules du type =A1 & "blablabla" & A3 & ...
                      eric
                      0
                      1. Contributeur
                        Bonjour Thierry,

                        Pas facile mais interessante ta question.
                        J'ai d'abord voulu créer une fonction remplaçant CONCATENER mais impossible à résoudre.
                        J'ai donc créé un sub qui analyse la formule des cellules que tu lui passes en sélectionnant des plages et colle le résultat dans la cellule immédiatement à droite.
                        Je ne fais presque pas de controle donc ces formules doivent se limiter à = A1 & A2 & ... et faire référence à des cellules qui ne contiennent que des chaines. Les attributs récupérés sont : gras, italique, souligné simple, couleur. Je n'ai pas regarder mais récupérer la police et la taille doit etre possible

                        Bien sûr c'est un premier jet mais c'est fonctionnel. Il faudra completer avec un user form permettant de choisir l'offset de destination, les attributs à récupérer, etc. J'ai prévu également de pouvoir insérer un retour chariot où l'on veut (pour vaucluse ;-)) mais non traité pour l'instant
                        Un exemple plus parlant : http://www.cijoint.fr/cij45591193727506.xls

                        Tu sélectionnes par exemple F3:F4 et F6:F8 et tu lances la macro RecupFormatCel
                        Tu vas pouvoir te faire de jolis dégradés ;-)

                        eric
                        0
                        1. Merci Anonyme pour toutes ces recherches, mais je n'ai rien trouvé qui correspondait a mon probleme.

                          En fait c'est plus compliqué que juste mettre en gras une partie de la cellule.
                          Un aute exemple:
                          en A1: Bonjour_
                          en A2: ca va_
                          en A3: oui_
                          en A4: et toi?
                          en B1: =A1&A2&A3&A4 (pour concatener)
                          et j'obtiens:
                          Bonjour_ca va_oui_et toi?
                          au lieu de
                          Bonjour_ca va_oui_et toi?

                          En gro je voudrais conserver le format lors de la concatenation.

                          Merci d'avance
                          0
                          1. Salut

                            Mettre en gras une partie d'un texte sous Microsoft Excel :

                            https://sebsauvage.net/temp/wink/excel_vbarecord.html

                            Source => http://www.commentcamarche.net/forum
                            /affich-2073115-excel-comment-mettre-en-gras-avec-une-macro


                            Fonctions "cachées" XL4 ; Astuce récente : lire.cellule() ; sur (C) 2006 Excel Downloads :
                            https://www.excel-downloads.com/threads/astuce-recente-lire-cellule.32955/

                            Savoir si les cellules sélectionnées (Excel) sont en gras et italiques :
                            http://www.codyx.org/snippet_savoir-si-cellules-selectionnees-excel-sont-gras-italiques_336.aspx

                            
                            Public Function IsBoldItalic(ByVal MyRange As Range) As String
                                Dim rCell As Range
                                
                            For Each rCell In MyRange
                                IsBoldItalic = IsBoldItalic & rCell.Address & " :" & vbCrLf
                                IsBoldItalic = IsBoldItalic & vbTab & "Gras : " & CBool(rCell.Font.Bold) & vbCrLf
                                IsBoldItalic = IsBoldItalic & vbTab & "Italique : " & CBool(rCell.Font.Italic) & vbCrLf
                            Next rCell
                            End Function
                            Sub EXEMPLE()
                                Debug.Print IsBoldItalic(Range("A1:A4"))
                                
                            '       *** RESULTAT :  ***
                            '$A$1 :
                            '    Gras : Faux
                            '    Italique :  Faux
                            '$A$2 :
                            '    Gras : Vrai
                            '    Italique :  Faux
                            '$A$3 :
                            '    Gras : Faux
                            '    Italique :  Vrai
                            '$A$4 :
                            '    Gras : Vrai
                            '    Italique :  Vrai
                            End Sub
                            


                            merci .

                            à+
                            0
                            1. Salut

                              Mettre en gras une partie d'un texte sous Microsoft Excel :

                              Comment faire pour mettre dans une cellule une partie seulement du texte en gras ?
                              Sans VBA, c'est enfantin, tu le sélectionnes et tu cliques sur l'icone "gras".
                              Par VBA, tu peux utiliser la position de la sous chaine pour le faire :

                              *** :
                              Sub MettreEnGras()
                              Range("A1") = "Automobile"
                              'Mettre en gras "bile"
                              Range("A1").Characters(7, 4).Font.Bold = True
                              End Sub
                              *** .

                              Denis Michon, (N°816)
                              Source => http://www.excelabo.net/excel/formatstexte.php

                              Je pense, que tu peux appelé une fonction, "MettreEnGras()" le résultat en cours de "calcul" ; et cette appel de la fonction, se trouve dans la formule, au bon endroit. La fonction, tu la fais toi-même, avec de l'aide, en te basant sur l'exemple intéressant ci-dessus. merci.

                              C'est très dur, de trouver une information, sur la fonction "style" ; à placer dans une formule !
                              Pour Microsoft Excel (c'est dur), comme avec OpenOffice.org Calc (plus facile de trouver) .
                              => On fait, créé, un style, et on l'applique directement dans (à partir de) la formule ? (j'ai un doute)

                              merci .

                              à+
                              1
                              1. C'est assez simple: tu mets =cellule1&cellule2
                                0
                              2. Modérateur
                                Très bel exemple de remontée de sujet, périmé depuis 4 ans, pour donner une réponse totalement inexacte.
                                0
                              3. @pijaku
                                En fait, j'avais cette question justement "maintenant" (sauf pour le format) et je dois dire que la réponse de banbar règle à la perfection mon problème de concaténer plusieurs cellule, puisque je n'ai pas besoin de conserver les caractères gras (je n'en ai pas) Alors cette remonté de sujet, environ 28 jours avant mon besoin "maintenant", est pas loin d'être une bénédiction ;-)
                                0
                              4. Pour ceux qui pourraient ultérieurement utiliser ce fourm. Voici ma solution que je trouve plus simple que le VBA pour ce que je voulais faire.

                                Ce que je voulais faire: concaténation en gardant la mise en forme d'un % et du texte.
                                Solution (exemple): =TEXTE(B2/B5;"0,00%")&" Patates"

                                B2 et B5 contenaient ce que l'on a appel couramment des chiffres !
                                0
                            2. Justement, là est mon probleme, la formule ne conserve pas le format des cellules, du coup on obtient un simplement Bonjour ca va.
                              Et en mettant la cellule en gras, on obtient Bonjour ca va.
                              Donc comme ca pas moyen d'avoir Bonjour ca va
                              0
                              • 1
                              • 2