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

VBA TextBox dans Excel — pourquoi .Value est toujours du texte (et comment le convertir)

|

VBA TextBox dans Excel — pourquoi .Value est toujours du texte (et comment le convertir)

TL;DR — Un TextBox stocke une seule sorte de chose : du texte. TextBox1.Value vous renvoie toujours une String, même quand l'utilisateur a tapé 42 ou une date. C'est la source de presque tous les bugs de TextBox — de l'arithmétique sur du texte, ou un nombre comparé à une chaîne. Avant de faire un calcul, testez avec IsNumeric et convertissez avec CDbl ou CLng. .Text et .Value sont presque identiques pour une zone de texte ; une boîte vide vaut "", pas 0.

Private Sub cmdAdd_Click()
    ' TextBox1.Value est la STRING "10", pas le nombre 10:
    If IsNumeric(TextBox1.Value) Then
        Dim n As Double
        n = CDbl(TextBox1.Value)        ' maintenant c'est un vrai nombre
        MsgBox n + 5
    Else
        MsgBox "Please enter a number"
    End If
End Sub

Un TextBox est le contrôle le plus simple d'un UserForm — une boîte dans laquelle l'utilisateur tape — et c'est pourtant lui qui cause le plus de confusion, pour une seule raison. Il appartient à la famille des contrôles atteinte via la collection Controls du formulaire : comme tout contrôle, vous parlez à une zone de texte à travers ses propriétés. Mais là où une CheckBox renvoie un Boolean et où une ListBox renvoie l'élément sélectionné, un TextBox renvoie quelque chose de trompeusement simple — une chaîne — et traiter cette chaîne comme le nombre auquel elle ressemble est l'erreur numéro un du TextBox.

Ce que vous allez apprendre

  • Pourquoi TextBox1.Value est toujours une String, quelle que soit son apparence
  • Les deux façons dont l'arithmétique sur .Value échoue
  • Convertir sans risque avec IsNumeric, puis CDbl ou CLng
  • La petite différence entre .Text et .Value
  • Pourquoi une boîte vide vaut "" et non 0, et comment le tester
  • Réagir pendant que l'utilisateur tape, avec les événements Change et Exit

Le modèle mental : un TextBox renvoie toujours du texte

Une zone de texte contient des caractères, rien d'autre. Quand l'utilisateur tape 42, la boîte contient la chaîne de deux caractères "42", pas le nombre 42. Donc TextBox1.Value est une String — à chaque fois, quelle que soit son apparence. Une date tapée comme 31/12/2026 est une chaîne de dix caractères ; un montant 1 250,00 est une chaîne qui contient une virgule. VBA ne lit pas l'intention depuis une zone de texte ; il vous transmet les caractères et vous laisse le sens.

Ce seul fait explique toutes les surprises du TextBox. Si vous ne retenez qu'une chose : tout ce qui sort d'une zone de texte est du texte tant que vous ne l'avez pas converti.

Le piège du nombre : additionner sur .Value échoue de deux façons

Parce que .Value est une chaîne, faire un calcul dessus revient à jouer à pile ou face entre deux échecs :

' Disons que la boite contient 10
MsgBox TextBox1.Value + 5      ' PAS 15

Si VBA traite + comme une concaténation, vous obtenez "105" ; si une valeur ultérieure dans la boîte n'est pas numérique, vous obtenez à la place une erreur d'exécution 13, « Type mismatch ». Même code, deux résultats faux différents, selon ce que l'utilisateur a tapé — exactement le genre de bug qui passe votre test et échoue entre les mains de l'utilisateur. Le correctif consiste à ne jamais faire de calcul directement sur .Value.

Convertir sans risque : IsNumeric, puis CDbl ou CLng

Deux étapes, toujours dans cet ordre. Demandez d'abord si le texte est un nombre avec IsNumeric ; convertissez-le seulement ensuite :

If IsNumeric(TextBox1.Value) Then
    Dim price As Double
    price = CDbl(TextBox1.Value)     ' chaine -> Double
Else
    MsgBox "That is not a number"
    TextBox1.SetFocus                ' le renvoyer pour qu'il corrige
End If

Utilisez CDbl pour tout ce qui a des décimales (prix, taux) et CLng pour les nombres entiers (comptages, identifiants). Sauter le garde-fou IsNumeric et appeler CDbl sur "abc" déclenche la même erreur 13 — le garde-fou n'est donc pas une politesse facultative, c'est ce qui transforme un plantage en message. C'est l'équivalent, pour le TextBox, de la sécurité de type que vous avez abandonnée dès que la valeur est devenue du texte.

.Text contre .Value

Pour une zone de texte, les deux sont presque identiques, et .Value est celle à utiliser par habitude. La distinction qui compte : .Text est toujours la chaîne affichée dans la boîte, tandis que .Value peut être affectée par d'autres propriétés sur des contrôles plus riches. Pour un TextBox simple, les deux renvoient la même chaîne. Préférez .Value pour lire les données, et n'utilisez .Text que lorsque vous avez précisément besoin des caractères affichés — par exemple à l'intérieur d'un événement Change avant que .Value ne se soit stabilisée.

Vide est une chaîne de longueur zéro, pas zéro

Une zone de texte vide vaut "" — une chaîne de longueur zéro — pas 0 et pas Null. Testez-la donc comme du texte :

If Trim(TextBox1.Value) = "" Then
    MsgBox "This field is required"
    Exit Sub
End If

Trim capture aussi une boîte où l'utilisateur n'a tapé que des espaces. Ne testez pas If TextBox1.Value = 0 — cela compare une chaîne à un nombre et vous induit en erreur. Comme le vide est une chaîne, un test de champ obligatoire est un test de chaîne, pas un test numérique — une distinction qui piège les personnes venant de l'InputBox, qui a ses propres règles annulation-contre-vide.

Réagir pendant que l'utilisateur tape : les événements Change et Exit

Deux événements couvrent l'essentiel de la validation en direct. Change se déclenche à chaque frappe — pratique pour un compteur de caractères en direct ou pour activer un bouton OK, mauvais pour un traitement lourd. Exit se déclenche quand l'utilisateur quitte la boîte, et il peut annuler la sortie pour forcer une correction :

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Not IsNumeric(TextBox1.Value) Then
        MsgBox "Enter a number before moving on"
        Cancel = True          ' garder le focus dans la boite
    End If
End Sub

Régler Cancel = True dans Exit est la façon propre de garder l'utilisateur dans un champ jusqu'à ce qu'il soit valide — bien mieux que de laisser une mauvaise valeur se propager dans le reste du formulaire et échouer plus tard. Utilisez Change pour un retour léger à chaque frappe et Exit pour la vraie validation.

Comment ExcelMaster vous aide

Le bug du TextBox est la définition même de « ça marche sur ma machine » : la boîte qui contenait toujours un nombre en test contient une lettre égarée en production, et + 5 devient "105" ou l'erreur 13. Il reste silencieux jusqu'à ce qu'arrive exactement la saisie qui le casse.

ExcelMaster vous laisse dire ce que représente le champ — « c'est un prix, refuse tout ce qui n'est pas un nombre et remets le curseur en place » — et il écrit le garde-fou IsNumeric et la conversion CDbl, avec l'événement Exit déjà câblé, si bien que l'étape chaîne-vers-nombre n'est jamais sautée. Vous gardez le formulaire et le code.

Questions fréquentes

La valeur d'un TextBox VBA est-elle toujours une chaîne ?

Oui. Un TextBox stocke des caractères, donc TextBox1.Value renvoie une String à chaque fois, même quand l'utilisateur a tapé des chiffres ou une date. VBA ne la convertit pas pour vous. Pour l'utiliser comme un nombre, vous devez la convertir vous-même avec CDbl ou CLng, après avoir vérifié qu'elle est bien numérique avec IsNumeric.

Comment obtenir un nombre à partir d'un TextBox VBA ?

Protégez, puis convertissez. Testez IsNumeric(TextBox1.Value) ; si le test passe, appelez CDbl(TextBox1.Value) pour un décimal ou CLng(TextBox1.Value) pour un entier. Appeler CDbl sur du texte non numérique déclenche l'erreur d'exécution 13, donc le test IsNumeric est ce qui transforme un plantage en message convivial.

Quelle est la différence entre .Text et .Value sur un TextBox ?

Pour un TextBox simple, les deux renvoient la même chaîne, et .Value est le choix conventionnel pour lire les données. .Text est toujours les caractères actuellement affichés ; .Value peut différer sur des contrôles plus riches. Utilisez .Value par défaut et .Text seulement quand vous avez précisément besoin de la chaîne affichée, comme à l'intérieur d'un événement Change.

Comment vérifier si un TextBox est vide en VBA ?

Testez-la comme du texte : If Trim(TextBox1.Value) = "" Then. Une boîte vide est une chaîne de longueur zéro, pas 0 ni Null, et Trim capture aussi une boîte ne contenant que des espaces. Ne la comparez pas à 0, ce qui mélange une chaîne avec un nombre et donne des résultats trompeurs.

Comment valider un TextBox pendant que l'utilisateur tape ?

Utilisez l'événement Change pour un retour léger à chaque frappe (un compteur de caractères, activer un bouton) et l'événement Exit pour la vraie validation. Dans Exit, réglez son argument Cancel sur True pour garder le curseur dans la boîte jusqu'à ce que la saisie soit valide, afin qu'une mauvaise valeur n'atteigne jamais le reste du formulaire.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 28/09/2026.

Guides associés : VBA Controls · VBA Frame · VBA UserForm · VBA InputBox · VBA ComboBox · VBA CheckBox · VBA On Error