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

VBA Set en Excel — por qué las variables de objeto necesitan Set (y los errores 91 y 424)

|

VBA Set en Excel — por qué las variables de objeto necesitan Set (y los errores 91 y 424)

TL;DR — En VBA asignas un objeto con Set, no con un = a secas. Una variable de objeto es una referencia —una etiqueta que apunta a un objeto vivo—, así que Set ws = Worksheets("Data") apunta la etiqueta a la hoja. Olvida el Set y VBA lanza el error 91, «Object variable or With block variable not set». Usa Set sobre algo que no es un objeto y obtienes el error 424, «Object required». Los valores (Integer, String, Double) se copian con =; a los objetos se apunta con Set.

Sub ObjectsNeedSet()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Data")   ' Set = apunta la etiqueta a la hoja
    ws.Range("A1").Value = 100                  ' ahora ws se refiere a algo - esto funciona

    Dim total As Double
    total = ws.Range("A1").Value                ' los valores usan =, sin Set
End Sub

Set es la piedra angular del ciclo de vida de un objeto: creas un objeto con New, apuntas una variable hacia él con Set, y lo liberas con Nothing. Si te equivocas con Set, te topas con los dos errores que todo programador de VBA encuentra primero —el 91 y el 424—, así que vale la pena entender por qué los objetos lo necesitan.

Lo que aprenderás

  • El modelo mental — una variable de objeto es una referencia (una etiqueta), no una caja que guarda una copia
  • Qué cosas necesitan Set (Range, Worksheet, Workbook, Dictionary) y cuáles no (Integer, String)
  • El error número uno — el error 91, «Object variable or With block variable not set», por un Set que falta
  • El error 424, «Object required», y en qué se diferencia del 91
  • Por qué Set b = a crea dos nombres para el mismo objeto vivo, no una copia

El modelo mental: una referencia, no una caja

Una variable de valor es una caja. Dim n As Long: n = 5 mete el número 5 dentro de n. Cópiala con m = n y m se queda con su propio 5; cambia m y n queda intacta. Sencillo.

Una variable de objeto no es una caja —es una etiqueta—. Dim ws As Worksheet crea una etiqueta vacía que ahora mismo no apunta a ninguna hoja. Set ws = Worksheets("Data") no copia la hoja dentro de ws; apunta la etiqueta a la hoja que ya existe. Esa es toda la razón por la que existe Set: asignar un objeto es un acto de apuntar, y VBA te obliga a decirlo en voz alta.

Dim ws As Worksheet
ws = Worksheets("Data")        ' MAL - sin Set - error de ejecucion 91
Set ws = Worksheets("Data")    ' BIEN - la etiqueta ahora apunta a la hoja

Quédate con una frase y todo lo demás se deriva de ella: los valores los copias con =; a los objetos los apuntas con Set. Los dos errores de ejecución de abajo no son más que VBA diciéndote que no pudo apuntar bien una etiqueta.

El error número uno: el error 91

El 91 es el error que manda a la gente a buscar, bajo su nombre completo: «Object variable or With block variable not set». Significa que usaste una variable de objeto que ahora mismo no apunta a nada. Dos situaciones lo provocan, y ambas se reducen a un Set que falta.

Primero, declaraste el objeto pero nunca lo asignaste con Set, así que sigue siendo Nothing, y luego lo usaste:

Dim ws As Worksheet
ws.Range("A1").Value = 1       ' error 91 - ws nunca se asigno con Set, no apunta a nada

Segundo —el traicionero—, sí querías asignar la hoja, pero olvidaste el Set:

Dim ws As Worksheet
ws = ThisWorkbook.Worksheets("Data")   ' error 91 - un = a secas no puede apuntar una etiqueta de objeto

La solución para ambos es la misma palabra: Set ws = ThisWorkbook.Worksheets("Data"). Siempre que veas «Object variable or With block variable not set», la primera pregunta es siempre: ¿asigné este objeto con Set, y la cosa a la que lo asigné existía de verdad? (Un Find o una búsqueda que devuelve Nothing es la otra fuente clásica —la variable está asignada, a Nothing, y la usaste igualmente—.)

El error 424: Object required

El 424, «Object required», es la imagen especular del 91. Donde el 91 es «usaste un hueco de objeto que estaba vacío», el 424 es «usaste Set, o sintaxis de objeto, sobre una cosa que no es un objeto en absoluto»:

Dim n As Long
Set n = 5                      ' error 424 - 5 es un valor, Set quiere un objeto
Set n = Range("A1").Value      ' error 424 - .Value es un numero, no un objeto

Set a la izquierda exige un objeto a la derecha. Dale un número, una cadena o una propiedad que devuelve un valor, y VBA dice «Object required». También ves el 424 cuando llamas a sintaxis de objeto sobre una variable normal —x.Cells(1, 1) donde x es un String, o un nombre de variable mal escrito que VBA trata en silencio como un Variant vacío—. La regla práctica: el 91 significa «asígnalo primero con Set»; el 424 significa «eso no es un objeto, quita el Set (o corrige el lado derecho)».

Set crea un alias, no una copia

Como Set apunta en vez de copiar, dos variables de objeto pueden acabar apuntando al mismo objeto vivo —y escribir a través de una cambia lo que ve la otra—:

Dim a As Range, b As Range
Set a = Range("A1:B2")
Set b = a                      ' b apunta al MISMO range que a - no es una copia
b.ClearContents                ' esto tambien borra a, porque a y b son un mismo range

Compáralo con los valores, donde una copia es de verdad una copia:

Dim x As Long, y As Long
x = 5: y = x                   ' y se queda con su propio 5
y = 9                          ' x sigue siendo 5 - cajas independientes

Este aliasing no es un fallo; es el sentido mismo de las referencias, y es por lo que pasar objetos de un lado a otro sale barato (pasas la etiqueta, nunca la hoja entera). Pero sí significa que «copié el range en otra variable y lo edité» edita en silencio el original. Para duplicar los datos, copia las celdas (a.Copy), no la referencia.

Set frente a Let

VBA tiene en realidad una palabra clave gemela para los valores: Let. Let n = 5 es lo mismo que n = 5 —el Let es opcional y ya nadie lo escribe, así que la asignación de valores se lee como un = a secas—. No hay tal atajo para los objetos: Set es obligatorio y no se puede omitir nunca. Esa asimetría es justo por lo que el error del Set que falta es tan fácil de cometer —cualquier otra asignación de tu macro es un = a secas, y los objetos son el único sitio donde no basta—.

Cómo te ayuda ExcelMaster

Toda la historia de Set es una decisión que se toma en cada asignación —¿esto es un valor que copio, o un objeto al que apunto?— y equivocarse falla a gritos con el 91 o el 424, o en silencio con un alias que no esperabas.

ExcelMaster te deja describir la tarea —«coge la hoja Data, encuentra la última fila, escribe el total»— y escribe las referencias de objeto con Set donde corresponde, declara cada variable con el tipo correcto, y protege una búsqueda que podría devolver Nothing antes de tocar el resultado, así que el error 91 nunca llega hasta ti. Tú conservas el libro y el código.

Preguntas frecuentes

¿Qué hace Set en VBA?

Set asigna una referencia a una variable de objeto —apunta la variable a un objeto vivo como un Range, un Worksheet, un Workbook o un Dictionary—. A diferencia de un = a secas, que copia un valor, Set no copia el objeto; hace que la variable se refiera al que ya existe. Los objetos necesitan Set; los valores (Integer, String, Double) no.

¿Por qué me sale «Object variable or With block variable not set»?

Ese es el error de ejecución 91, y significa que usaste una variable de objeto que no apunta a nada. Normalmente la declaraste con Dim pero nunca la asignaste con Set, o escribiste un = a secas en lugar de Set (un = a secas no puede apuntar una variable de objeto), o la cosa que asignaste —como el resultado de un Find— devolvió Nothing. Añade el Set y comprueba que el objeto que asignas existe de verdad.

¿Cuál es la diferencia entre el error 91 y el error 424?

El error 91, «Object variable or With block variable not set», significa que usaste una variable de objeto que ahora mismo es Nothing —la solución es asignarla primero con Set—. El error 424, «Object required», significa que usaste Set (o sintaxis de objeto) sobre algo que no es un objeto —como Set n = 5—, así que la solución es quitar el Set o poner un objeto de verdad en el lado derecho.

¿Necesito Set para un String o un Integer?

No. String, Integer, Long, Double, Boolean, Date y otros tipos de valor se asignan con un = a secas, porque se copian, no se referencian. Set es solo para los tipos de objeto. Usar Set sobre un valor lanza el error 424, «Object required».

¿Set copia el objeto?

No —Set apunta la variable al objeto que ya existe—. Set b = a te da dos variables que se refieren al mismo objeto vivo, así que un cambio a través de b se ve a través de a. Para duplicar los datos subyacentes (de un range, pongamos), copia las celdas con a.Copy, no la referencia.

Probado en

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

Guías relacionadas: VBA New · VBA Nothing · VBA Dim · VBA CreateObject · VBA With