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 comoLeftoDate, 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, conCreateObjecty 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,DateyFormat - Cómo decide el orden de prioridad de qué biblioteca es el
Rangeque 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:
- Abre el editor de VBA, pulsa Restablecer si hay una macro en pausa y elige Herramientas > Referencias.
- Busca la línea que empieza por MISSING:.
- Desmárcala si el código no la necesita, o marca la versión que tenga este PC.
- 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
