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