VBA excel 2000 et 2003

Airwolf

XLDnaute Nouveau
Bonjour,

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 ?:(

Merci pour votre aide
 

tototiti2008

XLDnaute Barbatruc
Re : VBA excel 2000 et 2003

Bonjour Airworlf,

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
 

Airwolf

XLDnaute Nouveau
Re : VBA excel 2000 et 2003

Re,

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 ?

Slt
 

Airwolf

XLDnaute Nouveau
Re : VBA excel 2000 et 2003

Re,

J'aurais pu chercher pendant des jours et des jours, je me suis borné sur les erreurs que je n'avais même pas vu ça.

Merci pour ton aide, tout fonctionne parfaitement.

Une autre question, est-il possible d'instaler les Référence manquante ?

Encore merci
Slt
 

MichD

XLDnaute Impliqué
Re : VBA excel 2000 et 2003

La meilleure façon de charger une bibliothèque


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.
 

tototiti2008

XLDnaute Barbatruc
Re : VBA excel 2000 et 2003

Bonjour Airwolf, Bonjour MichD,

Pour éventuellement compléter les propos très précis de MichD, un fil parlant des références Outlook à titre d'exemple :

https://www.excel-downloads.com/thr...-outlook-dun-onglet-du-classeur-actif.189558/

Je me permet une petite question sur le sujet :
@MichD :
Personnellement, lorsque j'avais des soucis de référence manquante, le code

Code:
    Set Refs = .VBProject.References
    For Each Ref In Refs
        If Ref.IsBroken Then
            Refs.Remove Ref
        End If
    Next

n'a jamais fonctionné chez moi : plantage systématique, ça fonctionne bien chez toi ?
 

MichD

XLDnaute Impliqué
Re : VBA excel 2000 et 2003

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.
 

MichD

XLDnaute Impliqué
Re : VBA excel 2000 et 2003

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.
 

MichD

XLDnaute Impliqué
Re : VBA excel 2000 et 2003

Bonjour,

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.

Pour plus de détails, lire l'article proposé.
 

tototiti2008

XLDnaute Barbatruc
Re : VBA excel 2000 et 2003

Re,

Mon anglais est approximatif mais j'ai lu et je ne comprend pas bien ta réponse

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

Merci de intéresser au sujet ;)
 

MichD

XLDnaute Impliqué
Re : VBA excel 2000 et 2003

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
 

tototiti2008

XLDnaute Barbatruc
Re : VBA excel 2000 et 2003

Bonjour MichD,

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 :rolleyes: :

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
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 393
Messages
2 088 006
Membres
103 696
dernier inscrit
lgerbaud