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

VBA Option Explicit en Excel — convierte una errata silenciosa en un ruidoso error de compilación

|

VBA Option Explicit en Excel — convierte una errata silenciosa en un ruidoso error de compilación

TL;DR — Pon Option Explicit en la primerísima línea de cada módulo y VBA se negará a ejecutar cualquier macro que use una variable que nunca declaraste. Sin él, una errata como totalSaies no es un error — VBA crea en silencio una variable nueva y vacía, tu total vuelve como 0 y nada te avisa. Es una directiva, no código de ejecución: corre en tiempo de compilación, así que el fallo aflora antes de que se ejecute una sola línea. Activa Herramientas > Opciones > Require Variable Declaration una vez para que se añada a cada módulo nuevo automáticamente.

Option Explicit          ' <- siempre la primera linea del modulo

Sub Report()
    Dim totalSales As Long
    totalSales = 100
    MsgBox totalSaies      ' errata! Con Option Explicit: "Variable not defined" - no se ejecutara
End Sub                    ' Sin el: MsgBox muestra un blanco/0 y nadie se entera

Lo que aprenderás

  • El modelo mental — VBA inventa una variable por cada nombre que tecleas
  • El bug de la errata silenciosa, y cómo una sola línea acaba con toda su categoría
  • Por qué es por módulo, y el ajuste que lo añade por ti
  • Qué hacer cuando Variable not defined enciende tu código antiguo
  • Por qué obliga a la declaración pero no a los tipos de datos (una confusión habitual)
  • La opinión: el único ajuste que activar antes de escribir una línea

El modelo mental: VBA inventa variables a tus espaldas

Por defecto, VBA trata cualquier nombre que no ha visto nunca como una petición de crear una variable nueva, al instante, de tipo Variant y con Empty dentro. Suena cómodo. Es una trampa. Significa que VBA no puede distinguir entre una variable que querías usar y una que escribiste mal — ambas son solo «un nombre que no ha visto», así que ambas se crean, en silencio.

Option Explicit elimina esa comodidad. Con él en lo alto del módulo, la regla se invierte: toda variable debe declararse (con Dim, Private, Public, Static, Const o un parámetro) antes de usarla. Teclea un nombre que nunca declaraste y el compilador se detiene con Variable not defined — antes de que la macro se ejecute. Has cambiado un poco de tecleo por la promesa del compilador de que cada nombre de tu código es uno que quisiste poner.

Tres tokens que la macro nunca ejecuta

Option Explicit pertenece a una pequeña familia: tres cosas que tecleas y que la macro en ejecución nunca ejecuta. Dan forma al código fuente y a la compilación, no a la ejecución — y por eso los principiantes se los saltan, y por eso saltárselos duele.

Token Qué le hace a tu código fuente Qué le cuesta a la ejecución
' comentario Deja notas y desactiva código que el compilador elimina Nada — nunca se ejecuta
_ continuación de línea Parte una instrucción larga en varias líneas Nada — el parser lo borra
Option Explicit Obliga a declarar todos los nombres Se ejecuta en tiempo de compilación, así las erratas mueren antes de que arranque la macro

Dos de los tres se borran antes de compilar; Option Explicit es el que actúa — le ordena al compilador vigilar tus nombres. Es el de mayor rentabilidad de los tres, porque el bug que atrapa es el más caro: el que produce una respuesta equivocada en lugar de un error.

El bug que elimina: la errata que devuelve cero

Este es todo el argumento a favor de Option Explicit en ocho líneas. Sin él:

Sub Totals()
    Dim revenue As Currency
    revenue = 5000
    ' ...cuarenta lineas mas tarde...
    MsgBox "Revenue: " & revanue   ' errata: revAnue
End Sub

revanue nunca se declaró, así que VBA la crea como un Variant vacío. El cuadro de mensaje muestra Revenue: — en blanco — y no hay error, ni aviso, ni texto en rojo. En un informe de verdad eso es un número equivocado entregado a alguien que se fía de él. Esta es la fuente más común de «mi macro da la respuesta equivocada pero no se cae», y es completamente invisible hasta que alguien nota que el total no cuadra.

Añade una línea y la misma errata se convierte en un muro que no puedes cruzar:

Option Explicit

Sub Totals()
    Dim revenue As Currency
    revenue = 5000
    MsgBox "Revenue: " & revanue   ' Compile error: Variable not defined  (revanue resaltado)
End Sub

La macro ni siquiera arranca. El compilador resalta revanue y nombra el problema. Un arreglo de diez segundos en lugar de un error silencioso ya entregado.

Es por módulo, así que deja que el ajuste lo añada por ti

Option Explicit protege solo el módulo en el que está. Añádelo a Module1 y Module2 sigue abierto de par en par. Un módulo nuevo que insertes mañana no lo tiene. Confiar en ti mismo para teclearlo en lo alto de cada módulo es exactamente el tipo de disciplina que falla el día ajetreado en que más lo necesitas.

Así que no confíes en ti mismo. En el editor de VBA abre Herramientas > Opciones > Editor y marca Require Variable Declaration. A partir de ahí, cada módulo nuevo que insertes recibe Option Explicit en su primera línea automáticamente. Es un clic único que convierte el valor seguro en el valor por defecto real — lo primero que configurar en cualquier máquina donde escribas VBA.

Una salvedad que conviene saber: ese ajuste solo afecta a los módulos creados después de marcarlo. Los módulos que ya existen conservan lo que tuvieran, así que a los módulos antiguos les sigues añadiendo la línea a mano.

Activarlo en código antiguo: el muro rojo es el objetivo

Añade Option Explicit a un módulo lleno de variables sin declarar y la primera compilación se enciende como una centralita — Variable not defined en un nombre tras otro. No es que la directiva se ponga difícil; es que te muestra cada lugar donde tu código antiguo iba a ciegas. Cada nombre resaltado es o bien una variable que necesitas declarar o bien una errata que nunca cazaste.

Ve resolviéndolos uno a uno: declara los de verdad (Dim customerName As String — mira VBA Dim para saber cómo) y corrige las erratas. Es tedioso una vez y seguro para siempre. Si un módulo es enorme, añade la línea, compila y deja que el editor te lleve a cada nombre sin declarar con Depurar > Compilar. No estás añadiendo trabajo; estás cobrando bugs que ya estaban ahí.

Obliga a declarar, no a fijar tipos de datos

Una lectura errónea frecuente: la gente cree que Option Explicit hace que VBA sea de tipado fuerte. No es así. Te obliga a declarar una variable, pero una declaración sin tipo sigue siendo un Variant:

Option Explicit

Dim count            ' legal bajo Option Explicit - pero es un Variant
Dim count As Long    ' esto es lo que de verdad quieres - una variable con tipo

Dim count satisface a Option Explicit (el nombre está declarado) pero no te da nada de la velocidad ni la seguridad de tipos de As Long. Option Explicit cierra el agujero del nombre sin declarar; elegir tipos de verdad (As Long, As String, As Range) es un hábito aparte, igual de valioso, que se cubre en VBA Data Types. Activa el primero, luego practica el segundo.

La opinión: este es el primer ajuste que debes activar

No hay ningún argumento honesto en contra de Option Explicit. El coste son unas pocas líneas Dim que deberías escribir de todas formas; la recompensa es la inmunidad al bug que más tiempo hace perder en VBA — la errata silenciosa que devuelve cero y se entrega. Todo desarrollador de VBA con experiencia activa Require Variable Declaration en una máquina nueva antes de escribir nada, y trata un módulo sin Option Explicit como algo sin terminar.

Si te llevas una sola cosa de este grupo de guías, que sea esta: marca el ajuste ahora, añade la línea a los módulos que ya tienes, y no vuelvas nunca a pasarte una tarde persiguiendo un total equivocado que resulta ser una variable mal escrita. Es el seguro más barato del lenguaje.

Cuando la garantía que quieres es la macro entera, no una variable

Option Explicit garantiza que tus nombres son reales. No puede garantizar que tu lógica lo sea. Cuando lo que está en juego es un número que verá un cliente, sigues queriendo algo que compruebe que el resultado es correcto, no solo que las variables existen. ExcelMaster toma un objetivo en lenguaje natural —«concilia estas dos hojas y marca cada fila donde los totales no coincidan»— escribe el código, respalda tu libro, lo ejecuta y te devuelve las filas que no pasan la comprobación. Tú describes el resultado que esperas; él hace el trabajo y te muestra dónde se separan la realidad y la expectativa — un nivel de seguridad que ninguna directiva por sí sola puede darte.

Preguntas frecuentes

¿Qué hace Option Explicit en VBA?

Te obliga a declarar cada variable antes de usarla. Con Option Explicit en lo alto de un módulo, cualquier nombre que nunca declaraste dispara un error de compilación Variable not defined, así que las erratas y las variables sin declarar se cazan antes de que la macro se ejecute en lugar de convertirse en silencio en variants vacíos.

¿Dónde pongo Option Explicit?

En la primerísima línea de un módulo, por encima de cada Sub y Function, en la sección Declarations del módulo. Aplica solo a ese módulo, así que va en lo alto de cada módulo que quieras proteger.

¿Cómo añado Option Explicit automáticamente?

En el editor de VBA, abre Herramientas > Opciones > Editor y marca Require Variable Declaration. VBA inserta entonces Option Explicit en lo alto de cada módulo nuevo que crees. No lo añade a los módulos que ya existen — esos los actualizas a mano.

¿Por qué me sale Variable not defined tras añadir Option Explicit?

Porque el módulo tiene variables que nunca declaraste — a menudo erratas, a veces nombres que simplemente olvidaste poner en un Dim. El compilador resalta cada uno. Declara las variables de verdad (por ejemplo Dim total As Long) y corrige las mal escritas; cada error es un bug latente que la directiva acaba de dejar al descubierto.

¿Option Explicit obliga a fijar tipos de datos?

No. Obliga a la declaración, no al tipado. Dim count lo satisface pero sigue siendo un Variant. Para conseguir seguridad de tipos y velocidad añades tú un tipo — Dim count As Long — que es un buen hábito aparte.

Probado en

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

Guías relacionadas: VBA Comment · VBA Line Continuation · VBA Dim · VBA Data Types · VBA Debug.Print