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) :
la fonction elle même qui effectue la conversion (et c'est la que ca devient plus délicat) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Un grand merci par avance pour vos idées inspirées qui permettront à cette (poussive) fonction de connaître des performances un peu meilleures !!
Partager