TL;DR — Un TextBox stocke une seule sorte de chose : du texte.
TextBox1.Valuevous renvoie toujours uneString, même quand l'utilisateur a tapé42ou 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 avecIsNumericet convertissez avecCDblouCLng..Textet.Valuesont presque identiques pour une zone de texte ; une boîte vide vaut"", pas0.
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.Valueest toujours uneString, quelle que soit son apparence - Les deux façons dont l'arithmétique sur
.Valueéchoue - Convertir sans risque avec
IsNumeric, puisCDblouCLng - La petite différence entre
.Textet.Value - Pourquoi une boîte vide vaut
""et non0, et comment le tester - Réagir pendant que l'utilisateur tape, avec les événements
ChangeetExit
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
