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

VBA Dim en Excel — declarar variables, Option Explicit y la errata que se convierte en una caja vacía

|

VBA Dim en Excel — declarar variables, Option Explicit y la errata que se convierte en una caja vacía

TL;DRDim name As Type reserva 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 un Variant vacío recién creado, tu total se queda en 0 y no salta ningún error. Pon Option Explicit en 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 Dim en realidad: reservar una caja con nombre y fijar su forma
  • Por qué Option Explicit convierte las erratas silenciosas en ruidosos errores de compilación
  • La trampa de Dim a, b As Long, que deja a como Variant, no como Long
  • Cuándo un = a secas no basta y necesitas Set (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 Sub o Function → 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 Private ahí para mantenerla acotada al módulo.
  • Public en 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 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