TL;DR — Una celda tiene tres caras de lectura.
.Value2es el número guardado en bruto (una fecha vuelve como su serial46261, sin conversión — la más rápida)..Valuees ese número convertido a un tipo de VBA — unDatepara una celda de fecha, unCurrencypara una celda de moneda (que puede redondear números muy grandes)..Textes la cadena mostrada —"$1,235", o"###"si la columna es demasiado estrecha — y es de solo lectura. Para hacer cuentas, lee.Value2. Leer.Textpara obtener un número es el clásico error silencioso.
' la celda A1 contiene 1234.5, con formato de moneda "$#,##0"
Debug.Print Range("A1").Value2 ' 1234.5 - el numero en bruto
Debug.Print Range("A1").Value ' 1234.5 - aqui un Currency, convertido
Debug.Print Range("A1").Text ' "$1,235" - la cadena mostrada (redondeada, solo lectura)
Todo el mundo aprende .Value primero y da por hecho que es el valor de la celda. Es uno de tres, y la
idea sobre la que se construye esta guía es que una celda tiene varias caras y cada una responde a una
pregunta distinta: .Value2 pregunta «qué número hay guardado», .Value pregunta «qué número, con el
tipo que VBA le ve», y .Text pregunta «qué se pinta en pantalla». Echa mano de la cara equivocada y nada
da error — simplemente obtienes en silencio la respuesta incorrecta. Mantén las tres separadas y desaparece
toda una familia de bugs del tipo «mis números no salen».
Lo que aprenderás
- El modelo mental — tres caras de lectura, ordenadas por cuánto masajea Excel la respuesta
- La regla más importante —
.Textes una cadena de visualización, no el valor, y es de solo lectura .Valuefrente a.Value2— dónde la conversión a Currency y Date cambia el número- Por qué
.Value2es el valor por defecto rápido y sin pérdidas para lecturas masivas - Fechas: un
Datedesde.Value, unDoubleserial desde.Value2 - Qué cara elegir, en cada caso
El modelo mental: tres caras, de lo bruto a lo mostrado
Ordena las tres por cuánto procesa Excel el número guardado antes de entregártelo:
.Value2— el número exactamente como está guardado. Sin conversión de tipo alguna: un número entero es unDouble, el texto es unString, y una fecha es su número de serie subyacente (46261, no una fecha). Es lo más cercano a «lo que hay de verdad en la celda»..Value— el número guardado convertido al tipo de VBA que corresponde. Si la celda está formateada como fecha,.Valuedevuelve unDate; si está formateada como moneda,.Valuedevuelve unCurrency. El número es el mismo en la mayoría de los casos, pero su tipo de VBA — y a veces su precisión — no lo es..Text— la cadena mostrada: el valor pasado por el formato de número de la celda, tal y como aparece en pantalla."$1,235","12.3%","1-Jan-2026", o"###"si la columna es demasiado estrecha. Siempre unString, siempre de solo lectura.
Las tres no son intercambiables; responden a tres preguntas distintas. Todo lo de abajo es consecuencia de qué pregunta querías hacer en realidad.
La regla más importante: .Text es la visualización, no el valor
Esta es la que produce bugs que no puedes reproducir, porque dependen del formato y del ancho de columna.
.Text te da lo que muestra la pantalla, pasado por el formato de número de la celda:
' A1 contiene 1234.5, con formato "$#,##0"
Dim n As Double
n = Range("A1").Text ' n recibe "$1,235" convertido -> o un error de tipos o 1235
Dos cosas salieron mal. El signo de dólar y la coma lo convierten en una cadena, no en un número, así
que la aritmética se rompe o lanza un error. Y el formato redondeó 1234.5 a 1,235, así que aunque
quites los símbolos has perdido el .5. Peor aún, si la columna es demasiado estrecha para mostrar el
número, .Text devuelve literalmente "###" — así que el mismísimo código lee un valor utilizable en tu
pantalla y basura en la de un usuario con la columna más estrecha. Y como .Text es de solo lectura,
Range("A1").Text = "5" lanza un error — no puedes escribir a través de él. La regla es tajante: nunca
leas .Text para obtener un número. Usa .Text solo cuando de verdad quieres la cadena con formato que
ve una persona — para una etiqueta de informe o una línea de registro — y nunca para hacer cálculos.
.Value frente a .Value2: dónde la conversión cambia el número
.Value y .Value2 devuelven el mismo número para datos corrientes. Divergen en dos formatos: moneda
y fechas.
Para una celda con formato de moneda, .Value devuelve el tipo de datos Currency, que guarda 15
dígitos con exactamente 4 decimales. Eso es perfecto para el dinero y evita el temblor del punto flotante —
pero un número con más de cuatro decimales, o uno fuera del rango de Currency, se redondea o desborda:
' A1 contiene 1234567.891234, con formato de moneda
Debug.Print Range("A1").Value ' 1234567.8912 - Currency, la cola mas alla de 4 decimales se pierde
Debug.Print Range("A1").Value2 ' 1234567.891234 - Double completo, no se pierde nada
La lección no es que uno esté bien y el otro mal — es que responden a necesidades distintas. Si manejas
dinero y quieres aritmética exacta de 4 decimales, .Value (Currency) es la cara más segura. Si lees
una medición en bruto o cualquier número donde no puedes perder precisión, lo es .Value2 (Double). El
error silencioso es echar mano de .Value en un número de alta precisión y descartar la cola sin darte
cuenta.
Por qué .Value2 es el valor por defecto rápido y sin pérdidas
Como .Value2 no hace ninguna conversión, es a la vez la lectura más rápida y la que nunca te
sorprende con un tipo. Para lecturas masivas en una matriz — el patrón de rendimiento de
VBA Cell Value — .Value2 es el valor por defecto al que echan mano los
profesionales:
Dim arr As Variant
arr = Range("A1:Z100000").Value2 ' Doubles y Strings en bruto - lo mas rapido, sin conversion Date/Currency
Obtienes Double y String simples, sin ningún tipo Date o Currency oculto sobre el que razonar, y la
lectura es algo más rápida en rangos grandes. La contrapartida es que las fechas llegan como números de
serie, así que si tus datos son fechas y las quieres con el tipo Date, usa .Value. Si no, usa
.Value2 por defecto para leer, y sube a .Value solo cuando necesitas específicamente el tipo Date o
Currency.
Fechas: un Date desde .Value, un serial desde .Value2
Las fechas son donde la división entre .Value y .Value2 muerde más fuerte:
' A1 contiene la fecha 2026-08-31
Debug.Print Range("A1").Value ' 2026-08-31 - un valor Date real
Debug.Print Range("A1").Value2 ' 46265 - el numero de serie de debajo
Si lees una columna de fechas con .Value2 y luego haces «matemáticas de fechas» sobre ella, en realidad
estás haciendo aritmética con números de serie — lo cual está bien si lo sabes, y es desconcertante si no
(+1 es un día, pero el valor se imprime como 46266, no como una fecha). Si quieres que VBA trate la
celda como una fecha, lee .Value; si estás moviendo números en bruto de ida y vuelta y darás formato más
tarde, .Value2 es más limpio. Es la misma idea de fondo del Double-con-máscara que hay detrás de
VBA Now, Date & Time y VBA DateAdd.
El veredicto honesto: una celda, cuatro caras, elige a propósito
Una celda no es un único valor. La lees y la escribes a través de cuatro caras, y elegir a conciencia es toda la habilidad:
.Formulaes la receta — la fórmula viva, escrita en el dialecto neutral de inglés de EE. UU. (VBA Formula)..Valuees la respuesta con tipo — el número convertido a unDateo unCurrencycuando la celda está formateada así; úsala cuando quieres ese tipo, sabiendo que Currency redondea más allá de cuatro decimales..Value2es la respuesta en bruto — unDoubleo unStringsimple, las fechas como seriales; el valor por defecto rápido y sin pérdidas para leer y para matrices masivas..Textes lo que hay en pantalla — una cadena con formato y de solo lectura; solo para visualización, nunca para cálculos, y nunca fiable cuando una columna podría ser demasiado estrecha.
Lee la equivocada y el bug es silencioso: .Value redondea el dinero más allá de cuatro decimales sin
avisar, .Text te entrega "###" o "$1,235" en lugar de un número, y .Formula rechaza un nombre de
función localizado. Sabe qué cara querías, y la celda deja de mentirte.
Cómo ayuda ExcelMaster
Los bugs de la cara del valor son los que nunca lanzan un error: dinero redondeado por una conversión a
Currency, una fecha leída como serial y destrozada por las «matemáticas de fechas», una lectura de .Text
que devolvió "###" en la pantalla más estrecha de otra persona. Pasan todas las pruebas en tu máquina y
fallan en silencio con datos reales.
ExcelMaster lee cada celda a través de
la cara correcta. Pídele «suma los importes en bruto» y lee .Value2 para obtener Doubles sin pérdidas;
pídele «los totales de las facturas como dinero» y usa .Value para el tipo Currency; pídele «la etiqueta
exactamente como se muestra» y toma .Text — y nunca usa .Text para la aritmética. Sabe que las fechas
vuelven como seriales desde .Value2 y como Date desde .Value, y elige en consecuencia. Tú describes
para qué sirve el número; él lee la cara que lo mantiene correcto.
Preguntas frecuentes
¿Cuál es la diferencia entre Value y Value2 en VBA?
.Value2 devuelve el número guardado en bruto sin conversión de tipo — una fecha vuelve como su Double
serial, una celda de moneda como un Double simple. .Value devuelve el mismo número convertido al tipo
de VBA que corresponde: un Date para una celda con formato de fecha, un Currency para una celda con
formato de moneda. Coinciden para los números corrientes, pero .Value puede redondear un valor de moneda
de alta precisión a cuatro decimales, mientras que .Value2 conserva el Double completo.
¿Debo usar Value o Value2 en Excel VBA?
Usa .Value2 por defecto para leer: es la más rápida y nunca te sorprende con el tipo Date o Currency
ni con pérdida de precisión, lo que la hace ideal para lecturas masivas en una matriz. Usa .Value cuando
quieres específicamente la celda con el tipo Date o quieres aritmética Currency para el dinero. Evita
.Text para cualquier valor con el que vayas a calcular — devuelve una cadena con formato y de solo
lectura.
¿Por qué no debo usar .Text para leer el valor de una celda?
.Text devuelve la cadena que se muestra en pantalla, pasada por el formato de número de la celda — así
que una celda de moneda se lee como "$1,235" (una cadena, y redondeada), un porcentaje como "12%", y
una columna demasiado estrecha literalmente como "###". Eso hace que la aritmética falle o produzca
resultados erróneos, y el caso de "###" significa que el mismo código funciona en tu pantalla y se rompe
en una más estrecha. .Text es además de solo lectura, así que no puedes asignarle nada. Lee .Value2 o
.Value para los números, y usa .Text solo para visualización.
¿Por qué mi fecha de VBA vuelve como un número?
La leíste con .Value2, que devuelve el Double serial en bruto que hay bajo la fecha (por ejemplo
46265) en lugar de un Date. Excel guarda las fechas como números de serie, y .Value2 te da ese número
sin conversión. Para obtener un valor Date real, lee .Value en su lugar; usa .Value2 solo cuando
quieres el número de serie, por ejemplo para lecturas masivas rápidas a las que darás formato más tarde.
¿Puedo asignar el valor de una celda con .Text en VBA?
No. .Text es de solo lectura — informa de la cadena con formato que se muestra en pantalla, y asignarle
algo, como Range("A1").Text = "5", lanza un error. Para escribir una celda, asigna a .Value (o
.Value2), y controla cómo aparece con el formato de número de la celda en lugar de escribir una cadena ya
formateada.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 31/08/2026.
Guías relacionadas: VBA Cell Value · VBA Formula · VBA Number Format · VBA Now, Date & Time · VBA Format
