TL;DR —
Const VAT_RATE As Double = 0.19le 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 unConstes 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 unEnumen lugar de muchosConstsueltos.
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
Constlo arregla en un solo sitio - Por qué reasignar un
Constes un error de compilación, y por qué es justo lo que quieres - La regla del tiempo de compilación: un
Constpuede ser un literal, no una llamada a función ni el valor de una celda Public Constpara los valores que comparte todo tu proyecto- Cuándo pasar de muchos
Consta un únicoEnum
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
