Optimisation code pour générer des balises richtext
Bonjour,
OBJECTIF : je dois récupérer la mise en forme de textes contenus dans des cellules Excel, pour générer des balises richtext interprétables dans un autre environnement.
Ex : "un espace VIP de 150m² vous accueillera pour vous offrir les meilleures prestations" -> "un espace <I>VIP</I> de 150m<E>2</E> vous accueillera pour vous offrir les <B>meilleures</B> prestations"
METHODE : Cellule après cellule, je parcours chaque caractère du texte et remplace ceux trouvés avec une mise en forme par une balise.
Ex : VIP -> <I>V</I><I>I</I><I>P</I> Reste ensuite à faire le ménage en suprimant les balises "</I><I>" pour obtenir seulement le mot correctement encadré : <I>VIP</I>
Voici donc le code utilisé : J'appelle ma fonction à partir d'une procédure d'où je passe le texte en paramètre (pas de souci à ce niveau) :
Code:
1 2 3 4 5 6 7 8
|
'-- Parcours de toutes les cellules et copie de la colonne In dans colonne Out ---
For n = 2 To WorksheetFunction.CountA(Range("B:B")) '-- Calcul du nombre de ligne avec ID
Range(laColonneOut & n) = xls2balises(Range(laColonneIn & n))
Range(laColonneOut & n).Select
Next |
la fonction elle même qui effectue la conversion (et c'est la que ca devient plus délicat) :
Code:
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
|
Public Function xls2balises(leTexte As Object) As String
Dim k As Integer
Dim Traduction As String
Traduction = ""
For k = 1 To Len(Characters) '-- Calcul du nombre de caractères dans la cellule = longueur du texte
With leTexte .Characters(k, 1) '-- Parcours du texte caractère par caractère
'-- GRAS ---------
If .Font.Bold Then
Traduction = Traduction & "<B>" & .Text & "</B>"
'-- ITALIC -------------
ElseIf .Font.Italic Then
Traduction = Traduction & "<I>" & .Text & "</I>"
'-- EXPOSANT -------------
ElseIf .Font.Superscript Then
Traduction = Traduction & "<E>" & .Text & "</E>"
ElseIf .Text = "²" Then
Traduction = Traduction & "<E>2</E>"
ElseIf .Text = ChrW(13217) Then '-- Caractère "m²"
Traduction = Traduction & "m<E>2</E>"
Else
Traduction = Traduction & .Text
End If
End With
Next
DoEvents
'-- NETTOYAGE DES BALISES PAR LETTRE -----------------------
Traduction = Replace(Traduction, "</B><B>", "")
Traduction = Replace(Traduction, "</I><I>", "")
Traduction = Replace(Traduction, "</E><E>", "")
xls2balises = Traduction |
PROBLEME : (et oui ca serait trop beau) le code fonctionne très bien (ca parait étonnant) mais avec des performances assez aléatoires. Sur une première feuille, ca va aller correctement puis dès la seconde, les temps vont commencer sérieusement à augmenter alors que les textes sont souvent de même longueurs (env. 780 caract.). Cela finit par prendre 2 à 3 minutes par textes contre quelques secondes au départ. Bref, je suis sûr qu'il manque quelque chose mais je ne vois plus trop...
Un grand merci par avance pour vos idées inspirées qui permettront à cette (poussive) fonction de connaître des performances un peu meilleures !!