Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
Il y a plusieurs mois, ma Direction m'a demandé de mettre en place un fichier avec un formulaire de saisi et un formulaire de recherche, grace a votre aide, je leur ai présenté un prototype, qui depuis a été amélioré, il fonctionne très bien sur excel 2007 et 2003. Aujourd'hui on me demande de mettre ce fichier sur un de nos serveur qui tourne avec excel 2000. J'ai donc enregistré mon fichier en excel 97 - 2003 sur le serveur et quand j'ai voulu m'en servir un message d'erreur est apparu : "erreur de compilation, Projet ou Blibliothéque introuvable".
Ma question est-ce un problème de compatibilité et faut il tout refaire ?
Il s'agit probablement d'une référence manquante
Va dans l'éditeur VBA
Menu Outils - Références
Vois s'il y a une référence manquante (indiquée MANQUANT : )
Si oui, décoches-la
Si tu penses que cette référence est indispensable à ton code VBA, il va falloir trouver la même mais en version Excel 2000, sans doute d'une version inférieure et aller la cocher
Merci pour ta réponce rapide.
Effectivement, j'ai décoché les Références MANQUANTE. Et ça marche jusqu'au moment ou il me met :
"Erreur de compilation: Erreur de syntaxe" sur la ligne :
Maligne = Sheets("Donnée").Range("A65536").End(xlUp).Row 1
Cela veut dire que c'est mal écrit pour la version 2000 ?
La meilleure façon de charger une bibliothèque est d'utiliser le
Guid (Globally Unique Identifier) de la référence.
Pour connaître le nom d'une bibliothèque, on doit ouvrir dans la
fenêtre de l'éditeur de code, l'explorateur d'objets (raccourci F2).
Dans la liste déroulante "Toutes les bibliothèques" se retrouve le
nom des bibliothèques chargées pour un projet.
Lorsque l'on ajoute une bibliothèque en utilisant la barre des menus /
outils / références / on retrouve dans cette fenêtre une "appellation
descriptive" de la bibliothèque. Il ne faut pas confondre entre le
nom de la bibliothèque et l'appellation descriptive.
Le Guid d'une bibliothèque est inscrit dans la base de registre de Windows.
En conséquence, le chargement de cette dernière n'est pas assujetti à la
location du fichier source dans l'arborescence de l'explorateur Windows.
Il peut arriver dans quelques cas que Microsoft modifie le nom de la bibliothèque
pour des raisons qu'il lui appartienne. Pour être sûr de cette méthode, il faut
vérifier que ladite bibliothèque (son nom) est identique sur les différentes
versions d'Excel.
Voici une procédure pour trouver le "Guid" de toutes les bibliothèques chargées
dans un projet. Et oui, pour avoir cette information, il faut d'abord l'avoir chargé !
VB:
'------------------------------------------
Sub Lister_LesGuids_Références()
Dim X As Integer, Sh As Worksheet
Dim NbRef As Integer, A As Integer
Set Sh = Worksheets.Add(After:=Sheets(Sheets.Count))
On Error Resume Next
With Sh
.Name = "GUIDS"
.Cells(1, 1) = "Nom de la bibliothèque"
'Son appellation dans la fenêtre Reférences
.Cells(1, 2) = "Description"
.Cells(1, 3) = "Guid"
.Cells(1, 4) = "Major"
.Cells(1, 5) = "Minor"
.Cells(1, 6) = "Chemin complet"
With .Range("A1:F1")
.Font.Bold = True
.Font.Size = 12
End With
With Sh.Parent.VBProject.References
NbRef = .Count
X = 2
For A = 1 To NbRef
Sh.Cells(X, 1) = .Item(A).Name
Sh.Cells(X, 2) = .Item(A).Description
Sh.Cells(X, 3) = .Item(A).GUID
Sh.Cells(X, 4) = .Item(A).Major
Sh.Cells(X, 5) = .Item(A).Minor
Sh.Cells(X, 6) = .Item(A).fullpath
X = X + 1
Next
End With
.Range("A1").CurrentRegion.EntireColumn.AutoFit
End With
End Sub
'------------------------------------------
À partir de l'information, on peut charger les bibliothèques désirées
de cette manière :
Dans le ThisWorkbook, tu crées ce type de procédure :
Exemple : Pour charger la bibliothèque :
Library MSForms -> Nom de la bibliothèque (formulaire)
C:\Windows\system32\FM20.DLL -> Chemin et fichier source
Microsoft Forms 2.0 Object Library -> Appellation descriptive.
Exemple pour charger la référence du formulaire.
VB:
'----------------------------------------------
Private Sub Workbook_Open()
Dim Refs As Object, Ref As Object
On Error Resume Next
With ThisWorkbook
Set Refs = .VBProject.References
For Each Ref In Refs
If Ref.IsBroken Then
Refs.Remove Ref
End If
Next
.VBProject.References.AddFromGuid _
GUID:="{0D452EE1-E08F-101A-852E-02608C4D0BB4}", major:=2, minor:=0
End With
End Sub
'----------------------------------------------
Une information additionnelle, si tu utilises cette façon de faire pour
charger la référence émanant de l'ajout d'un contrôle supplémentaire
(Exemple : Calendar) à la boîte d'outils formulaire (userform), le code
s'exécutera normalement sur une nouvelle machine. Cependant, la procédure
ne permet pas d'ajouter le contrôle "Calendar", l'icône, dans la boîte à outils
du formulaire. D'ailleurs, je ne connais pas de code VBA capable de
faire ce travail.
Je n'ai jamais l'occasion de tester, moi, j'ai toutes mes bibliothèques!
;-))
Si tu as une version Microsoft Office différente de 2010, Ouvre Excel en créant une petite macro qui utilise la référence à Word.
Tu coches la bibliothèque "Microsoft Word xx Objects Library"
et dans la petite macro, un bout de code comme :
'-----------------------------------
Sub test()
Dim Wd As New Word.Application
Wd.Visible = True
MsgBox Wd.Name
Wd.Quit
End Sub
'-----------------------------------
Comme je n'ai pas la bibliothèque Word d'une version antérieure à Word 2010, je
suppose que lorsque j'ouvre le fichier, j'aurai une "bibliothèque manquante"...
Je veux bien tester sur ce fichier le bout de procédure dont tu fais référence.
Désolé, cela n'a pas fonctionné, dès l'ouverture du fichier, Excel a chargé la version Word
disponible sur mon ordinateur.
Si tu peux ouvre le fichier que tu as publié, ajouter un contrôle "RefEdit" (dans les contrôles
supplémentaires de la boîte à outils formulaire) dans un formulaire. J'ai volontairement
supprimé ce contrôle dans mon environnement VBA. Cela devrait, je crois, provoquer le
message de la bibliothèque manquante.
Merci d'assurer le suivi. Un excellent article sur le sujet par Chip Pearson à cette adresse : Missing References In VBA (en anglais)
En fait pour obtenir ce message, il faut que la référence (le fichier associé à cette référence)
soit manquante sur l'ordinateur.
Tous les objets sont interpellés dans la base de registre par le GUID (Globally Unique IDentifier).
Lorsqu'un "Guid" d'une référence est absent dans la base de registre, c'est là que l'on obtient le
message.
Il par conséquent normal que le bout de code dont tu faisais référence ne donnait
pas le résultat attendu.
Le bout de code en question est bien censé décocher les références manquantes ?
Code:
Set Refs = .VBProject.References
For Each Ref In Refs
If Ref.IsBroken Then
Refs.Remove Ref
End If
Next
J'avais (je ne saurais plus dire les détails, ça fait un certain temps) un fichier avec une référence manquante
Je m'attendais à ce que ce code décoche la ligne "MANQUANT" dans les références mais il a planté, et évidement ne l'a pas décochée
Je sais qu'un référence manquante peut altérer la façon dont le VBA fonctionne, et la question n'est pas de savoir si après avoir décoché cette référence manquante la suite du code fonctionne, c'est évidement une autre problématique
Est-ce que ce code a décoché RefEdit chez toi car manquant sur ton poste, avec mon fichier ?
ça n'avait simplement pas fonctionné chez moi sur un cas particulier
Je ne vais pas traduire tout l'article, mais l'essentiel se résume à ceci :
Lorsque l'on ajoute une référence à un projet (prenons l'exemple d'un contrôle "RefEdit" dans un formulaire), Excel enregistre le "Guid" (Globally Unique IDentifier). Ce Guid ressemble à ceci "{0D452EE1-E08F-101A-852E-02608C4D0BB4}". C'est le code d'identification de chaque objet (classe objet) inscrit dans la base de registre de Windows.
Lorsque l'on ouvre ce classeur sur un autre ordinateur, il est possible que ce "Guid" ne soit pas dans la base de registre de l'ordinateur et comme Excel n'enregistre que le "Guid" et non le fichier source (la bibliothèque -> fichier .DLL), on obtient le message à l'effet qu'il manque une bibliothèque -> référence manquante.
Pour ce qui est de notre petit test avec le contrôle "RefEdit", je n'ai eu aucun problème à ouvrir et à travailler avec le fichier que tu as joint. Même si sur mon ordinateur, le contrôle ne faisait plus partie de la boîte à outils du formulaire et que la référence n'était pas cochée, le fichier que tu as publié contenait le "Guid" et Excel a été capable de déceler que ce "Guid" existait dans la base de registre de mon ordinateur et sans que j'intervienne, il a chargé (cocher la référence) tout seul.
En conséquence, comme Excel a chargé la référence, j'aurais pu exécuter tout le code faisant référence à ce contrôle. Un petit détail toutefois, bien qu'il charge la référence, il n'ajoute pas le contrôle "RefEdit" à la boîte à outils du formulaire. L'usager doit le faire manuellement s'il veut ajouter un autre contrôle "RefEdit" à une autre application.
Lorsque l'on a un message à l'effet d'une bibliothèque manquante, habituellement la solution est de décocher la bibliothèque marquée "Manquante" dans la fenêtre de l'éditeur de code dans le sous-menu de "Outils" de la barre des menus. Il arrive aussi si l'on tente d'exécuter du code, qu'Excel devienne erratique ayant des difficultés à exécuter des fonctions de base comme instr()....
Ce devait être suffisant pour nous mettre la puce à l'oreille!
Dans le bouton de code :
VB:
'--------------------------
For Each Ref In Refs
If Ref.IsBroken Then
Refs.Remove Ref 'à remplacer par Refs.Remove Ref.NAME
End If
Next
'-------------------------
On définit IsBroken comme suit dans l'aide d'Excel :
'--------------------------------
Renvoie une valeur de type Boolean indiquant si l'objet Reference renvoie à une référence valide dans la base de registres. En lecture seule.
'-------------------------------
Je n'ai pas vraiment testé la procédure... mais je crois qu'il manque ceci : "NAME" DANS Refs.Remove Ref.NAME
Merci de ta réponse, personnellement j'avais à peu prêt compris l'article mais ton résumé servira surement à nos membres encore moins anglophones que moi
Tes précisions sont intéressantes, il faut absolument les conserver pour préciser le contexte, mais parfois je suis un peu terre à terre :
On a donc toujours pas réussi à créer une référence manquante sur ton poste pour que tu puisses tester cette partie de code, donc pas de certitude que ça marche... personnellement j'avais trouvé ce code sur l'excellente page de Silkyroad : Visual Basic Editor
A noter que comme toi dans ton code initial, chez lui la méthode Remove utilise bien l'objet référence (Ref) et non pas son nom (Ref.name)
Tu pourra voir aussi dans le fil que j'avais donné en lien au message #7 que pour enlever la référence Word j'utilise cette méthode Remove dans ma dernière intervention et qu'elle attend bien un objet Référence
Le fait est que si elle est manquante, ça n'étais pas passé chez moi
Si je me retrouve dans le cas d'une référence manquante je le re-testerais et j'essaierais de compléter ce fil
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.