Même si le formatage du texte n'est pas la chose la plus aisée dans Excel, il est quand même possible d'adapter l'apparence de vos documents à vos besoins.
Dans Excel même, on peut facilement formater même les différentes parties d'un texte dans une cellule. En VBA, il faut bricoler un peu pour y arriver. La question qui arrive le plus souvent concernant le formatage du texte est:
Comment mettre en gras une partie du texte d'une cellule en VBA?
Pour commencer: Si vous voulez tout simplement mettre en gras une cellule entière
Si vous êtes simplement à la recherche de comment on met une cellule en gras en VBA, sachez que le code est très simple:
1 |
Range("B1").Font.Bold = True |
Ce code mettra en gras la cellule ou la plage indiquée (ici la cellule B1), peu importe son contenu. Même si la cellule est vide, elle sera formatée en gras et si vous y mettez du contenu plus tard, il sera en gras.
VBA: formatter une partie du texte en gras
Maintenant on arrive au plus compliqué… Alors, comment obtenir le cas suivant en VBA?
Réponse: Grâce à la classe Characters
de VBA. Le code de base à utiliser est le suivant:
1 |
Range(X).Characters(Y, Z).Font.Bold = True |
X
est votre cellule, Y
est le numéro de caractère où commence la partie en gras et Z
est le nombre de caractères qui doivent être en gras.
Exemple: Si vous avez le texte "ceci est une promotion" dans la cellule "B1
" et vous voulez mettre en gras le mot "promotion", l'instruction VBA ressemblera à ceci:
1 |
Range("B1").Characters(13, 9).Font.Bold = True |
Ceci est le code VBA basique – pour pouvoir l'utiliser, vous devez connaître le numéro du caractère par lequel la partie formatée en gras commence ainsi que la longueur du texte qui doit être gras. Ce qui n'est pas très commode, ni très pratique. Mais il y a toujours une solution…
VBA: mettre en gras un mot spécifique dans le texte
Si vous voulez mettre en gras un mot (ou un groupe de mots) en particulier, vous pouvez procéder de la manière suivante:
1 |
Range(X).Characters(InStr(1, Range(X).Value, "Y"), Len("Y")).Font.Bold = True |
où X
est votre cellule et "Y"
est le mot (groupe de mots ou groupe de caractères) qui doit être formaté en gras.
Comme vous voyez, on va utiliser la fonction VBA InStr qui renvoie la position d'une chaine de caractères dans une autre et de la fonction Len.
L'exemple de "ceci est une promotion" va nous donner le code suivant:
1 |
Range("B1").Characters(InStr(1, Range("B1").Value, "promotion"), Len("promotion")).Font.Bold = True |
Ce code VBA a l'avantage que vous ne devez pas vous préoccuper ni de la longueur de texte à formater en gras, ni à sa position dans le texte!
Si vous avez besoin d'utiliser cette fonctionnalité fréquemment, vous avez probablement intérêt à créer une fonction VBA spécifique à cette utilisation (une UDF – "User Defined Function") avec deux paramètres: la Range
et le texte à formater…
Une astuce pour la fin
Dernière remarque: Vous pouvez utiliser cette méthode pour tous les types de formatage qui est disponible dans la classe Font
: par exemple l'oblique, la couleur de texte, la taille du texte, le soulignement,…
Pour aller plus loin en VBA
Et pour terminer, voici quelques autres articles qui pourraient vous être utiles…
- Plus sur la classe "Characters" sur le site de Microsoft (en anglais)
- Liste de toutes les fonctions disponibles en VBA
- Gestion des fichiers en VBA
- RECHERCHEV en VBA – oui, c'est possible! 😉
- Débloquer VBA dans les fichiers Excel provenant d'internet
18 commentaires sur “VBA: mettre en gras une partie de texte”
EST CE QUE ON PEUT APPLIQUER LA MEME CHOSE SUR ACCESS
DANS UNE ZONE TEXTE DANS UN ETAT PAR EXEMPLE
de la même manière que pour une cellule, peut on également mettre un mot spécifique en gras dans une colonne ? Si oui quelle est la syntaxe ?
d'avance merci
cdt
Bonjour Claire,
oui, c'est tout à fait possible. Il vous suffit d'inclure le code pour une cellule dans une boucle qui va tester les cellules dans une colonne spécifique et le tour est joué!
Exemple:
Ce code va mettre en gras le mot "promotion" dans les 100 premières cellules de la colonne "B". A vous d'ajuster le nom de colonne et le nombre de cellules selon vos besoins…
J'espère que cela répond à votre question.
Cordialement, Martin
Un grand merci, très pratique, cela répond parfaitement
Cordialement
Bonjour,
Je vous remercie pour ce post très utile. Cependant j'ai un problème que je n'arrive pas à régler.
J'ai une colonne ("A1:A110") dans laquelle j'ai des noms de taxons botaniques en nomenclature binaire. J'emporte ma liste sur excel sans aucune mise en page. Or, ces noms binaires doivent être présentés en italique (Triticum dicoccon), mais il arrive parfois que le nom du taxon comporte quelques abréviations qui, elles, ne doivent pas être en italique ("sp.", "cf.", "s.l.", "agg.", "ssp.", "fo."). Ces abréviations se trouvent aussi bien au début, qu'au milieu ou à la fin du nom binaire (Triticum cf. dicoccon ; cf. Triticum dicoccon ; Triticum sp. ; Triticum aestivum s.l. ; etc.).
Mon raisonnement a été le suivant : mettre tout en italique pour ensuite enlever l'italique des abréviations.
J'ai adapté le code que vous proposez mais je suis confrontée à un problème : les trois premiers caractères de toutes les cellules restent sans changement, c'est à dire il ne sont pas présentés en italique (par exemple pour Triticum : "Tri" n'est pas en italique et "ticum" est en italique). Voici le code :
Si j'essaie le code ci-dessous, juste pour enlever l'italique de l'abréviation "cf.", j'ai un meilleur résultat, juste les trois premiers caractères de la première cellule restent inchangés, avec les autres cellules j'obtiens ce que je veux, mais alors les autres abréviations restent en italique. Je n'arrive pas à comprendre où se trouve l'erreur.
Merci par avance !
Bonjour Salomé,
le problème vient du fait que si l’abréviation n'est pas trouvée dans la cellule, la fonction InStr va retourner le résultat = 0 et vous aller enlever l'italique pour les 3 ou 4 caractères à partir du premier.
Donc vous devez d'abord tester si l'abréviation est présente ou pas dans la cellule.
Le code suivant va fonctionner:
Cordialement, Martin
Re-bonjour Martin,
Un grand MERCI ! Cela marche parfaitement ! En effet, les abréviations ne se trouvent pas forcément dans chaque cellule et c'était ça le problème. Il faut dire que la programmation n'est pas du tout mon domaine, j'ai passé pas mal de temps sur cette question sans pouvoir trouver une solution. Alors merci, merci, merci, vous avez sauvé une thèse 😉
Trop compliqué pour moi, qui ne connais rien à l'informatique et encore moins à la programmation ! je me contente de la méthode qui fonctionne si bien avec les traitements de textes courants conne Word, OpenOffice … en utilisant la barre d'état !
Elle fonctionne bien aussi avec Excel !
Bonjour Anne Marie,
je crois qu'il y a un petit malentendu sur le sujet de cet article: en fait, ceci n'est pas une utilisation "normale" par un utilisateur d'Excel.
Ceci est le code qui permet de faire cette action de manière automatique. C'est utilisé par des développeurs VBA pour des automatisations ou comme partie d'une application.
Donc en effet, pour un utilisateur normal d'Excel, les boutons de traitement de texte sur le Ruban sont beaucoup plus appropriés…
Cordialement, Martin
Trop compliqué dans Excel 2016
Pouvez-vous donner une explication plus simple ?
Bonjour,
Je souhaiterai colorier le texte cible recherché dans une macro.
J'ai essayé d'adapter le code donné plus haut mais cela ne fonctionne pas.
Voici le message d'erreur au debogage : Range(Cible).Characters = < La méthode Range de l'objet global a échoué
Voici un extrait de la macro dont la fonction est rechercher une chaîne de caractère dans une colonne pour la comparer dans une autre colonne de la feuille "GPS".
Merci d'avance pour vos suggestions.
Cordialement,
Buzuzima
Bonjour,
Il manquait les points devant range car je fais appel à la feuile "GPS"
.Range(Cible).Characters(InStr(1, .Range(Cible).Value, rf), Len(rf)).Font.Color = RGB(0, 255, 0)
Voir le lien suivant :
https://forums.commentcamarche.net/forum/affich-36662354-recherche-chaine-de-caractere-dans-une-colonne
Cordialement,
Buzuzima
Bonjour,
en effet, avec la construction
With Sheets("GPS")
, il faut les points avantRange
car il s'agit de la "prolongation" duBonjour,
Merci pour ce code. Est il possible de faire ce test sans respecter la casse ? (sinon ne détecte pas les majuscules de début de mot par exemple).
Cdlt
Bonjour Damien,
oui, c'est possible: il suffit d'appliquer la fonction LCase à la valeur de la cellule =>
Range("B1").Characters(InStr(1, LCase(Range("B1").Value), "promotion"), Len("promotion")).Font.Bold = True
Voilà, j'espère que cela répond à votre question. Cordialement, Martin
Bonjour,
Je suis face à un problème sur lequel je sèche un peu.
Je souhaite extraite les données de ranges qui sont partiellement formatées ( gras,italique, couleurs)
Je ne vois pas comment procéder simplement.
Si je peux avoir un peu d'aide…
Merci d'avance.
Bonjour et merci pour ce post !
Bonjour et merci pour ce post!
J'ai inclus le code dans une boucle pour tester les cellules dans une colonne. Mais lorsque le mot à mettre en gras n'est pas dans la cellule, c'est les premiers caractères de la cellule qui sont mis en gras au lieu de ne rien faire et passer à la cellule suivante. Auriez-vous une solution à me proposer ?
En vous remerciant par avance
Cordialement, Fabrice