🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Str dans Excel — le piège de l'espace de tête et pourquoi CStr est presque toujours le bon choix

|

VBA Str dans Excel — le piège de l'espace de tête et pourquoi CStr est presque toujours le bon choix

TL;DRStr transforme 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, Str est aveugle à la locale — il utilise toujours un point décimal ., même sur une machine allemande qui attend une virgule. Cela rend Str excellent 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 » est CStr (pas d'espace, respecte la locale) ou Format (contrôle total). Ne sortez Str que 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 Str ignore vos paramètres régionaux — et quand c'est réellement utile
  • Str contre CStr contre Format — lequel utiliser et quand
  • La paire Str/Val contre la paire CStr/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 (ou Trim) 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 :

  • StrVal — toutes deux aveugles à la locale (toujours .). Val("3.14") vaut 3.14 sur toutes les machines ; Val s'arrête aussi au premier caractère non numérique. Utilisez cette paire pour les E/S de fichiers à format fixe.
  • CStrCDbl — toutes deux conscientes de la locale. CDbl respecte la virgule régionale ; CStr l'é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