TL;DR — Une cellule a trois visages de lecture.
.Value2est le nombre stocké brut (une date revient sous son numéro de série46261, sans conversion — le plus rapide)..Valueest ce nombre converti vers un type VBA — unDatepour une cellule de date, unCurrencypour une cellule monétaire (qui peut arrondir de très grands nombres)..Textest la chaîne affichée —"$1,235", ou"###"si la colonne est trop étroite — et elle est en lecture seule. Pour les calculs, lisez.Value2. Lire.Textpour obtenir un nombre est le grand bug silencieux classique.
' la cellule A1 contient 1234.5, au format monetaire "$#,##0"
Debug.Print Range("A1").Value2 ' 1234.5 - le nombre brut
Debug.Print Range("A1").Value ' 1234.5 - ici un Currency, converti
Debug.Print Range("A1").Text ' "$1,235" - la chaine affichee (arrondie, lecture seule)
Tout le monde apprend .Value en premier et suppose que c'est la valeur de la cellule. C'en est une
sur trois, et l'idée sur laquelle repose ce guide, c'est qu'une cellule a plusieurs visages, et chacun
répond à une question différente : .Value2 demande « quel nombre est stocké », .Value demande
« quel nombre, typé comme VBA le voit », et .Text demande « qu'est-ce qui est peint à l'écran ».
Tournez-vous vers le mauvais visage et rien n'échoue — vous obtenez juste, sans bruit, la mauvaise
réponse. Gardez les trois distincts et toute une famille de bugs « mes nombres sont faux » disparaît.
Ce que vous allez apprendre
- Le modèle mental — trois visages de lecture, classés selon combien Excel remanie la réponse
- La règle la plus importante —
.Textest une chaîne d'affichage, pas la valeur, et elle est en lecture seule .Valueface à.Value2— là où la conversion Currency et Date change le nombre- Pourquoi
.Value2est le choix par défaut, rapide et sans perte, pour les lectures en masse - Les dates : un
Datedepuis.Value, unDoublede série depuis.Value2 - Vers quel visage se tourner, à chaque fois
Le modèle mental : trois visages, du brut à l'affiché
Classez les trois selon combien Excel traite le nombre stocké avant de vous le remettre :
.Value2— le nombre exactement tel qu'il est stocké. Aucune conversion de type : un nombre entier est unDouble, du texte est uneString, et une date est son numéro de série sous-jacent (46261, pas une date). C'est ce qui se rapproche le plus de « ce qu'il y a vraiment dans la cellule »..Value— le nombre stocké converti vers un type VBA correspondant. Si la cellule est au format date,.Valuerenvoie unDate; si elle est au format monétaire,.Valuerenvoie unCurrency. Le nombre est le même dans la plupart des cas, mais son type VBA — et parfois sa précision — ne l'est pas..Text— la chaîne affichée : la valeur passée par le format de nombre de la cellule, exactement comme elle apparaît à l'écran."$1,235","12.3%","1-Jan-2026", ou"###"si la colonne est trop étroite. Toujours uneString, toujours en lecture seule.
Les trois ne sont pas interchangeables ; ils répondent à trois questions différentes. Tout ce qui suit découle de la question que vous vouliez réellement poser.
La règle la plus importante : .Text est l'affichage, pas la valeur
C'est celle qui produit des bugs que vous ne pouvez pas reproduire, car ils dépendent de la mise en
forme et de la largeur de colonne. .Text vous donne ce que l'écran montre, passé par le format de
nombre de la cellule :
' A1 contient 1234.5, au format "$#,##0"
Dim n As Double
n = Range("A1").Text ' n recoit "$1,235" converti -> soit une erreur de type, soit 1235
Deux choses ont mal tourné. Le signe dollar et la virgule en font une chaîne, pas un nombre, si bien
que l'arithmétique casse ou déclenche une erreur. Et le format a arrondi 1234.5 en 1,235, donc
même en retirant les symboles, vous avez perdu le .5. Pire, si la colonne est trop étroite pour montrer
le nombre, .Text renvoie littéralement "###" — de sorte que le même code exact lit une valeur
exploitable sur votre écran et du charabia sur celui, plus étroit, d'un utilisateur. Et comme .Text est
en lecture seule, Range("A1").Text = "5" déclenche une erreur — vous ne pouvez pas écrire à
travers. La règle est brutale : ne lisez jamais .Text pour obtenir un nombre. N'utilisez .Text
que lorsque vous voulez vraiment la chaîne mise en forme que voit un humain — pour un libellé de rapport
ou une ligne de journal — et jamais pour un calcul.
.Value face à .Value2 : là où la conversion change le nombre
.Value et .Value2 renvoient le même nombre pour des données ordinaires. Ils divergent sur deux
formats : la monnaie et les dates.
Pour une cellule au format monétaire, .Value renvoie le type de données Currency, qui contient
15 chiffres avec exactement 4 décimales. C'est parfait pour l'argent et cela évite le flottement de la
virgule flottante — mais un nombre à plus de quatre décimales, ou au-delà de la plage du Currency, est
arrondi ou déborde :
' A1 contient 1234567.891234, au format monetaire
Debug.Print Range("A1").Value ' 1234567.8912 - Currency, la queue au-dela de 4 decimales a disparu
Debug.Print Range("A1").Value2 ' 1234567.891234 - Double complet, rien de perdu
La leçon n'est pas que l'un a raison et l'autre tort — c'est qu'ils répondent à des besoins différents.
Si vous manipulez de l'argent et voulez une arithmétique exacte à 4 décimales, .Value (Currency)
est le visage le plus sûr. Si vous lisez une mesure brute ou tout nombre dont vous ne devez pas perdre la
précision, c'est .Value2 (Double). Le bug silencieux, c'est de se tourner vers .Value sur un nombre
de haute précision et d'en laisser tomber la queue sans bruit.
Pourquoi .Value2 est le choix par défaut, rapide et sans perte
Parce que .Value2 ne fait aucune conversion, c'est à la fois la lecture la plus rapide et celle qui
ne vous surprend jamais avec un type. Pour les lectures en masse dans un tableau — le motif de
performance de VBA Cell Value — .Value2 est le choix par défaut des
professionnels :
Dim arr As Variant
arr = Range("A1:Z100000").Value2 ' Doubles et Strings bruts - le plus rapide, sans conversion Date/Currency
Vous obtenez de simples Double et String sans typage Date ou Currency caché à démêler, et la
lecture est marginalement plus rapide sur les grandes plages. La contrepartie, c'est que les dates
arrivent sous forme de numéros de série ; donc si vos données sont des dates et que vous les voulez
typées Date, utilisez .Value. Sinon, prenez .Value2 par défaut pour lire, et ne montez à
.Value que lorsque vous avez précisément besoin du typage Date ou Currency.
Les dates : un Date depuis .Value, un numéro de série depuis .Value2
Les dates sont là où la séparation .Value / .Value2 mord le plus fort :
' A1 contient la date 2026-08-31
Debug.Print Range("A1").Value ' 2026-08-31 - une vraie valeur Date
Debug.Print Range("A1").Value2 ' 46265 - le numero de serie en dessous
Si vous lisez une colonne de dates avec .Value2 puis y faites du « calcul de dates », vous faites en
réalité de l'arithmétique sur des numéros de série — ce qui est très bien si vous le savez, et déroutant
sinon (+1 fait un jour, mais la valeur s'affiche comme 46266, pas comme une date). Si vous voulez que
VBA traite la cellule comme une date, lisez .Value ; si vous faites transiter des nombres bruts que
vous formaterez plus tard, .Value2 est plus propre. C'est la même idée sous-jacente de
Double-avec-un-masque derrière VBA Now, Date & Time et
VBA DateAdd.
Le verdict honnête : une cellule, quatre visages, choisir à dessein
Une cellule n'est pas une valeur unique. Vous la lisez et l'écrivez à travers quatre visages, et choisir délibérément est tout le savoir-faire :
.Formulaest la recette — la formule vivante, écrite dans le dialecte anglais américain neutre (VBA Formula)..Valueest la réponse typée — le nombre converti enDateouCurrencyquand la cellule est formatée ainsi ; utilisez-le quand vous voulez ce typage, en sachant que Currency arrondit au-delà de quatre décimales..Value2est la réponse brute — un simpleDoubleouString, les dates en série ; le choix par défaut, rapide et sans perte, pour la lecture et pour les tableaux en masse..Textest ce qui est à l'écran — une chaîne mise en forme, en lecture seule ; pour l'affichage seulement, jamais pour un calcul, et jamais fiable quand une colonne peut être trop étroite.
Lisez le mauvais et le bug est silencieux : .Value arrondit l'argent au-delà de quatre décimales sans
bruit, .Text vous rend "###" ou "$1,235" au lieu d'un nombre, et .Formula rejette un nom de
fonction localisé. Sachez quel visage vous vouliez, et la cellule cesse de vous mentir.
Comment ExcelMaster aide
Les bugs de visage de valeur sont ceux qui ne lèvent jamais d'erreur : de l'argent arrondi par une
conversion Currency, une date lue comme une série et charcutée par un « calcul de dates », une lecture
.Text qui a renvoyé "###" sur l'écran plus étroit de quelqu'un d'autre. Ils passent chaque test sur
votre machine et échouent sans bruit sur des données réelles.
ExcelMaster lit chaque cellule à
travers le bon visage. Demandez-lui de « sommer les montants bruts » et il lit .Value2 pour des Doubles
sans perte ; demandez « les totaux de factures en tant qu'argent » et il utilise .Value pour le typage
Currency ; demandez « le libellé exactement tel qu'affiché » et il prend .Text — et n'utilise jamais
.Text pour un calcul. Il sait que les dates reviennent en série depuis .Value2 et en Date depuis
.Value, et il choisit en conséquence. Vous décrivez à quoi sert le nombre ; il lit le visage qui le
garde correct.
Questions fréquentes
Quelle est la différence entre Value et Value2 en VBA ?
.Value2 renvoie le nombre stocké brut sans aucune conversion de type — une date revient sous son
Double de série, une cellule monétaire sous un simple Double. .Value renvoie le même nombre
converti vers un type VBA correspondant : un Date pour une cellule au format date, un Currency pour
une cellule au format monétaire. Ils s'accordent pour les nombres ordinaires, mais .Value peut arrondir
une valeur monétaire de haute précision à quatre décimales, tandis que .Value2 garde le Double complet.
Faut-il utiliser Value ou Value2 en VBA Excel ?
Prenez .Value2 par défaut pour lire : c'est le plus rapide et il ne vous surprend jamais avec un typage
Date ou Currency ni une perte de précision, ce qui le rend idéal pour les lectures en masse dans un
tableau. Utilisez .Value quand vous voulez précisément la cellule typée en Date ou une arithmétique
Currency pour l'argent. Évitez .Text pour toute valeur avec laquelle vous allez calculer — il renvoie
une chaîne mise en forme et en lecture seule.
Pourquoi ne faut-il pas utiliser .Text pour lire la valeur d'une cellule ?
.Text renvoie la chaîne affichée à l'écran, passée par le format de nombre de la cellule — donc une
cellule monétaire se lit "$1,235" (une chaîne, et arrondie), un pourcentage "12%", et une colonne
trop étroite littéralement "###". Cela fait échouer le calcul ou produire de mauvais résultats, et le
cas "###" signifie que le même code marche sur votre écran et casse sur un plus étroit. .Text est
aussi en lecture seule, vous ne pouvez donc pas lui affecter de valeur. Lisez .Value2 ou .Value pour
les nombres, et n'utilisez .Text que pour l'affichage.
Pourquoi ma date VBA revient-elle sous forme de nombre ?
Vous l'avez lue avec .Value2, qui renvoie le Double de série brut sous la date (par exemple 46265)
plutôt qu'un Date. Excel stocke les dates sous forme de numéros de série, et .Value2 vous donne ce
nombre sans conversion. Pour obtenir une vraie valeur Date, lisez plutôt .Value ; n'utilisez
.Value2 que lorsque vous voulez le numéro de série, par exemple pour des lectures en masse rapides que
vous formaterez plus tard.
Peut-on définir la valeur d'une cellule avec .Text en VBA ?
Non. .Text est en lecture seule — il rapporte la chaîne mise en forme affichée à l'écran, et lui
affecter une valeur, comme Range("A1").Text = "5", déclenche une erreur. Pour écrire une cellule,
affectez à .Value (ou .Value2), et contrôlez son apparence avec le format de nombre de la cellule
plutôt qu'en écrivant une chaîne mise en forme.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 31/08/2026.
Guides connexes : VBA Cell Value · VBA Formula · VBA Number Format · VBA Now, Date & Time · VBA Format
