Vba excel 97 à 2003 - concaténation

Gil -  
 Gil -
Bonjour,

soit un tableau excel, avec par exemple trois cellules contenant du texte mis en forme
par exemble A1, A2, A3

c'est à dire qu'un ou plusieures mots dans le texte de la cellule peuvent être en gras et en rouge et sous une certaine police, et le reste du texte de la police en normale et noir.

Je souhaite par macro retrouver mettre par exemple en cellule B1 le contenu concaténé de chacune des cellules A1,A2, et A3 en conservant la mise en forme du texte de chacune.

Comment faire ?

Je sais bien récupérer le contenu avec la propriété Value, mais je n'arrive pas à récupérer et concaténer les contenus avec leur mise en forme.

Merci beaucoup
Configuration: Windows XP
Internet Explorer 6.0
Excel 97

2 réponses

  1. santiago69 Messages postés 485 Statut Membre 209
     
    Je me suis deja penche sur le probleme. c'est une sacree galere.
    enfin pas tant que ca puisqu'il y a l'objet
    Cells(ligne, colonne).Characters(debut, longueur).Text

    qui donne la valeur d'un extrait de la chaine contenu dans la cellule et l'objet
    Cells(ligne, colonne).Characters(debut, longueur).Font

    avec les proprietes FontStyle, Size, Color, Bold, Italic...
    qui donne le format d'un extrait de la chaine contenu dans la cellule.

    En fait, ce qui est chiant, c'est que je ne vois pas comment faire autrement que de prendre les caracteres un par un et de leur appliquer leur style propriete par propriete.

    Bon courage
    Santiago
    1
    1. Gil
       
      Donc,tu as raison, c'est si je comprends bien une sacrée galère, car comme la chaine de caractères est chaque fois différente et que la présentation peut varier, il faut examiner caractère par caractère les propriétés
      de chaque caractère puis les concaténer avec les mêmes propriétés...
      0
  2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonsoir,

    voici une macro qui te récupère les attributs couleur, souligné, gras, italique sur les cellules d'origine d'une concaténation. Avec, au choix, écrasement de la formule ou écriture à un offset horizontal de ton choix.
    En prime tu peux ajouter des retour à la ligne dans la concaténation avec l'ajout de &"vbLf" dans la concaténation.
    Par contre, de mémoire je ne récupère pas la police ni sa taille, il faudra le rajouter...
    http://www.cijoint.fr/cjlink.php?file=cj200810/cij0kyWaq0.xls

    eric

    Le code pour quand le lien sera périmé :
    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", 1)
    
        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

    Modop: sélectionner les cellules avec concaténation et appeler la macro.
    Offset=0 : écrasement de la formule de concaténation
    Offset=1 : écriture 1 cellule à droite de la formule (à faire dans un 1er temps pour tester sans perdre la formule)

    eric
    0
    1. Gil
       
      Merci beaucoup Eric,

      ce code est très bon, je l'utiliserai.

      Bravo pour le boulot.
      0