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

VBA Const en Excel — pon nombre a tus números mágicos (y por qué el valor no se desvía)

|

VBA Const en Excel — pon nombre a tus números mágicos (y por qué el valor no se desvía)

TL;DRConst VAT_RATE As Double = 0.19 le da a un valor fijo un nombre que queda bloqueado en tiempo de compilación. Donde una variable es una caja que puedes rellenar de nuevo, una constante es una etiqueta pintada encima: legible en todas partes, repintable en ninguna mientras la macro corre. Esa inmutabilidad es justo el objetivo: convierte un número mágico repartido por ocho fórmulas en una única fuente con autoridad. Intentar reasignar un Const es un error de compilación («Asignación a constante no permitida»), y ese error es la característica, no una limitación. Para una familia de valores fijos relacionados (estados, números de columna), usa un Enum en lugar de muchos Const sueltos.

Const VAT_RATE   As Double = 0.19          ' un solo lugar, una sola verdad
Const MAX_ROWS   As Long = 10000
Const REPORT_TAB As String = "Summary"

Sub ShowRate()
    Debug.Print "VAT is " & VAT_RATE * 100 & "%"   ' -> VAT is 19%
End Sub

Toda macro está llena de valores literales: un tipo impositivo, el número de la fila de encabezados, el nombre de una hoja, un umbral. Escritos en línea, cada uno es un número mágico: un 0.19 o un 7 pelados cuyo significado tienes que adivinar y cuyo valor tienes que perseguir cuando cambia. Const es la cura, y es una de las mejoras de calidad más baratas que le puedes hacer a una macro.

Lo que aprenderás

  • Por qué los números mágicos son una trampa de mantenimiento, y cómo Const lo arregla en un solo sitio
  • Por qué reasignar un Const es un error de compilación, y por qué es justo lo que quieres
  • La regla del tiempo de compilación: un Const puede ser un literal, no una llamada a función ni el valor de una celda
  • Public Const para los valores que comparte todo tu proyecto
  • Cuándo pasar de muchos Const a un único Enum

El modelo mental: una constante es una etiqueta pintada encima, no una caja que rellenas

Una variable y una constante se parecen, pero se comportan de maneras opuestas. Una variable es una caja: metes un valor y luego puedes cambiarlo por otro. Una constante es una etiqueta pintada sobre un valor en el momento en que compilas. Cualquiera puede leer la etiqueta desde cualquier sitio en el que esté en su ámbito, pero nada puede repintarla mientras el código corre. El valor está congelado.

Esa congelación no es una restricción que haya que sortear; es la garantía que estás comprando. Cuando escribes Const VAT_RATE = 0.19, le estás diciendo tanto al compilador como al próximo lector: este número tiene un solo significado, vive en un solo lugar y no va a cambiar a tus espaldas. Todo lo bueno de las constantes nace de esa promesa.

La regla que se gana el sueldo: los números mágicos se desvían, las constantes no

Este es el problema que resuelve Const. Supón que 0.2 —un tipo de IVA— está tecleado directamente en ocho fórmulas distintas repartidas por tus macros:

' Número mágico 0.2 por todas partes — cambiar el tipo obliga a cazar los ocho
gross = net * 1.2
vat   = net * 0.2
' ...seis sitios más, cada uno con un 0.2 pelado...

Ahora el tipo cambia a 0.19. Tienes que encontrar y editar todos. Se te escapa un solo sitio y obtienes un total equivocado en silencio: ningún error, solo números que no cuadran, en un informe sí y en otro no. Y un lector, seis meses después, no tiene ni idea de si ese 0.2 es IVA, un descuento o una comisión.

Una sola constante lo arregla todo:

Const VAT_RATE As Double = 0.19    ' cámbialo aquí, una vez, y se actualizan todos los sitios

gross = net * (1 + VAT_RATE)
vat   = net * VAT_RATE

El valor vive en un único lugar, el nombre documenta su significado y un cambio de tipo es una edición de una línea que no puede quedarse a medias. Todo literal que aparezca más de una vez, o cuyo significado no sea obvio por el contexto, debería ser un Const.

La regla que en realidad es una característica: no puedes asignar a un Const

Intenta cambiar una constante y VBA se niega, en tiempo de compilación, antes incluso de que la macro se ejecute:

Const TAX As Double = 0.2

Sub Oops()
    TAX = 0.25       ' Error de compilación: Asignación a constante no permitida
End Sub

Los principiantes a veces leen ese error como que VBA se pone difícil. Es lo contrario: es el compilador garantizando que el valor nunca cambia, que es toda la razón por la que declaraste una constante. Si te descubres queriendo reasignarla, es que nunca fue de verdad una constante: es una variable que cambia en tiempo de ejecución, así que declárala con Dim. La distinción es toda la decisión: ¿cambia este valor mientras la macro corre? Si es que sí, Dim. Si es que no, Const.

La regla que sorprende a la gente: Const se evalúa en tiempo de compilación

Como la etiqueta se pinta cuando compilas, una constante solo puede fijarse a algo que el compilador ya conozca: un literal o una expresión construida a partir de otras constantes. No puede ser una llamada a función, un valor de la hoja ni nada que se calcule mientras la macro corre.

' FUNCIONA — literal, o expresión de literales u otras constantes
Const PI       As Double = 3.14159
Const TWO_PI   As Double = 2 * PI
Const HEADER   As String = "Report — " & "2026"

' FALLA — necesita evaluación en tiempo de ejecución, así que debe ser una variable
Const TODAY    As Date = Date          ' Error de compilación: no es una constante
Const RATE     As Double = Range("A1").Value   ' Error de compilación

Si el valor solo puede conocerse mientras la macro corre —la fecha de hoy, el contenido actual de una celda, el resultado de una función—, corresponde a una variable Dim que asignas en tiempo de ejecución, no a un Const.

Ámbito: Const local frente a Public Const

Un Const sigue las mismas reglas de ámbito que un Dim. Escrito dentro de un Sub, es local a ese procedimiento. Escrito en la parte superior de un módulo con Public, pasa a ser una constante de todo el proyecto que cualquier módulo puede leer:

' En un módulo llamado "Config", por encima de cualquier procedimiento:
Public Const APP_NAME    As String = "Monthly Close"
Public Const DATA_SHEET  As String = "Raw"
Public Const HEADER_ROW  As Long = 1

El patrón que escala es un único módulo Config que contenga cada constante de alcance global —nombres de hojas, umbrales, el título de la app—, de modo que haya exactamente un sitio donde mirar cuando algo tenga que cambiar. Mantén locales las constantes propias de un procedimiento; asciende solo las que de verdad se comparten.

Cuando un solo valor no basta: usa Enum para una familia

Cuando tienes un grupo de constantes relacionadas —estados de pedido, posiciones de columna, tipos de informe—, un montón de Const sueltos funciona pero se lee mal. Un Enum los nombra como conjunto, los agrupa bajo un mismo tipo y te da IntelliSense y una comprobación de tipos ligera:

Enum OrderStatus
    Pending = 1
    Paid = 2
    Shipped = 3
    Cancelled = 4
End Enum

Sub Demo()
    Dim s As OrderStatus
    s = Paid
    If s = Cancelled Then Exit Sub
End Sub

La regla general: Const para un valor suelto; Enum para una familia de valores relacionados que van juntos. Un Enum además transmite intención: un parámetro tipado As OrderStatus le dice al lector (y al editor) exactamente qué valores son válidos.

Cómo ayuda ExcelMaster

Las constantes, la disciplina de ámbito y los Enum son los hábitos que mantienen manejable una macro a medida que crece, y son una carga que arrastras en cada proyecto, mucho antes de llegar a la lógica que de verdad te importa.

ExcelMaster te deja enunciar la regla en vez de montar la fontanería: «aplica un 19 % de IVA a la columna D, marca todo lo que esté en estado Cancelado, escribe el total en la hoja Resumen». Lo convierte en lógica funcional con el tipo y los valores de estado en un solo lugar, de modo que un cambio es un cambio en la descripción, no una cacería por ocho fórmulas. Seguirás declarando Const en macros escritas a mano donde quieras el control; para la tarea cotidiana, describir la regla gana a mantener los números mágicos que hay detrás.

Preguntas frecuentes

¿Qué es una constante en VBA?

Una constante es un valor con nombre que queda fijado en tiempo de compilación y no puede cambiar mientras la macro corre. Se declara con Const, p. ej. Const VAT_RATE As Double = 0.19. Sustituye un «número mágico» disperso por una única fuente con nombre, de modo que el valor vive en un solo lugar y su significado queda documentado por su nombre.

¿Cuál es la diferencia entre Const y Dim?

Dim declara una variable: una caja cuyo valor puedes cambiar en tiempo de ejecución. Const declara una constante: un valor bloqueado en tiempo de compilación que no se puede reasignar. Usa Const para cualquier cosa que nunca cambie mientras la macro corre (un tipo, el nombre de una hoja, un umbral) y Dim para cualquier cosa que sí cambie.

¿Puedo cambiar un Const en tiempo de ejecución?

No. Asignar un valor nuevo a una constante es un error de compilación («Asignación a constante no permitida»), y esa garantía es la razón para usarla. Si un valor tiene que cambiar mientras la macro corre, no es una constante: decláralo con Dim como variable.

¿Por qué falla Const x = Range("A1").Value?

Como un Const se evalúa en tiempo de compilación, solo puede fijarse a un literal o a una expresión de otras constantes, nunca a algo calculado en tiempo de ejecución, como el valor de una celda, el resultado de una función o Date. Para eso, usa una variable Dim que asignes mientras la macro corre.

¿Qué es Enum en VBA y cuándo debo usarlo en lugar de Const?

Un Enum define una familia de constantes con nombre relacionadas bajo un mismo tipo, p. ej. estados de pedido o números de columna. Usa varios Const para valores sueltos, pero echa mano de un Enum cuando los valores van juntos como conjunto: los agrupa, habilita IntelliSense y te deja tipar un parámetro As con ese enum para documentar qué valores son válidos.

Probado en

Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 31/07/2026.

Guías relacionadas: VBA Dim · VBA Data Types · VBA Sub · VBA Function · VBA If Then Else