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

VBA Value vs Value2 vs Text en Excel — cuál lee la celda correctamente

|

VBA Value vs Value2 vs Text en Excel — cuál lee la celda correctamente

TL;DR — Una celda tiene tres caras de lectura. .Value2 es el número guardado en bruto (una fecha vuelve como su serial 46261, sin conversión — la más rápida). .Value es ese número convertido a un tipo de VBA — un Date para una celda de fecha, un Currency para una celda de moneda (que puede redondear números muy grandes). .Text es la cadena mostrada"$1,235", o "###" si la columna es demasiado estrecha — y es de solo lectura. Para hacer cuentas, lee .Value2. Leer .Text para 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 — .Text es una cadena de visualización, no el valor, y es de solo lectura
  • .Value frente a .Value2 — dónde la conversión a Currency y Date cambia el número
  • Por qué .Value2 es el valor por defecto rápido y sin pérdidas para lecturas masivas
  • Fechas: un Date desde .Value, un Double serial 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 un Double, el texto es un String, 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, .Value devuelve un Date; si está formateada como moneda, .Value devuelve un Currency. 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 un String, 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:

  • .Formula es la receta — la fórmula viva, escrita en el dialecto neutral de inglés de EE. UU. (VBA Formula).
  • .Value es la respuesta con tipo — el número convertido a un Date o un Currency cuando la celda está formateada así; úsala cuando quieres ese tipo, sabiendo que Currency redondea más allá de cuatro decimales.
  • .Value2 es la respuesta en bruto — un Double o un String simple, las fechas como seriales; el valor por defecto rápido y sin pérdidas para leer y para matrices masivas.
  • .Text es 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