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

VBA References en Excel — Herramientas > Referencias, bibliotecas MISSING y Can't find project or library

|

VBA References en Excel — Herramientas > Referencias, bibliotecas MISSING y Can't find project or library

TL;DR — Herramientas > Referencias (Tools > References) en el editor de VBA es la lista de dependencias de tu proyecto. Cada línea marcada permite a tu código usar los nombres de una biblioteca: Word.Application, Dictionary, ppLayoutBlank. La lista se guarda dentro del libro, pero se resuelve de nuevo en cada PC que lo abre. Cuando una biblioteca no está en ese PC, o es una versión más antigua, la línea muestra MISSING: y entonces todo el proyecto deja de compilar, normalmente en una línea inocente como Left o Date, con Can't find project or library («No se puede encontrar el proyecto o la biblioteca»). Se arregla desmarcando o sustituyendo la línea MISSING en ese PC. Se previene usando referencias solo mientras desarrollas, por el IntelliSense, y distribuyendo el archivo con enlace tardío, con CreateObject y sin ninguna referencia adicional.

' Con una referencia a "Microsoft Word 16.0 Object Library"
Dim wd As Word.Application          ' enlace temprano: IntelliSense, constantes con nombre
Set wd = New Word.Application

' Sin ninguna referencia
Dim wd2 As Object                   ' enlace tardio: funciona en cualquier PC con Word
Set wd2 = CreateObject("Word.Application")

Este es el tercer artículo de una serie sobre cómo manejar otras apps de Office desde Excel. Las guías de PowerPoint y de Word muestran los modelos de objetos de los otros programas. Esta trata el vínculo entre ellos: cómo aprende VBA qué significan Word.Range o ppLayoutBlank, y qué pasa cuando ese vínculo está roto en la máquina de otra persona. La regla de la serie sigue valiendo: cada objeto pertenece a una aplicación, así que di a cuál.

Lo que aprenderás

  • El modelo mental: las referencias son una lista de dependencias que se resuelve en cada PC
  • Las cuatro referencias predeterminadas y cómo añadir otra
  • Los dos errores de compilación, uno por una casilla sin marcar y otro por una biblioteca MISSING
  • Por qué una referencia rota hace fallar Left, Date y Format
  • Cómo decide el orden de prioridad de qué biblioteca es el Range que obtienes
  • Cómo listar las referencias por código, y por qué no repararlas así
  • Desarrollar con enlace temprano y distribuir con enlace tardío, con compilación condicional

El modelo mental: una lista de dependencias que viaja con el archivo

Cada nombre de tu código tiene que encontrarse en algún sitio. MsgBox viene de la biblioteca de VBA, Worksheets de la de Excel y Word.Document de la de Word, pero solo si tu proyecto incluye la biblioteca de Word como referencia. Abre el editor de VBA (Alt+F11) y elige Herramientas > Referencias para ver la lista.

Cada línea marcada registra qué biblioteca es: un identificador y un número de versión, más el archivo en el que se encontró en tu PC. El libro guarda la lista. No guarda las bibliotecas. Así que cada vez que se abre el archivo, VBA vuelve a buscar cada biblioteca en ese PC:

En el otro PC Qué hace VBA
la misma biblioteca, con la misma versión de Office o una más nueva la encuentra; las bibliotecas de Office incluso se actualizan a la versión más nueva
el programa no está instalado marca la línea como MISSING:
una versión de Office más antigua que la tuya marca la línea como MISSING:; las referencias se actualizan hacia delante, nunca hacia atrás
un control solo de 32 bits en un Office de 64 bits marca la línea como MISSING:

Esa tabla es todo el tema. Una referencia es la promesa de que una biblioteca estará ahí, y la promesa se comprueba en una máquina que nunca has visto.

Las cuatro predeterminadas, y cómo añadir una referencia

Un libro nuevo de Excel ya tiene cuatro referencias, y casi nunca tienes que pensar en ellas:

  • Visual Basic For Applications: el propio lenguaje, Left, Date, MsgBox
  • Microsoft Excel 16.0 Object Library: Workbook, Range, Worksheet
  • OLE Automation: soporte básico de COM
  • Microsoft Office 16.0 Object Library: objetos compartidos de Office, como FileDialog

Al insertar un UserForm se añade Microsoft Forms 2.0 Object Library. Las dos primeras no se pueden quitar ni mover.

Para añadir una, márcala en la lista, por ejemplo Microsoft Word 16.0 Object Library o Microsoft Scripting Runtime, y haz clic en Aceptar. Si no aparece, Examinar... (Browse...) te deja señalar el archivo de la biblioteca. El menú aparece atenuado mientras una macro se está ejecutando o está en pausa, así que pulsa antes Restablecer (Reset).

Lo que ganas: IntelliSense sobre los objetos nuevos, sus constantes con nombre como wdReplaceAll, New en lugar de CreateObject y comprobación de tipos al compilar. La guía de CreateObject lo compara en detalle con el enlace tardío; este artículo trata de lo que cuesta la referencia una vez que el archivo sale de tu mesa.

Dos errores de compilación, dos problemas distintos

Casi todos los problemas de referencias llegan como uno de dos errores de compilación, y significan cosas opuestas.

User-defined type not defined («No se ha definido el tipo definido por el usuario»). Escribiste Dim doc As Word.Document, o Dim d As Dictionary, y la referencia no está marcada en este proyecto. El compilador nunca ha oído hablar de ese tipo. Marca la biblioteca, o cambia la variable a Object y créala con CreateObject.

Can't find project or library («No se puede encontrar el proyecto o la biblioteca»). La referencia sí está en la lista, pero en este PC pone MISSING:. El archivo se creó donde la biblioteca existía y se abrió donde no existe. Este es el que llega a los usuarios, porque en la máquina del autor todo funcionaba.

Por qué fallan Left y Date cuando falta Word

Lo desconcertante de Can't find project or library es adónde apunta. Un libro con una referencia a Word marcada como MISSING se para en una línea como esta:

customer = Left(Range("A2").Value, 10)     ' resaltado: Left

Left no tiene nada que ver con Word. Pero cuando VBA compila, busca cada nombre sin calificar recorriendo las referencias en orden, y una biblioteca MISSING rompe esa búsqueda. El compilador se rinde en el primer nombre que no consigue ubicar, a menudo una función integrada corriente como Left, Mid, Date, Format o Trim. La función resaltada es una simple espectadora.

La solución está en el PC que muestra el error:

  1. Abre el editor de VBA, pulsa Restablecer si hay una macro en pausa y elige Herramientas > Referencias.
  2. Busca la línea que empieza por MISSING:.
  3. Desmárcala si el código no la necesita, o marca la versión que tenga este PC.
  4. Elige Depuración > Compilar VBAProject (Debug > Compile VBAProject) para confirmar que el proyecto vuelve a compilar.

A veces verás el consejo de escribir VBA.Left en lugar de Left. Un nombre totalmente calificado se salta la búsqueda, así que la línea compila. Pero eso esconde el síntoma: la referencia MISSING sigue ahí, y el código que de verdad usa esa biblioteca seguirá fallando.

Prioridad: ¿de qué biblioteca es el Range que obtienes?

Cuando dos bibliotecas definen el mismo nombre, decide el orden de la lista. La biblioteca de Excel está por encima de la de Word, así que en código de Excel un Range, Shape, Font o Selection sin calificar significa la versión de Excel. Por eso Dim r As Range seguido de Set r = doc.Content falla con Type mismatch («No coinciden los tipos»), como muestra la guía de Word.

Las flechas de Prioridad del cuadro Referencias pueden subir una biblioteca, pero mover una biblioteca para cambiar lo que significa un nombre a secas es una trampa: la próxima persona que añada una referencia lo volverá a cambiar. Mejor califica: Word.Range, Excel.Range, Scripting.Dictionary. Un nombre calificado significa lo mismo sea cual sea el orden.

Listar las referencias por código, y por qué no repararlas así

Puedes inspeccionar la lista desde VBA a través de VBProject.References:

Sub ListReferences()
    Dim ref As Object, desc As String
    For Each ref In ThisWorkbook.VBProject.References
        desc = "(unavailable)"
        On Error Resume Next
        desc = ref.Description              ' puede fallar en una referencia rota
        On Error GoTo 0
        Debug.Print IIf(ref.IsBroken, "MISSING  ", "ok       "); ref.GUID; "  "; desc
    Next ref
End Sub

Esto necesita la opción Confiar en el acceso al modelo de objetos de proyectos de VBA (Trust access to the VBA project object model) del Centro de confianza (Trust Center); sin ella la primera línea falla con el error 1004, Programmatic access to Visual Basic Project is not trusted (el acceso mediante programación al proyecto de Visual Basic no es de confianza). La salida va a la ventana Inmediato (Immediate window), como en la guía de Debug.Print.

El mismo objeto tiene AddFromGuid, AddFromFile y Remove, y es tentador escribir un Workbook_Open que repare las referencias. No te fíes de eso. La opción que necesita está desactivada por defecto y muchas veces bloqueada por el departamento de TI, y el código de un proyecto con una referencia MISSING puede que ni siquiera compile lo bastante como para ejecutar la reparación. Usa código como este para diagnosticar en tu propio PC, no como un arreglo que distribuyes.

La decisión de criterio: desarrolla con referencias, distribuye sin ellas

Una referencia es una dependencia, y cada dependencia es una promesa sobre el PC del usuario. Mi regla: un archivo que sale de tu máquina solo debe llevar las cuatro referencias predeterminadas. Todo lo demás pasa por CreateObject y variables Object, que funcionan en cualquier PC que tenga el programa y fallan con un error claro en tiempo de ejecución en cualquier PC que no lo tenga.

No tienes que renunciar al IntelliSense mientras escribes el código. La compilación condicional permite que un solo interruptor cambie el módulo entre los dos estilos:

#Const EARLY_WORD = False            ' True mientras desarrollas, con la referencia marcada

Sub MakeReport()
#If EARLY_WORD Then
    Dim wd As Word.Application
    Set wd = New Word.Application
#Else
    Dim wd As Object
    Set wd = CreateObject("Word.Application")
#End If
    wd.Visible = True
    ' ... el resto del codigo es identico ...
End Sub

Desarrolla con EARLY_WORD = True y la referencia a Word marcada. Antes de distribuir, ponlo a False y desmarca la referencia; las líneas de la rama inactiva no se compilan, así que no necesitan ninguna biblioteca. Sustituye las constantes con nombre por tus propias declaraciones Const, como Const wdExportFormatPDF As Long = 17, que trata la guía de Const. El archivo se abre entonces en cualquier versión de Office, sin ninguna línea MISSING que buscar.

Cómo ayuda ExcelMaster

Los problemas de referencias salen a la luz en el PC de otra persona, como un error en una línea que no está mal. Para cuando te llegan, la única descripción es una captura de pantalla que dice que no se encuentra Left.

ExcelMaster lee la lista de referencias del libro, encuentra la biblioteca MISSING que hay detrás del error y puede reescribir el código con enlace tardío y constantes locales, para que el archivo deje de depender de lo que haya instalado en el PC de cada usuario.

Preguntas frecuentes

¿Cómo añado una referencia en Excel VBA?

Abre el editor de VBA con Alt+F11, elige Herramientas > Referencias, marca la biblioteca, por ejemplo Microsoft Word 16.0 Object Library, y haz clic en Aceptar. Si el menú está atenuado, hay una macro en ejecución o en pausa; pulsa antes Restablecer.

¿Qué significa Can't find project or library?

Una de las referencias del proyecto está marcada como MISSING en este PC, porque la biblioteca no está instalada o es una versión más antigua. Abre Herramientas > Referencias, desmarca o sustituye la línea MISSING y vuelve a compilar. La línea que resalta el error casi nunca es la causa.

¿Por qué Left o Date provocan un error de compilación en VBA?

Una referencia rota impide que VBA resuelva los nombres, y las funciones habituales como Left, Mid, Date y Format son las primeras en fallar. Arregla la referencia MISSING, no la línea resaltada.

¿Cuál es la diferencia entre una referencia y CreateObject?

Una referencia le da al compilador los tipos, las constantes y el IntelliSense de la biblioteca, pero tiene que existir en cada PC que abra el archivo. CreateObject encuentra el programa en tiempo de ejecución sin ninguna referencia, lo que es más portable pero renuncia al IntelliSense y a las constantes con nombre.

¿Qué referencias tiene un libro nuevo de Excel?

Cuatro: Visual Basic For Applications, Microsoft Excel 16.0 Object Library, OLE Automation y Microsoft Office 16.0 Object Library. Un libro con un UserForm tiene además Microsoft Forms 2.0 Object Library.

Probado en

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

Guías relacionadas: VBA PowerPoint · VBA Word · VBA CreateObject · VBA Outlook · VBA Dictionary · VBA Const · VBA Option Explicit · VBA Debug.Print