Developpez.com

Le Club des Développeurs et IT Pro

Guide pratique de VBA Excel : convertir le format d'un texte en balises HTML

Un billet blog de Philippe Tulliez

Le 22/07/2023, par Philippe Tulliez, Rédacteur
Introduction
Il arrive souvent que nous ayons besoin d'envoyer un e-mail via Outlook. Pour cela, plusieurs options s'offrent à nous : utiliser un brouillon, un modèle ou un texte contenu dans une cellule Excel. Dans ce billet, nous allons explorer comment convertir le formatage (gras, italique et souligné) d'un texte Excel en balises HTML.



Le cadre
Imaginons que nous avons un groupe de cellules fusionnées que nous avons nommé TextPattern à l'aide du gestionnaire de noms.

Conversion des retours à la ligne en balises HTML
Commençons par un cas simple et très courant : l'insertion d'un texte sans formatage. Si ce texte doit s'étendre sur plusieurs lignes, nous utiliserons la combinaison de touches Alt + Enter pour créer un retour à la ligne.

Voici un exemple de texte (notez qu'il y a deux retours à la ligne entre l'adresse et la signature) :
Bonjour,
Vous devez vous présenter avant le 15 août à l'adresse ci-dessous pour renouveler votre licence.
Avenue du Gouvernement, 15 à Moulinsart

La direction

Dans une cellule Excel, le retour à la ligne est représenté par Chr(10) ou la constante VBA vbLf. En HTML, le retour à la ligne est représenté par la balise <br>. Pour convertir les retours à la ligne en balises HTML, nous pouvons utiliser la fonction Replace comme suit :
Code VBA :
1
2
 Dim t As String 
 t = Replace(Range("TextPattern").Value, vbLf, "<br>")
Dans cet exemple, la variable t contiendra le texte suivant :

Code :
Bonjour,<br>Vous devez vous présenter avant le 15 août à l'adresse ci-dessous pour renouveler votre licence.<br>Avenue du Gouvernement, 15 à Moulinsart<br><br>La direction
Conversion du texte en gras en balises HTML
Pour convertir le texte en gras en balises HTML <b> et </b>, nous devons identifier où se trouvent les éléments en gras dans le texte. Pour cela, nous allons utiliser la propriété Characters de l'objet Range, qui a deux arguments : Start et Len.

Par exemple, pour mettre en gras le troisième caractère du mot "Bonjour" dans la cellule A1 de la feuille "Feuil1", nous écrirons :
Code :
1
2
3
4
With Worksheets("Feuil1").Range("A1")  
 .Value = "Bonjour"  
 .Characters(3, 1).Font.Bold = True  
End With
Pour parcourir tous les caractères d'un texte, nous utiliserons une boucle :
Code VBA :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function ReplaceBoldToHTML(oRange As Range) As String 
  ' Déclaration 
  Dim B As String  ' Balise Html ou vide 
  Dim c As Integer ' Variable de boucle 
  Dim t As String  ' Texte reconstruit 
  ' Parcourt tous les caractères du texte contenu dans oRange 
  With oRange 
   For c = 1 To Len(.Text) 
    B = IIf(.Characters(c, 1).Font.Bold, "</b>", "") 
    t = t & Replace(B, "/", "") & .Characters(c, 1).Text & B 
   Next 
  End With 
  ReplaceBoldToHTML = Replace(t, vbLf, "<Br>") 
End Function

Si nous mettons dans la cellule A2 le texte "Bonjour Monsieur" et que nous invoquons la fonction ReplaceBoldToHTML, le résultat sera :
Code :
Bonjour <b>M</b><b>o</b><b>n</b><b>s</b><b>i</b><b>e</b><b>u</b><b>r</b>
Cela donne le même effet en HTML : "Monsieur" apparaîtra en gras.
Cependant, la répétition des balises </b><b> n'est pas très élégante et alourdit inutilement la chaîne de caractères. Nous allons donc améliorer la fonction en supprimant les balises inutiles avec la ligne de code "t = Replace(t, "</b><b>", "")".

Le code adapté
Code VBA :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Function ReplaceBoldToHTML(oRange As Range) As String 
  ' Déclaration 
  Dim B As String  ' Balise Html ou vide 
  Dim c As Integer ' Variable de boucle 
  Dim t As String  ' Texte reconstruit 
  ' Parcourt tous les caractères du texte contenu dans oRange 
  With oRange 
   For c = 1 To Len(.Text) 
    B = IIf(.Characters(c, 1).Font.Bold, "</b>", "") 
    t = t & Replace(B, "/", "") & .Characters(c, 1).Text & B 
    ' Supprime les balises inutiles 
    t = Replace(t, "</b><b>", "") 
   Next 
  End With 
  ReplaceBoldToHTML = Replace(t, vbLf, "<Br>") 
End Function

Conversion du texte en gras, italique, souligné et les couleurs en balises HTML
Maintenant que nous avons vu comment convertir le texte en gras en balises HTML, passons à un niveau supérieur.
Voici le code qui permet de convertir le texte en gras, en italique, souligné et de n'importe quelle couleur (sauf le noir) en balises HTML.

Code VBA :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Function GetFormatTextToHTML(oRange As Range) As String 
  ' Renvoie une chaîne de caractères avec les balises Html 
  '   avec la conversion des formats (Gras, Italique, Souligné et couleurs 
  ' Author : Philippe Tulliez (https://magicoffice.be) 
  ' Version : 1.1 
  ' Contrainte la couleur noire n'est pas traitée 
  ' Remplace le format (Gras, Italique, Souligné, Couleur) par des balises Html 
  ' Argument 
  '   oRange cellule où se trouve le texte formaté 
  ' 
  ' Déclaration 
  Const cc As String = "<span style=""color:<Hexa>"">" 
  Dim B As String, I As String, U As String, Cs As String, Ce As String 
  Dim c As Integer ' Variable de boucle 
  Dim t As String ' Texte 
  Dim r As Integer, g As Integer, Bl As Integer ' Red Green Blue 
  Dim Ch As String ' Code couleur en Hexa 
  ' Parcourt tous les caractères du texte contenu dans oRange 
  With oRange 
    For c = 1 To Len(.Text) 
      With .Characters(c, 1).Font 
       I = IIf(.Italic, "</i>", "") 
       B = IIf(.Bold, "</b>", "") 
       U = IIf(.Underline = 2, "</u>", "") 
       If .Color Then 
         '  Conversion du code couleur (RGB) en HEXA pour HTML 
         r = .Color Mod 256: g = (Color \ 256) Mod 256: Bl = (Color \ 65536) Mod 256 
         Ch = "#" & Right("0" & Hex(r), 2) & Right("0" & Hex(g), 2) & Right("0" & Hex(Bl), 2) 
         Cs = Replace(cc, "<Hexa>", Ch) 
         Ce = "</span>" 
        Else 
         Cs = "": Ce = "" 
       End If 
      End With 
      ' Insertion des balises 
      t = t & Replace(I, "/", "") & Replace(B, "/", "") & Replace(U, "/", "") & Cs & .Characters(c, 1).Text & Ce & U & B & I 
      ' Supprime les balises inutiles 
      t = Replace(t, "</i><i>", "") 
      t = Replace(t, "</b><b>", "") 
      t = Replace(t, "</u><u>", "") 
      If Len(Cs) Then t = Replace(t, "</span>" & Cs, "") 
    Next 
  End With 
  ' Remplace le caractère vbLf par <br> 
  GetFormatTextToHTML = Replace(t, vbLf, "<br>") 
End Function

Conclusion
Et voilà ! Vous avez maintenant un outil puissant pour convertir le formatage de texte Excel en balises HTML, y compris le gras, l'italique, le souligné et la couleur. Cela peut être particulièrement utile pour la création de courriels formatés ou de pages web à partir de contenu Excel. N'oubliez pas que vous pouvez télécharger le classeur de démonstration pour voir comment cela fonctionne en pratique. Bon codage !
  Billet blog