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í queSet ws = Worksheets("Data")apunta la etiqueta a la hoja. Olvida elSety VBA lanza el error 91, «Object variable or With block variable not set». UsaSetsobre 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 conSet.
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
Setque falta - El error 424, «Object required», y en qué se diferencia del 91
- Por qué
Set b = acrea 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 sí 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
