TL;DR — Outils > Références (Tools > References) dans l'éditeur VBA, c'est la liste des dépendances de votre projet. Chaque ligne cochée permet à votre code d'employer les noms d'une bibliothèque :
Word.Application,Dictionary,ppLayoutBlank. La liste est enregistrée dans le classeur, mais résolue de nouveau sur chaque PC qui l'ouvre. Quand une bibliothèque est absente de ce PC, ou n'y existe qu'en version plus ancienne, la ligne affiche MISSING: (« MANQUANT : » dans un Office en français), et tout le projet refuse alors de compiler, en général sur une ligne innocente commeLeftouDate, avec Can't find project or library (« Projet ou bibliothèque introuvable »). Le remède : décocher ou remplacer la ligne MISSING sur ce PC. La prévention : n'utiliser les références que pendant le développement, pour IntelliSense, et livrer le fichier en late binding, avecCreateObjectet aucune référence supplémentaire.
' Avec une reference a "Microsoft Word 16.0 Object Library"
Dim wd As Word.Application ' early binding : IntelliSense, constantes nommees
Set wd = New Word.Application
' Sans aucune reference
Dim wd2 As Object ' late binding : marche sur tout PC equipe de Word
Set wd2 = CreateObject("Word.Application")
Voici le troisième article d'une série consacrée au pilotage des autres applications Office depuis
Excel. Les guides PowerPoint et Word présentent les modèles
objet des autres programmes. Celui-ci traite du lien entre eux : comment VBA apprend ce que signifient
Word.Range ou ppLayoutBlank, et ce qui se passe quand ce lien est rompu sur la machine de quelqu'un
d'autre. La règle de la série vaut toujours : chaque objet appartient à une application, alors dites
laquelle.
Ce que vous allez apprendre
- Le modèle mental : les références sont une liste de dépendances, résolue sur chaque PC
- Les quatre références par défaut, et comment en ajouter une autre
- Les deux erreurs de compilation : l'une pour une case non cochée, l'autre pour une bibliothèque MISSING
- Pourquoi une référence cassée fait échouer
Left,DateetFormat - Comment l'ordre de priorité décide du
Rangede quelle bibliothèque vous obtenez - Comment lister les références par le code, et pourquoi ne pas les réparer ainsi
- Développer en early binding, livrer en late binding, grâce à la compilation conditionnelle
Le modèle mental : une liste de dépendances qui voyage avec le fichier
Chaque nom de votre code doit être trouvé quelque part. MsgBox vient de la bibliothèque VBA, Worksheets
de celle d'Excel, et Word.Document de celle de Word, mais seulement si votre projet déclare la
bibliothèque de Word comme référence. Ouvrez l'éditeur VBA (Alt+F11) et choisissez Outils > Références
pour voir la liste.
Chaque ligne cochée enregistre quelle bibliothèque : un identifiant et un numéro de version, plus le fichier où elle a été trouvée sur votre PC. Le classeur stocke la liste. Il ne stocke pas les bibliothèques. À chaque ouverture du fichier, VBA recherche donc chaque bibliothèque sur ce PC-là :
| Sur l'autre PC | Ce que fait VBA |
|---|---|
| même bibliothèque, version d'Office identique ou plus récente | la trouve ; les bibliothèques Office passent même à la version plus récente |
| le programme n'est pas installé | marque la ligne MISSING: |
| une version d'Office plus ancienne que la vôtre | marque la ligne MISSING: ; les références montent de version, jamais ne redescendent |
| un contrôle uniquement 32 bits sur un Office 64 bits | marque la ligne MISSING: |
Ce tableau, c'est tout le sujet. Une référence est la promesse qu'une bibliothèque sera là, et cette promesse est vérifiée sur une machine que vous n'avez jamais vue.
Les quatre références par défaut, et ajouter une référence
Un nouveau classeur Excel possède déjà quatre références, et vous n'avez presque jamais à vous en soucier :
- Visual Basic For Applications : le langage lui-même,
Left,Date,MsgBox - Microsoft Excel 16.0 Object Library :
Workbook,Range,Worksheet - OLE Automation : la prise en charge COM de base
- Microsoft Office 16.0 Object Library : les objets Office partagés, comme
FileDialog
L'insertion d'un UserForm ajoute Microsoft Forms 2.0 Object Library. Les deux premières ne peuvent être ni retirées ni déplacées.
Pour en ajouter une, cochez-la dans la liste, par exemple Microsoft Word 16.0 Object Library ou Microsoft Scripting Runtime, puis cliquez sur OK. Si elle n'apparaît pas, Parcourir... (Browse...) vous permet de désigner le fichier de la bibliothèque. Le menu est grisé tant qu'une macro tourne ou est en pause : cliquez d'abord sur Réinitialiser (Reset).
Ce que vous y gagnez : IntelliSense sur les nouveaux objets, leurs constantes nommées comme wdReplaceAll,
New au lieu de CreateObject, et la vérification des types à la compilation. Le
guide CreateObject compare cela en détail avec le late binding ; cet article
porte sur ce que coûte la référence une fois que le fichier a quitté votre bureau.
Deux erreurs de compilation, deux problèmes différents
La plupart des ennuis de références arrivent sous la forme de l'une de deux erreurs de compilation, et elles veulent dire l'inverse l'une de l'autre.
User-defined type not defined (« Type défini par l'utilisateur non défini »). Vous avez écrit
Dim doc As Word.Document, ou Dim d As Dictionary, et la référence n'est pas cochée dans ce projet. Le
compilateur n'a jamais entendu parler de ce type. Cochez la bibliothèque, ou passez la variable en Object
et créez-la avec CreateObject.
Can't find project or library. La référence est dans la liste, mais sur ce PC elle affiche MISSING:. Le fichier a été construit là où la bibliothèque existait et ouvert là où elle n'existe pas. C'est celle-là qui atteint les utilisateurs, parce que tout fonctionnait sur la machine de l'auteur.
Pourquoi Left et Date échouent quand Word manque
Ce qui déroute dans Can't find project or library, c'est l'endroit qu'elle désigne. Un classeur avec une référence Word MISSING s'arrête sur une ligne comme celle-ci :
customer = Left(Range("A2").Value, 10) ' surligne : Left
Left n'a rien à voir avec Word. Mais à la compilation, VBA recherche chaque nom non qualifié à travers les
références, dans l'ordre, et une bibliothèque MISSING casse cette recherche. Le compilateur abandonne sur le
premier nom qu'il ne parvient pas à situer, souvent une fonction intégrée courante comme Left, Mid,
Date, Format ou Trim. La fonction surlignée n'est qu'un témoin innocent.
La correction se fait sur le PC qui affiche l'erreur :
- Ouvrez l'éditeur VBA, cliquez sur Réinitialiser si une macro est en pause, et choisissez Outils > Références.
- Repérez la ligne qui commence par MISSING:.
- Décochez-la si le code n'en a pas besoin, ou cochez la version présente sur ce PC.
- Choisissez Débogage > Compiler VBAProject (Debug > Compile VBAProject) pour vérifier que le projet compile de nouveau.
On lit parfois le conseil d'écrire VBA.Left au lieu de Left. Un nom entièrement qualifié court-circuite
la recherche, et la ligne compile. Cela masque le symptôme ; la référence MISSING est toujours là, et le code
qui se sert réellement de cette bibliothèque échouera quand même.
Priorité : le Range de quelle bibliothèque obtenez-vous ?
Quand deux bibliothèques définissent le même nom, c'est l'ordre de la liste qui tranche. La bibliothèque
d'Excel se trouve au-dessus de celle de Word ; dans du code Excel, un Range, Shape, Font ou Selection
non qualifié désigne donc la version d'Excel. Voilà pourquoi Dim r As Range suivi de
Set r = doc.Content échoue sur une Type mismatch (« Incompatibilité de type »), comme le montre le
guide Word.
Les flèches Priorité (Priority) de la boîte de dialogue Références permettent de remonter une
bibliothèque, mais déplacer une bibliothèque pour changer le sens d'un nom nu est un piège : la prochaine
personne qui ajoute une référence le changera de nouveau. Qualifiez plutôt : Word.Range, Excel.Range,
Scripting.Dictionary. Un nom qualifié signifie la même chose quel que soit l'ordre.
Lister les références par le code, et pourquoi ne pas les réparer ainsi
Vous pouvez inspecter la liste depuis VBA via 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 ' peut echouer sur une reference cassee
On Error GoTo 0
Debug.Print IIf(ref.IsBroken, "MISSING ", "ok "); ref.GUID; " "; desc
Next ref
End Sub
Il faut pour cela activer Accès approuvé au modèle d'objet du projet VBA (Trust access to the VBA project object model) dans le Centre de gestion de la confidentialité (Trust Center) ; sans cela, la première ligne échoue avec l'erreur 1004, Programmatic access to Visual Basic Project is not trusted (l'accès par programme au projet Visual Basic n'est pas fiable). La sortie s'affiche dans la fenêtre Exécution (Immediate window), comme dans le guide Debug.Print.
Le même objet propose AddFromGuid, AddFromFile et Remove, et il est tentant d'écrire un
Workbook_Open qui répare les références. N'y comptez pas. Le paramètre requis est désactivé par défaut et
souvent verrouillé par le service informatique, et le code d'un projet qui a une référence MISSING risque de
ne même pas compiler assez loin pour lancer la réparation. Servez-vous de ce genre de code pour diagnostiquer
sur votre propre PC, pas comme un correctif à livrer.
Le parti pris : développer avec des références, livrer sans
Une référence est une dépendance, et chaque dépendance est une promesse faite au sujet du PC de
l'utilisateur. Ma règle : un fichier qui quitte votre machine ne doit porter que les quatre références par
défaut. Tout le reste passe par CreateObject et des variables Object, qui fonctionnent sur tout PC
équipé du programme et échouent avec une erreur d'exécution claire sur tout PC qui ne l'a pas.
Vous n'avez pas à renoncer à IntelliSense pendant l'écriture du code. La compilation conditionnelle permet de basculer le module d'un style à l'autre avec un seul interrupteur :
#Const EARLY_WORD = False ' True pendant le developpement, reference cochee
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
' ... le reste du code est identique ...
End Sub
Développez avec EARLY_WORD = True et la référence Word cochée. Avant de livrer, passez-le à False et
décochez la référence ; les lignes de la branche inactive ne sont pas compilées, elles n'ont donc besoin
d'aucune bibliothèque. Remplacez les constantes nommées par vos propres déclarations Const, comme
Const wdExportFormatPDF As Long = 17, ce que traite le guide Const. Le fichier
s'ouvre alors sur n'importe quelle version d'Office, sans aucune ligne MISSING à traquer.
Comment ExcelMaster aide
Les problèmes de références surgissent sur le PC de quelqu'un d'autre, sous la forme d'une erreur sur une
ligne qui n'a rien de faux. Le temps qu'ils vous parviennent, la seule description disponible est une
capture d'écran disant que Left est introuvable.
ExcelMaster lit la liste des références du classeur, retrouve la bibliothèque MISSING derrière l'erreur, et peut réécrire le code en late binding avec des constantes locales, pour que le fichier cesse de dépendre de ce qui est installé sur le PC de chaque utilisateur.
Questions fréquentes
Comment ajouter une référence en VBA dans Excel ?
Ouvrez l'éditeur VBA avec Alt+F11, choisissez Outils > Références, cochez la bibliothèque, par exemple Microsoft Word 16.0 Object Library, et cliquez sur OK. Si le menu est grisé, une macro tourne ou est en pause : cliquez d'abord sur Réinitialiser.
Que signifie Can't find project or library ?
L'une des références du projet est marquée MISSING sur ce PC, parce que la bibliothèque n'y est pas installée ou n'y existe qu'en version plus ancienne. Ouvrez Outils > Références, décochez ou remplacez la ligne MISSING, puis compilez de nouveau. La ligne surlignée par l'erreur n'en est généralement pas la cause.
Pourquoi Left ou Date provoque-t-il une erreur de compilation en VBA ?
Une référence cassée empêche VBA de résoudre les noms, et les fonctions courantes comme Left, Mid,
Date et Format sont les premières à échouer. Corrigez la référence MISSING plutôt que la ligne surlignée.
Quelle est la différence entre une référence et CreateObject ?
Une référence donne au compilateur les types, les constantes et l'IntelliSense de la bibliothèque, mais
elle doit exister sur chaque PC qui ouvre le fichier. CreateObject trouve le programme à l'exécution, sans
aucune référence : c'est plus portable, mais on renonce à IntelliSense et aux constantes nommées.
Quelles références un nouveau classeur Excel possède-t-il ?
Quatre : Visual Basic For Applications, Microsoft Excel 16.0 Object Library, OLE Automation et Microsoft Office 16.0 Object Library. Un classeur qui contient un UserForm a aussi Microsoft Forms 2.0 Object Library.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — vérifié le 02/10/2026.
Guides connexes : VBA PowerPoint · VBA Word · VBA CreateObject · VBA Outlook · VBA Dictionary · VBA Const · VBA Option Explicit · VBA Debug.Print
