Testé sur : Excel 365 v2509 · Excel 2021 · Excel 2019 · dernière vérification le 10/06/2026
En bref — Format prend une valeur et un code de format et vous rend une chaîne qui ressemble à ce que vous avez demandé. Excellent pour construire des noms de fichiers, des messages et des libellés de rapport — et une usine à bugs silencieux dès que vous écrivez son résultat dans une cellule de données, car cette cellule contient alors du texte, pas un nombre ni une date.
Sub FormatDemo()
Debug.Print Format(1234.5, "#,##0.00") ' 1 234,50
Debug.Print Format(0.75, "0.0%") ' 75,0%
Debug.Print Format(Now, "yyyy-mm-dd") ' 2026-06-10
Debug.Print Format(Now, "dddd d mmmm") ' mercredi 10 juin
Debug.Print Format(38740, "#,##0 €") ' 38 740 €
End Sub
La signature, avec les deux arguments optionnels que presque tout le monde oublie :
Format(expression, [format], [firstDayOfWeek], [firstWeekOfYear])
' la valeur code pour le calcul du jour, rarement utile
Le modèle mental : Format est du maquillage, pas de la chirurgie
Format change l'apparence d'une valeur, jamais ce qu'elle est. Donnez-lui le numéro de série de date 46183 et le code "yyyy-mm-dd", et vous obtenez la chaîne "2026-06-10". La valeur sous-jacente ne change pas de type à l'entrée — mais ce qui sort est toujours une String. C'est la phrase la plus importante sur Format : la sortie est du texte.
Gardez ça en tête et tout l'outil se met en place. Utilisez Format quand la destination est une chaîne — une boîte de message, un nom de feuille, un nom de fichier "rapport_" & Format(Date, "yyyymmdd") & ".xlsx", un libellé que vous concaténez. Ne l'utilisez pas quand la destination est une cellule qui doit rester un nombre ou une date, car vous verseriez du texte dans un emplacement sur lequel le reste de votre classeur compte calculer.
La règle unique : Format renvoie une String — et casse donc les calculs en aval
C'est la règle qui explique le désastre Format le plus courant :
À l'instant où vous écrivez
cell.Value = Format(uneDate, "yyyy-mm-dd"), cette cellule cesse d'être une date et devient du texte qui ressemble à une date. Elle ne se trie pas chronologiquement, ne se filtre pas par mois, et=SOMMEsur une colonne de « nombres formatés » renvoie0.
Voici le piège, entièrement monté :
' ⚠ FAUX — remplit la colonne de texte qui n'a l'air que numérique
Range("C2").Value = Format(1234.5, "#,##0.00") ' la cellule contient maintenant la CHAÎNE "1 234,50"
' =SOMME(C:C) l'ignore. Le tri traite "1 234,50" comme du texte. Les graphiques la sautent.
Si ce que vous voulez vraiment, c'est que la cellule s'affiche avec des séparateurs de milliers tout en restant un vrai nombre, vous n'utilisez pas Format du tout — vous réglez le format de nombre de la cellule et laissez la valeur tranquille :
' ✓ JUSTE — la valeur reste numérique, seul l'affichage change
Range("C2").Value = 1234.5
Range("C2").NumberFormat = "#,##0.00" ' SOMME, tri, graphiques fonctionnent encore
Cette distinction — Format produit du texte, NumberFormat change l'affichage — c'est tout le jeu. Gravez-la : Format pour les chaînes, NumberFormat pour les cellules.
Le second piège : m veut dire mois, jusqu'à ce que non
Les codes de date et d'heure partagent la lettre m, et cette ambiguïté piège tout le monde au moins une fois :
- Un
"mm"isolé, ce sont des mois :Format(Now, "mm")→06. - Le même
"mm"juste après"hh:"est lu comme des minutes :Format(Now, "hh:mm")→09:05. La proximité de l'heure inverse son sens. - Pour une durée écoulée sans heure à côté,
"mm:ss"donnemois:seconde— presque jamais ce que vous vouliez. Utilisez le jeton minute explicite de VBA,n:Format(t, "nn:ss").
Debug.Print Format(Now, "yyyy-mm-dd hh:mm:ss") ' 2026-06-10 09:05:30 (premier mm = mois, second = minutes)
Debug.Print Format(Now, "mm:ss") ' 06:30 <- MOIS:seconde, la surprise classique
Debug.Print Format(Now, "nn:ss") ' 05:30 <- minutes, le correctif
Les chiffres de remplacement ont leur propre règle, bonne à connaître : 0 force un chiffre (complété par des zéros), # n'affiche un chiffre que s'il est présent. Format(5, "00") → 05 ; Format(5, "##") → 5. C'est ainsi qu'on complète des numéros de facture par des zéros ou qu'on garde un entier propre.
Formats nommés et la fratrie Format*
Vous n'avez pas toujours besoin d'un code personnalisé. VBA fournit des formats nommés et des fonctions sœurs sensibles aux paramètres régionaux :
Debug.Print Format(1234.5, "Currency") ' 1 234,50 € (utilise la monnaie régionale de la machine)
Debug.Print Format(Now, "Short Date") ' 10/06/2026 (ordre régional)
Debug.Print Format(0.75, "Percent") ' 75,00%
Debug.Print FormatCurrency(1234.5, 2) ' 1 234,50 €
Debug.Print FormatNumber(1234.5, 2) ' 1 234,50
Debug.Print FormatPercent(0.75, 1) ' 75,0%
Debug.Print FormatDateTime(Now, vbLongDate) ' mercredi 10 juin 2026
Les formats nommés et la fratrie Format* respectent les paramètres régionaux de la machine — un atout pour l'affichage côté utilisateur et un danger pour des données que vous voulez faire l'aller-retour : "Short Date" est 6/10/2026 aux États-Unis et 10/06/2026 dans la plupart de l'Europe. Quand vous avez besoin d'une chaîne fixe et indépendante de la machine (un nom de fichier, une clé CSV, un horodatage ISO), épelez le code explicitement — "yyyy-mm-dd" — et jamais "Short Date".
Quand utiliser quoi
| Vous voulez… | Utilisez | Pourquoi |
|---|---|---|
| Une chaîne pour un message, un nom de fichier, un libellé | Format(valeur, code) |
La sortie est du texte — exactement ce qu'il faut |
| Une cellule qui s'affiche formatée mais reste numérique | Range.NumberFormat = code |
La valeur reste un nombre ; SOMME/tri/graphiques marchent |
| Une chaîne monétaire/numérique régionale | FormatCurrency / FormatNumber |
Suit les paramètres régionaux |
| Une chaîne de date fixe, indépendante de la machine | Format(d, "yyyy-mm-dd") |
Le code explicite ignore l'ordre régional |
| Reconvertir réellement du texte en nombre/date | CStr / CDate / Val | Format ne va que valeur → texte, jamais l'inverse |
L'avis tranché : si ça atterrit dans une cellule, c'est NumberFormat, pas Format
Voici la ligne que je défends : Format ne devrait presque jamais écrire dans une cellule de données. Quatre-vingt-dix pour cent des tickets « ma SOMME est à zéro » et « mes dates ne se trient pas » remontent à quelqu'un qui a utilisé Format là où il voulait NumberFormat. Les deux se lisent presque pareil dans le code, et c'est exactement pourquoi le bug est si fréquent et si invisible en relecture.
Faites-en donc une habitude à séparation nette. Construire une chaîne — un nom d'onglet, une ligne de journal, un horodatage de fichier, du texte que vous mettez dans une MsgBox ? Format. Faire qu'une cellule ait l'air juste tout en restant un nombre ou une date que le classeur peut calculer ? NumberFormat, valeur intacte. Réussissez cette séparation et toute une catégorie de bugs de données silencieux disparaît. Et souvenez-vous du sens unique : Format ne va que valeur → texte. Pour l'autre sens — du texte qui devrait être un vrai nombre ou une vraie date — il vous faut CStr, CDate et Val, pas Format.
Erreurs Format courantes (et le correctif)
| Symptôme | Cause | Correctif |
|---|---|---|
=SOMME sur la colonne renvoie 0 |
Format() (texte) écrit dans les cellules |
valeur + Range.NumberFormat, pas de Format |
| Les dates ne se trient pas chronologiquement | Cellules en texte formaté, pas en dates | Stocker la vraie date, régler NumberFormat |
mm affiche le mois, pas les minutes |
mm isolé est le mois |
Utiliser nn, ou placer mm après hh |
| La date inverse jour/mois sur un autre PC | "Short Date" (régional) utilisé |
Utiliser un "yyyy-mm-dd" explicite |
| Zéro initial manquant dans un code | # (chiffre optionnel) utilisé |
Utiliser 0 pour forcer le chiffre : "00" |
| Le nombre apparaît en texte après une macro | Résultat de Format affecté à .Value |
Affecter le nombre ; formater via NumberFormat |
Quand le formatage fait la moitié de la macro — décrivez plutôt le résultat
Le formatage n'est jamais le but ; le rapport l'est. Vous vouliez « une feuille mensuelle où les montants s'affichent en euros, les dates en ISO, et les totaux tombent juste » — et vous voilà trois couches plus bas à décider si ce mm est un mois, si cette colonne est du texte ou un nombre, et pourquoi le graphique a sauté une ligne. ExcelMaster Agent vous laisse énoncer le résultat en français courant — « formate la colonne C en monnaie, la colonne A en yyyy-mm-dd, garde-les numériques pour que les totaux marchent » — et écrit du Python qui règle les formats de nombre au lieu de transformer vos données en texte, en sauvegardant d'abord le fichier. Essayer gratuitement →
Guides liés
- VBA Trim — pourquoi il ne supprime pas vos espaces (et le correctif Chr(160))
- VBA CStr, CDate & Val — convertir du texte en nombres et dates correctement
- VBA InStr — trouver du texte dans une chaîne
- VBA Split — transformer une chaîne en tableau
- Boucle For VBA dans Excel — 8 exemples concrets
FAQ
Que fait la fonction Format en VBA ?
Format convertit une valeur en une chaîne formatée à l'aide d'un code — Format(1234.5, "#,##0.00") renvoie le texte "1 234,50". Il change l'apparence de la valeur, pas ce qu'elle est, et le résultat est toujours du texte.
Comment formater une date en VBA ?
Avec un code explicite : Format(Now, "yyyy-mm-dd") donne 2026-06-10 ; Format(Now, "dd/mm/yyyy") donne le jour en premier. Évitez le "Short Date" nommé si la chaîne doit être identique sur chaque machine, car il suit les paramètres régionaux de chaque PC.
Pourquoi mon VBA Format affiche-t-il le mois au lieu des minutes ?
Parce que m veut dire mois par défaut. Un "mm" isolé est le mois ; il ne signifie des minutes que lorsqu'il se trouve juste après "hh:". Pour une durée écoulée, utilisez le jeton minute explicite de VBA : Format(t, "nn:ss").
Pourquoi SOMME renvoie-t-il 0 après que j'ai formaté une colonne en VBA ?
Vous avez presque sûrement écrit des résultats de Format() dans les cellules, ce qui stocke du texte qui n'a l'air que numérique. Stockez le vrai nombre et réglez l'apparence avec Range.NumberFormat = "#,##0.00" à la place — alors SOMME, tri et graphiques refonctionnent.
Quelle est la différence entre Format et NumberFormat en VBA ?
Format renvoie une chaîne de texte ; Range.NumberFormat change la façon dont une cellule s'affiche tandis que la valeur stockée reste un vrai nombre ou une vraie date. Utilisez Format pour construire des chaînes, et NumberFormat pour donner aux cellules la bonne apparence sans casser les calculs.
