TL;DR —
Dim name As Typereserva una caja con nombre y fija su forma antes de que la uses:Dim total As Long. En VBA declarar es opcional, y ahí está justo el problema. Sin declarar, un solo nombre de variable mal escrito se convierte en silencio en unVariantvacío recién creado, tu total se queda en0y no salta ningún error. PonOption Expliciten la primerísima línea de cada módulo. Te obliga a declarar todas las variables, así que una errata pasa a ser un error de compilación («Variable no definida») en lugar de un resultado equivocado. Es la línea con mayor rentabilidad de todo el lenguaje.
Option Explicit ' <- ponlo al principio de CADA módulo
Sub Demo()
Dim total As Long ' reserva una caja de números enteros llamada "total"
Dim name As String ' reserva una caja de texto llamada "name"
total = 10 + 5
name = "Invoice"
Debug.Print name, total ' -> Invoice 15
End Sub
Toda macro empieza poniendo nombre a las cosas con las que va a trabajar: un
contador de filas, una hoja, una suma acumulada. Dim es la forma de hacerlo.
Parece puro papeleo, pero saltárselo (o hacerlo a la ligera) está detrás de toda
una categoría de errores que no producen ningún error visible: los peores,
porque la macro llega hasta el final y te entrega, muy segura de sí misma, un
número equivocado.
Lo que aprenderás
- Qué hace
Dimen realidad: reservar una caja con nombre y fijar su forma - Por qué
Option Explicitconvierte las erratas silenciosas en ruidosos errores de compilación - La trampa de
Dim a, b As Long, que dejaacomoVariant, no comoLong - Cuándo un
=a secas no basta y necesitasSet(objetos) - Dónde declaras una variable decide quién la ve y cuánto vive
El modelo mental: Dim reserva una caja etiquetada antes de llenarla
Piensa en una variable como en una caja etiquetada dentro de la memoria.
Dim total As Long hace dos cosas a la vez: reserva una caja y le pone la
etiqueta total, y fija la forma de la caja a Long (un número entero). A partir
de ahí, total = 15 mete un valor en esa caja y el nombre total lo vuelve a
leer.
La etiqueta importa más de lo que esperan los principiantes, por lo que hace VBA
cuando ve un nombre que no reconoce. Por defecto —sin Option Explicit— la
reacción de VBA ante un nombre desconocido no es «error». Es «ah, una variable
nueva», y te crea una en silencio, vacía. Esa única decisión de diseño es el
origen del error más desconcertante de VBA, y la siguiente sección es la solución.
La regla que te salva del peor error de VBA: Option Explicit
Aquí tienes el error, en tres líneas:
Sub AddThemUp()
total = 0
total = totl + 10 ' errata: "totl", no "total"
Debug.Print total ' -> 10, para siempre — la errata creó una caja NUEVA y vacía
End Sub
Querías total, tecleaste totl. Sin Option Explicit, VBA no lo señala.
Inventa un Variant nuevo y vacío llamado totl (valor 0 / Empty), suma 10 a
la nada y tu total de verdad nunca acumula nada. Ni texto en rojo ni cuadro de
mensaje: solo un resultado equivocado que quizá no adviertas hasta que ya está en
un informe.
Option Explicit acaba con toda esta clase de errores. Colocado como primera
línea de un módulo, hace obligatoria la declaración: toda variable debe aparecer
en un Dim (o Private / Public) antes de usarse. Ahora la errata no puede
crear una caja fantasma: es un nombre sin declarar, así que VBA se detiene en
tiempo de compilación:
Option Explicit
Sub AddThemUp()
Dim total As Long
total = 0
total = totl + 10 ' Error de compilación: Variable no definida (resalta "totl")
End Sub
El error apunta directo a la palabra mal escrita antes de que la macro llegue a
ejecutarse. Actívalo en todas partes por defecto: Herramientas → Opciones →
Editor → «Requerir declaración de variables» añade Option Explicit a cada
módulo nuevo de forma automática (a los ya existentes se lo sigues poniendo a
mano). Toma «Variable no definida» como un regalo: acaba de cazarte un error
gratis.
La regla que ata cada Dim a un solo tipo: la trampa de Dim a, b As Long
Este es el error de declaración que casi todo el mundo comete una vez. Quieres
tres contadores Long, así que escribes:
Dim i, j, k As Long
Sería razonable esperar que i, j y k fueran todas Long. No lo son.
Solo k es Long. i y j —que no tienen cláusula As propia— son
Variant. En VBA el tipo se aplica únicamente a la variable a la que está pegado
directamente; no existe ninguna regla de «repartir el tipo por toda la lista».
' INCORRECTO — i y j son Variant, solo k es Long
Dim i, j, k As Long
' CORRECTO — cada variable recibe su propio tipo
Dim i As Long, j As Long, k As Long
' Lo más claro de todo — una por línea
Dim i As Long
Dim j As Long
Dim k As Long
El modo de fallo es sutil: el código se ejecuta igual, porque un Variant
sostiene un número sin problema. Pierdes la seguridad de tipos y la velocidad que
creías tener, y el error solo asoma más tarde, cuando una de esas variables
«Long» acepta en silencio texto o un valor gigantesco que no debería. Dale a cada
variable su propio As Type.
La regla para los objetos: un = a secas no basta, necesitas Set
Las variables que guardan un valor —un número, algo de texto, una fecha— se
asignan con =. Las variables que guardan un objeto —un Worksheet, un
Range, un Workbook— tienen que asignarse con Set. Olvidar Set es el
otro error clásico de principiante.
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Data") ' Set es obligatorio para los objetos
Debug.Print ws.Range("A1").Value
Dim rng As Range
Set rng = ws.Range("A1:A10") ' de nuevo, Set
Si te dejas el Set, VBA no asigna el objeto: en su lugar intenta leer el valor
predeterminado del objeto, y te salta «Variable de objeto o variable de bloque
With no establecida» (error 91) o «Se requiere un objeto» (error 424). La
regla es mecánica y merece memorizarse: los tipos de valor usan =, los tipos
de objeto usan Set. Si un nombre de tipo se refiere a algo del modelo de
objetos de Excel (Worksheet, Range, Chart, Workbook), necesita Set.
Dónde pones el Dim decide el ámbito y el tiempo de vida
El lugar donde escribes Dim no es cosmético: decide quién puede ver la
variable y cuánto sobrevive:
- Dentro de un
SuboFunction→ la variable es local. Nace cuando arranca el procedimiento y desaparece cuando termina. Nada de fuera puede verla. - En la parte superior de un módulo, por encima del primer procedimiento → es
visible para todos los procedimientos de ese módulo. Usa
Privateahí para mantenerla acotada al módulo. Publicen la parte superior de un módulo → es una global, visible para todo el proyecto. Potente, pero fácil de abusar de ella; un valor que cualquier cosa puede cambiar desde cualquier parte es difícil de razonar.
Como regla, declara las variables tan localmente como puedas permitirte: justo
dentro del procedimiento que las usa. Recurre al nivel de módulo o a Public solo
cuando un valor de verdad tenga que compartirse. El ámbito da para un tema propio;
si estás pasando valores entre procedimientos, mira cómo fluyen los argumentos
en VBA Sub y VBA ByRef frente a ByVal.
Cómo ayuda ExcelMaster
Dim, Option Explicit y un ámbito disciplinado son lo que separa una macro que
sobrevive a un año de retoques de otra que se pudre. También son fricción: las
declaraciones cuidadosas que escribes antes de llegar a la parte que de verdad te
importa.
ExcelMaster te
deja saltar directo al resultado. Describe la tarea en lenguaje natural —«en la
hoja Pedidos, suma la columna D donde el estado sea Pagado, agrupado por mes»— y
escribe y ejecuta la lógica por ti, declarando las variables y los tipos correctos
de la forma robusta en lugar de dejarte a ti recordar Option Explicit. Cuando
sí necesites una macro escrita a mano que corra de forma programada, seguirás
poniendo los Dim tú mismo. Para la tarea cotidiana de «resuélveme esto con los
datos de hoy», describir el resultado gana a acertar cada declaración a mano.
Preguntas frecuentes
¿Tengo que declarar las variables en VBA?
Técnicamente no: VBA te deja usar una variable que nunca declaraste y la trata
como un Variant. En la práctica deberías declararlo todo, porque las variables
sin declarar permiten que una sola errata cree en silencio una caja nueva y vacía
y produzca un resultado equivocado sin ningún error. Pon Option Explicit al
principio de cada módulo para hacer obligatoria la declaración.
¿Qué significa Dim en VBA?
Dim es la abreviatura de «dimension» —viene de reservar las dimensiones de un
array en los primeros BASIC—. Hoy significa simplemente «declarar una variable»:
reservar un sitio con nombre en la memoria y, con As Type, fijar qué tipo de
valor guarda, p. ej. Dim count As Long.
¿Dim a, b As Long hace que a y b sean Long?
No. Solo b es Long; a es un Variant, porque la cláusula As se aplica
únicamente a la variable a la que está pegada directamente. Para que ambas sean
Long, escribe Dim a As Long, b As Long: dale a cada variable su propio
As Type.
¿Qué es Option Explicit y dónde lo pongo?
Option Explicit obliga a declarar toda variable antes de usarla. Ponlo como
primera línea de cada módulo, por encima de todos los procedimientos.
Convierte los errores silenciosos de «errata sin declarar» en un claro error de
compilación «Variable no definida». Activa Herramientas → Opciones → Editor →
Requerir declaración de variables para añadirlo a los módulos nuevos
automáticamente.
¿Cuándo uso Set en vez de = en una asignación Dim?
Usa Set cuando la variable guarda un objeto del modelo de objetos de Excel
—un Worksheet, Range, Workbook, Chart, etc.—: Set ws = ActiveSheet. Usa
un = a secas para los valores: números, texto, fechas, Boolean. Olvidar
Set en un objeto da «Variable de objeto o variable de bloque With no
establecida» (error 91).
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 31/07/2026.
Guías relacionadas: VBA Data Types · VBA Const · VBA Sub · VBA ByRef frente a ByVal · VBA Range
