Numéro d'article: 280454 - Dernière mise à jour: jeudi 29 mars 2007 - Version: 5.1

Invite de mot de passe pour le projet VBA s'affiche une fois que Excel se ferme

A noterCet article s'applique à un système d'exploitation différent de celui que vous utilisez. Le contenu de l'article qui ne vous concerne peut-être pas est désactivé.

Sommaire

Agrandir tout | Réduire tout

Symptômes

Après que l'exécution d'une macro qui passe une référence d'un classeur contenant un projet VBA protégés par mot de passe à une bibliothèque dynamic-link ActiveX (DLL), vous êtes invité pour le mot de passe du projet VBA lorsque Excel se ferme.

Cause

Ce problème se produit si la DLL ActiveX ne libère pas correctement la référence au classeur qui contient le VBA protégés par mot de passe projet.

Résolution

Pour corriger ce problème, classes de conception dans votre DLL ActiveX afin que les références de classeur sont correctement libérées avant que les classes se terminer.

Un scénario courant où un événement Terminate classe ne se déclenche pas une est où vous avez une référence circulaire entre objets. Une référence circulaire serait créée si, par exemple, un objet parent crée un enfant objet et mains que les enfants objet une référence au parent. Si référence l'enfant au parent n'est pas libérée, l'objet parent se termine pas.

Les étapes décrites dans la section suivante expliquent comment une référence circulaire entre objets peut se produire et comment l'invite du mot de passe s'affiche si les objets contiennent une référence pour un classeur protégé lorsque Excel se ferme. La résolution, qui consiste à appeler une méthode pour un des objets pour rompre les références circulaires afin que les objets peuvent mettre fin à, est également décrite ci-dessous.

Plus d'informations

Procédure pour reproduire le problème

  1. Dans Visual Basic, créez un nouveau projet ActiveX DLL. Modifiez le nom du projet en ExcelTest.
  2. Remplacez le nom de Class1 par MyClass et puis ajoutez le code suivant à MyClass :
    Option Explicit
    
    Private oChild As ChildClass
    Private WorkbookRef As Object
    
    Private Sub Class_Initialize()
       Set oChild = New ChildClass
       Set oChild.Parent = Me
    End Sub
    
    Private Sub Class_Terminate()
       Set oChild.WorkbookRef = Nothing
       Set oChild.Parent = Nothing
       Set oChild = Nothing
       MsgBox "ParentClass Terminate Event"
    End Sub
    
    Public Sub Clear()
        Set oChild.Parent = Nothing
    End Sub
    
    Public Sub SetWorkbook(o As Object)
        Set WorkbookRef = o
        Set oChild.WorkbookRef = o
    End Sub
    					
  3. Ajoutez un autre module de classe, nommez-le ChildClass, puis ajoutez le code suivant à ChildClass :
    Public Parent As ParentClass
    Public WorkbookRef As Object
    					
  4. Générez «ExcelTest.dll».
  5. Créer un nouveau classeur dans Microsoft Excel. Appuyez sur ALT + F11 pour ouvrir l'éditeur Visual Basic.
  6. Dans le menu Insertion, cliquez sur UserForm pour ajouter un nouvel objet userform au projet VBA.
  7. Dans le menu Insertion, cliquez sur module pour ajouter un nouveau module au projet VBA. Ajoutez le code suivant au nouveau module :
    Public o As Object
    Sub MyMacro()
        UserForm1.Show
        Set o = CreateObject("ExcelTest.ParentClass")
        o.SetWorkbook ThisWorkbook
        'o.Clear  '<=== Remove comment to demonstrate the workaround.
        Set o = Nothing
    End Sub
    					
  8. Dans le menu Outils, sélectionnez Propriétés de projet VBA. Dans la boîte de dialogue qui s'affiche, cliquez sur l'onglet protection, puis cliquez pour sélectionner Verrouiller le projet d'affichage. Fournissez un mot de passe, puis cliquez sur OK.
  9. Enregistrez le classeur et fermez-le.
  10. Maintenant, pour reproduire le problème avec la VBA projet mot de passe apparaît lorsque Microsoft Excel se ferme :
    1. Ouvrez le classeur que vous avez enregistré à l'étape 9.

      Dans Microsoft Office Excel 2007, si vous êtes invité par un avertissement de sécurité qui indique que les macros ont été désactivées, cliquez sur Options. Dans la boîte de dialogue sécurité, cliquez sur activer ce contenu, puis cliquez sur OK.
    2. Effectuez l'une des actions suivantes :
      • Dans Excel 2007, cliquez sur macros dans le groupe de code dans l'onglet développeur. Si l'onglet développeur n'est pas cas un [[d'oreille, cliquez sur le Bouton Microsoft Office, cliquez sur Excel Options, cliquez sur standard, activez la case à cocher Afficher Developer tabulation dans le ruban et puis cliquez sur OK.
      • Dans Microsoft Office Excel 2003 ou dans une version antérieure d'Excel, cliquez sur macro dans le menu Outils, puis cliquez sur macros.
    3. Sélectionnez MaMacro dans la liste, puis cliquez sur exécuter.
    4. Faire disparaître l'objet userform affiche la macro.
    5. Quittez Microsoft Excel.
    6. Vous êtes invité à entrer le mot de passe du projet VBA lorsque Excel se ferme.
Lorsque vous utilisez les étapes ci-dessus pour reproduire le problème, notez que l'événement Terminate pour la classe MyClass n'est pas déclenché même après avoir défini son objet dans le paramètre Excel macro Nothing. (L'absence de MessageBox avec le message «MyClass Terminate événement» indique que cet événement ne se déclenche pas.)

Pour corriger le problème afin que la référence au classeur Excel est correctement libérée, supprimez le commentaire de la ligne désignée dans la macro de Excel, enregistrer la macro et répétez le test. Lorsque la référence de classeur est correctement libérée, Terminate événement l'objet se déclenche et vous demandera plus pour le VBA mot de passe du projet lorsque Excel se ferme.

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002
  • Microsoft Excel 2000 Standard
  • Microsoft Visual Basic 6.0 Édition professionnelle
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
Mots-clés : 
kbmt kbexpertisebeginner kbprb KB280454 KbMtfr
Traduction automatiqueTraduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 280454  (http://support.microsoft.com/kb/280454/en-us/ )
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.