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

VBA References dans Excel — Outils > Références, bibliothèques MISSING et Can't find project or library

|

VBA References dans Excel — Outils > Références, bibliothèques MISSING et Can't find project or library

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 comme Left ou Date, 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, avec CreateObject et 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, Date et Format
  • Comment l'ordre de priorité décide du Range de 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 :

  1. Ouvrez l'éditeur VBA, cliquez sur Réinitialiser si une macro est en pause, et choisissez Outils > Références.
  2. Repérez la ligne qui commence par MISSING:.
  3. Décochez-la si le code n'en a pas besoin, ou cochez la version présente sur ce PC.
  4. 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