TL;DR —
Strtransforme un nombre en texte, mais c'est une vieille fonction BASIC qui cache deux pièges. D'abord,Str(42)renvoie" 42"avec un espace de tête (il réserve une colonne pour le signe). Ensuite,Strest aveugle à la locale — il utilise toujours un point décimal., même sur une machine allemande qui attend une virgule. Cela rendStrexcellent pour écrire des fichiers indépendants de la locale, et mauvais pour tout ce qu'un utilisateur voit. Le choix par défaut pour « nombre vers texte » estCStr(pas d'espace, respecte la locale) ouFormat(contrôle total). Ne sortezStrque lorsque vous voulez délibérément un séparateur.fixe — et même alors, la plupart du code ne devrait pas.
Ceci est le pendant de VBA CStr, CDate & Val, qui couvre la
transformation de texte vers nombres et dates. Cet article traite de l'autre sens :
transformer un nombre vers du texte — et plus précisément pourquoi la fonction
Str, d'apparence évidente, est celle que vous devriez généralement éviter.
Ce que vous allez apprendre
- Le piège de l'espace de tête : pourquoi
Str(42)vaut" 42"et ce que cela casse - Pourquoi
Strignore vos paramètres régionaux — et quand c'est réellement utile StrcontreCStrcontreFormat— lequel utiliser et quand- La paire
Str/Valcontre la paireCStr/CDbl
Le modèle mental : Str est une relique avec deux mines
Voyez Str comme un outil d'une ère plus ancienne du BASIC, conçu quand les nombres
s'imprimaient dans des colonnes à largeur fixe. Il se comporte encore ainsi : il
laisse de la place pour un signe moins, et il se moque du pays où vous êtes. Ces deux
comportements avaient du sens en 1985 et surprennent les gens en 2026.
Sub TheTwoLandmines()
Debug.Print "[" & Str(42) & "]" ' -> "[ 42]" espace de tête !
Debug.Print "[" & Str(-42) & "]" ' -> "[-42]" le signe remplit l'emplacement
Debug.Print Str(3.14) ' -> "3.14" toujours un point, quelle que soit la locale
End Sub
Mine 1 : l'espace de tête
Str réserve toujours le premier caractère pour le signe. Les nombres positifs y
reçoivent un espace ; les négatifs reçoivent le -. Ainsi Str(42) fait trois
caractères : espace, 4, 2. Cela casse discrètement trois choses :
Sub LeadingSpaceBreaksThings()
' 1) La concaténation reçoit un espace en trop
Debug.Print "Total: " & Str(42) ' -> "Total: 42" (deux espaces)
' 2) Les comparaisons échouent
Debug.Print (Str(42) = "42") ' -> False (" 42" <> "42")
' 3) Écrit dans une cellule, c'est du texte-avec-espace :
' ça ressemble à un nombre, mais ISNUMBER vaut False et le tri casse
Range("A1").Value = Str(42)
End Sub
Les gens « corrigent » cela avec Trim(Str(n)), ce qui fonctionne mais sent le code
douteux — vous masquez le mauvais choix de fonction. La vraie correction est
d'utiliser une fonction qui n'ajoute jamais l'espace au départ.
Mine 2 : Str est aveugle à la locale
Str émet toujours un . comme séparateur décimal, quels que soient les paramètres
régionaux de Windows. Sur une machine configurée pour l'allemand (qui utilise ,
pour les décimales), Str(3.14) reste "3.14".
C'est le seul endroit où Str justifie son existence. Quand vous écrivez un CSV,
une instruction SQL, du JSON ou tout autre format lisible par une machine, vous
voulez un séparateur . fixe pour que le fichier soit analysé de la même façon
partout. Str vous le donne gratuitement — là où CStr émettrait 3,14 sur une
machine allemande et corromprait votre fichier.
Mais pour tout ce qu'une personne lit, l'aveuglement à la locale est un bug : un
utilisateur allemand attend 3,14, et Str lui affichera 3.14.
La correction : CStr par défaut, Format pour le contrôle
Sub TheRightTools()
' CStr — pas d'espace de tête, respecte la locale de l'utilisateur. Le choix par défaut.
Debug.Print "[" & CStr(42) & "]" ' -> "[42]"
Debug.Print CStr(3.14) ' -> "3,14" sur une machine allemande
' Format — contrôle total sur les chiffres, le remplissage, les séparateurs de milliers
Debug.Print Format(42, "0") ' -> "42"
Debug.Print Format(1234.5, "#,##0.00") ' -> "1,234.50" (ou équivalent selon la locale)
Debug.Print Format(7, "000") ' -> "007"
End Sub
Voici la décision en un tableau que vous pouvez garder en tête :
CStr— nombre → texte pour un usage général. Pas d'espace, conscient de la locale. Votre choix par défaut.Format— quand vous avez besoin de remplissage, de décimales fixes ou de séparateurs de milliers.Str— uniquement quand vous avez précisément besoin d'un.indépendant de la locale pour un fichier ou un protocole, et que vous acceptez (ouTrim) l'espace de tête.
Le jugement, dit clairement : en 2026, un Str() nu dans du nouveau code est
presque toujours soit un bug, soit un cas particulier d'écriture de fichier non
commenté. Si vous voulez dire « donne-moi ce nombre sous forme de texte »,
écrivez CStr. Si vous voulez dire « formate ce nombre », écrivez Format. Gardez
Str pour le cas étroit de la sortie indépendante de la locale, et mettez un
commentaire à côté expliquant pourquoi.
La paire Str/Val contre la paire CStr/CDbl
Ces fonctions vont par paires assorties, conscientes ou non de la locale — les mélanger est la façon dont les allers-retours corrompent silencieusement :
Str↔Val— toutes deux aveugles à la locale (toujours.).Val("3.14")vaut 3.14 sur toutes les machines ;Vals'arrête aussi au premier caractère non numérique. Utilisez cette paire pour les E/S de fichiers à format fixe.CStr↔CDbl— toutes deux conscientes de la locale.CDblrespecte la virgule régionale ;CStrl'émet. Utilisez cette paire pour les allers-retours de valeurs que l'utilisateur voit.
Le bug à éviter est de croiser les paires : écrire avec Str (point) et relire avec
CDbl sur une machine à locale virgule, et le nombre change. Gardez chaque
aller-retour à l'intérieur d'une seule paire.
Comment ExcelMaster aide
Le code VBA de nombre vers texte existe généralement pour construire un export ou
une étiquette — une étiquette de prix, un champ CSV, un numéro de facture
rempli. ExcelMaster génère cela à partir d'une description — « exporte ces
montants en texte avec deux décimales et un ID à zéro de tête » — et obtient la
locale et le remplissage corrects sans que vous ayez à choisir entre Str, CStr
et Format, ni à découvrir l'espace de tête à la dure.
Vous écrirez encore des conversions directement dans les macros. Mais pour le travail « produis cet export formaté », décrire le format vaut mieux que choisir à la main la fonction de conversion.
Questions fréquentes
Quelle est la différence entre Str et CStr en VBA ?
Str ajoute un espace de tête devant les nombres positifs et utilise toujours un
séparateur décimal ., quelle que soit la locale. CStr n'ajoute aucun espace et
respecte les paramètres régionaux de l'utilisateur. Pour une conversion « nombre
vers texte » générale, utilisez CStr ; n'utilisez Str que lorsque vous avez
besoin d'un . indépendant de la locale pour un fichier ou un protocole.
Pourquoi VBA Str met-il un espace devant le nombre ?
Str réserve le premier caractère pour le signe — un espace pour les nombres
positifs, un - pour les négatifs. C'est un héritage de l'impression numérique à
largeur fixe. Pour le supprimer, utilisez soit CStr (qui n'ajoute jamais
l'espace), soit enveloppez-le en Trim(Str(n)), même si CStr est la correction la
plus propre.
VBA Str respecte-t-il le séparateur décimal régional ?
Non. Str émet toujours un ., même sur des machines configurées pour une virgule
décimale (allemand, français, etc.). C'est utile pour écrire des CSV/SQL qui doivent
s'analyser de la même façon partout, mais faux pour des valeurs montrées aux
utilisateurs — utilisez CStr ou Format pour celles-là.
Comment convertir un nombre en chaîne en VBA ?
Utilisez CStr(number) comme choix par défaut — pas d'espace de tête et conscient
de la locale. Utilisez Format(number, "0.00") quand vous avez besoin de décimales,
de remplissage ou de séparateurs de milliers spécifiques. Réservez Str(number) à
la seule sortie de fichier indépendante de la locale.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 14/06/2026.
Guides associés : VBA CStr · VBA Format · VBA Concatenate · VBA UCase & LCase · VBA Trim
