Share via


Appel de code dans des personnalisations au niveau du document à partir de VBA

Vous pouvez configurer un projet au niveau du document pour Word 2007 ou Excel de manière à ce que le code VBA du document puisse appeler le code de l'assembly de personnalisation. Cela s'avère utile dans les scénarios suivant :

  • Vous souhaitez étendre le code VBA existant dans un document à l'aide des fonctionnalités d'une personnalisation au niveau du document associée au même document.

  • Vous souhaitez rendre disponibles des services développés dans une personnalisation au niveau du document pour les utilisateurs finaux qui peuvent accéder aux services en écrivant du code VBA dans le document.

S'applique à : Les informations contenues dans cette rubrique s'appliquent aux projets de niveau document pour les applications suivantes : Excel 2007, Excel 2010, Word 2007 et Word 2010. Pour en savoir plus, consultez Fonctionnalités disponibles par type d'application et de projet Office.

Les outils de développement Office dans Visual Studio fournissent une fonctionnalité semblable pour les compléments d'application. Si vous êtes en train de développer un complément, vous pouvez y appeler le code à partir d'autres solutions Microsoft Office. Pour plus d'informations, consultez Appel de code dans des compléments d'application à partir d'autres solutions Office.

Notes

Cette fonctionnalité ne peut pas être utilisée dans des projets de modèle Word. Elle ne peut l'être que dans des projets de document Word, de classeur Excel ou de modèle Excel.

Configuration requise

Pour que vous puissiez activer le code VBA à appeler dans l'assembly de personnalisation, votre projet doit remplir les conditions suivantes :

  • Le document doit avoir l'une des extensions de nom de fichier suivantes :

    • Pour Word : .docm ou .doc

    • Pour Excel : .xlsm, .xltm, .xls ou .xlt

  • Le document doit déjà contenir un projet VBA intégrant un code VBA.

  • Le code VBA du document doit pouvoir s'exécuter sans demander à l'utilisateur d'activer des macros. Vous pouvez approuver le code VBA à exécuter en ajoutant l'emplacement du projet Office à la liste des emplacements approuvés dans les paramètres du Centre de gestion de la confidentialité pour Word ou Excel.

  • Le projet Office doit contenir au moins une classe publique contenant un ou plusieurs membres publics que vous exposez au code VBA.

    Vous pouvez exposer des méthodes, des propriétés et des événements à VBA. La classe exposée peut être une classe d'élément hôte (telle que ThisDocument pour Word ou ThisWorkbook et Sheet1 pour Excel) ou une autre classe définie dans votre projet. Pour plus d'informations sur les éléments hôtes, consultez Vue d'ensemble des éléments hôtes et des contrôles hôtes.

Activation du code VBA à appeler dans l'assembly de personnalisation

Il existe deux façons différentes d'exposer des membres d'un assembly de personnalisation au code VBA du document :

  • Vous pouvez exposer des membres d'une classe d'élément hôte d'un projet Visual Basic à VBA. Pour cela, affectez à la propriété EnableVbaCallers de l'élément hôte la valeur True dans la fenêtre Propriétés pendant que l'élément hôte (autrement dit, le document, la feuille de calcul ou le classeur) est ouvert dans le concepteur. Visual Studio exécute automatiquement tout le travail requis pour permettre au code VBA d'appeler des membres de la classe.

  • Vous pouvez exposer à VBA des membres d'une classe publique quelconque d'un projet Visual C# ou des membres d'une classe d'élément non hôte d'un projet Visual Basic. Cette option vous offre davantage de liberté pour choisir les classes à exposer à VBA, mais requiert également plus d'étapes manuelles.

    Pour ce faire, vous devez exécuter les principales étapes suivantes :

    1. Exposez la classe à COM.

    2. Substituez la méthode GetAutomationObject d'une classe d'élément hôte de votre projet pour retourner une instance de la classe que vous exposez à VBA.

    3. Affectez la valeur True à la propriété ReferenceAssemblyFromVbaProject d'une classe d'élément hôte quelconque du projet. Cela permet d'intégrer la bibliothèque de types de l'assembly de personnalisation à l'assembly et d'ajouter une référence à la bibliothèque de types au projet VBA du document.

Pour des instructions détaillées, consultez Comment : exposer du code à VBA dans un projet Visual Basic et Comment : exposer du code à VBA dans un projet Visual C#.

Les propriétés EnableVbaCallers et ReferenceAssemblyFromVbaProject sont uniquement disponibles dans la fenêtre Propriétés au moment du design ; elles ne peuvent pas être utilisées au moment de l'exécution. Pour afficher les propriétés, ouvrez le concepteur d'un élément hôte dans Visual Studio. Pour plus d'informations sur les tâches spécifiques que Visual Studio effectue lorsque vous définissez ces propriétés, consultez la section Tâches effectuées par les propriétés d'élément hôte.

Notes

Si le classeur ou le document ne contient pas encore de code VBA ou si l'exécution du code VBA du document n'est pas approuvée, un message d'erreur s'affiche lorsque vous affectez la valeur True à la propriété EnableVbaCallers ou ReferenceAssemblyFromVbaProject. Cela est dû au fait que Visual Studio ne peut pas modifier le projet VBA dans le document dans ce type de situation.

Utilisation de membres du code VBA à appeler dans l'assembly de personnalisation

Après avoir configuré votre projet pour permettre au code VBA d'appeler l'assembly de personnalisation, Visual Studio ajoute les membres suivants au projet VBA dans le document :

  • Pour tous les projets, Visual Studio ajoute une méthode globale nommée GetManagedClass.

  • Pour les projets Visual Basic dans lesquels vous exposez les membres d'une classe d'élément hôte à l'aide de la propriété EnableVbaCallers, Visual Studio ajoute également une propriété nommée CallVSTOAssembly au module ThisDocument, ThisWorkbook, Sheet1, Sheet2 ou Sheet3 dans le projet VBA.

Vous pouvez utiliser la propriété CallVSTOAssembly ou la méthode GetManagedClass pour accéder aux membres publics de la classe que vous avez exposée au code VBA du projet.

Notes

Lors du développement et du déploiement de votre solution, vous pouvez ajouter le code VAP à plusieurs copies différentes du document. Pour plus d'informations, consultez Instructions pour l'ajout de code VBA au document.

Utilisation de la propriété CallVSTOAssembly dans un projet Visual Basic

Utilisez la propriété CallVSTOAssembly pour accéder aux membres publics que vous avez ajoutés à la classe d'élément hôte. Par exemple, la macro VBA suivante appelle une méthode appelée MyVSTOMethod et définie dans la classe Sheet1 d'un projet de classeur Excel.

Sub MyMacro()
    Sheet1.CallVSTOAssembly.MyVSTOMethod()
End Sub

Cette propriété est plus pratique pour appeler directement l'assembly de personnalisation que l'utilisation directe de la méthode GetManagedClass. CallVSTOAssembly retourne un objet qui représente la classe d'élément hôte que vous avez exposée au code VBA. Les membres et paramètres de méthode de l'objet retourné apparaissent dans IntelliSense.

La propriété CallVSTOAssembly a une déclaration similaire au code suivant. Ce code part du principe que vous avez exposé la classe d'élément hôte Sheet1 d'un projet de classeur Excel appelé ExcelWorkbook1 à VBA.

Property Get CallVSTOAssembly() As ExcelWorkbook1.Sheet1
    Set CallVSTOAssembly = GetManagedClass(Me)
End Property

Utilisation de la méthode GetManagedClass

Pour utiliser la méthode GetManagedClass globale, passez dans l'objet VBA qui correspond à la classe d'élément hôte qui contient votre substitution de la méthode GetAutomationObject. Utilisez ensuite l'objet retourné pour accéder à la classe que vous avez exposée à VBA.

Par exemple, la macro VBA suivante appelle une méthode nommée MyVSTOMethod définie dans la classe d'élément hôte Sheet1 d'un projet de classeur Excel appelé ExcelWorkbook1.

Sub CallVSTOMethod
    Dim VSTOSheet1 As ExcelWorkbook1.Sheet1
    Set VSTOSheet1 = GetManagedClass(Sheet1)
    VSTOSheet1.MyVSTOMethod
End Sub

La méthode GetManagedClass contient la déclaration suivante :

GetManagedClass(pdispInteropObject Object) As Object

Cette méthode retourne un objet qui représente la classe que vous avez exposée à VBA. Les membres et paramètres de méthode de l'objet retourné apparaissent dans IntelliSense.

Instructions concernant l'ajout de code VBA au document

Il existe plusieurs copies du document auxquelles vous pouvez ajouter du code VBA qui appelle la personnalisation au niveau du document.

Lors du développement et du test de votre solution, vous pouvez écrire du code VBA dans le document qui s'ouvre lorsque vous déboguez ou exécutez votre projet dans Visual Studio (autrement dit, le document situé dans le dossier de sortie de génération). Le code VBA que vous ajoutez au document est toutefois substitué la prochaine fois que vous générez le projet, car Visual Studio remplace alors le document dans le dossier de sortie de génération par une copie issue du dossier du projet principal.

Si vous souhaitez enregistrer le code VBA que vous ajoutez au document au moment du débogage ou de l'exécution de la solution, copiez le code VBA du document dans le dossier du projet. Pour plus d'informations sur le processus de génération, consultez Vue d'ensemble du processus de génération de solutions Office.

Lorsque vous êtes prêt à déployer votre solution, vous pouvez ajouter le code VBA à trois emplacements différents du document principal.

Dans le dossier du projet sur l'ordinateur de développement

Cet emplacement est pratique si vous avez le contrôle complet du code VBA du document et du code de la personnalisation . Comme le document est sur l'ordinateur de développement, vous pouvez facilement modifier le code VBA facilement si vous changez le code de personnalisation. Le code VBA que vous ajoutez à cette copie du document reste dans le document lorsque vous générez, déboguez et publiez votre solution.

Vous ne pouvez pas ajouter le code VBA au document pendant que celui-ci est ouvert dans le concepteur. Vous devez d'abord fermer le document dans le concepteur, puis ouvrir directement le document dans Word ou Excel.

Avertissement

Si vous ajoutez un code VBA qui s'exécute lorsque le document est ouvert, ce code risque de temps à autre d'endommager le document ou de l'empêcher de s'ouvrir dans le concepteur.

Dans le dossier de publication ou d'installation

Il peut parfois s'avérer approprié d'ajouter le code VBA au document dans le dossier de publication ou d'installation. Vous pouvez, par exemple, choisir cette option si le code VBA est écrit et testé par un développeur différent sur un ordinateur sur lequel Visual Studio n'est pas installé.

Si les utilisateurs installent directement la solution depuis le dossier de publication, vous devez ajouter le code VBA au document chaque fois que vous publiez la solution. Visual Studio remplace le document dans l'emplacement de publication lorsque vous publiez la solution.

Si les utilisateurs installent la solution à partir d'un dossier d'installation différent du dossier de publication, vous pouvez éviter d'ajouter le code VBA dans le document chaque fois que vous publiez la solution. Lorsqu'une mise à jour de publication est prête à être déplacée du dossier de publication vers celui d'installation, copiez tous les fichiers dans le dossier d'installation à l'exception du document.

Sur l'ordinateur de l'utilisateur final

Si les utilisateurs finaux sont des développeurs VBA qui appellent des services que vous fournissez dans la personnalisation au niveau du document, vous pouvez leur dire comment appeler votre code en utilisant la propriété CallVSTOAssembly ou la méthode GetManagedClass dans leurs propres copies du document. Lorsque vous publiez des mises à jour de la solution, le code VBA du document sur l'ordinateur de l'utilisateur final n'est pas remplacé, car le document n'est pas modifié par les mises à jour de publication.

Tâches effectuées par les propriétés d'élément hôte

Lorsque vous utilisez les propriétés EnableVbaCallers et ReferenceAssemblyFromVbaProject, Visual Studio exécute plusieurs ensembles de tâches.

EnableVbaCallers

Lorsque vous affectez à la propriété EnableVbaCallers d'un élément hôte la valeur True dans un projet Visual Basic, Visual Studio effectue les tâches suivantes :

  1. Il ajoute les attributs ComClassAttribute et ComVisibleAttribute à la classe d'élément hôte.

  2. Il substitue la méthode GetAutomationObject de la classe d'élément hôte.

  3. Il affecte la valeur True à la propriété ReferenceAssemblyFromVbaProject de l'élément hôte.

Lorsque vous affectez de nouveau à la propriété EnableVbaCallers la valeur False, Visual Studio effectue les tâches suivantes :

  1. Il supprime les attributs ComClassAttribute et ComVisibleAttribute de la classe ThisDocument.

  2. Il supprime la méthode GetAutomationObject de la classe d'élément hôte.

    Notes

    Visual Studio n'affecte pas automatiquement à la propriété ReferenceAssemblyFromVbaProject de nouveau la valeur False. Vous pouvez affecter manuellement la valeur False à cette propriété à l'aide de la fenêtre Propriétés.

ReferenceAssemblyFromVbaProject

Lorsque la propriété ReferenceAssemblyFromVbaProject d'un élément hôte d'un projet Visual Basic ou Visual C# a la valeur True, Visual Studio effectue les tâches suivantes :

  1. Il génère une bibliothèque de types pour l'assembly de personnalisation et l'incorpore dans l'assembly.

  2. Il ajoute une référence aux bibliothèques de types suivantes du projet VBA dans le document :

    • La bibliothèque de types de votre assembly de personnalisation

    • La bibliothèque de types Microsoft Visual Studio Tools pour Office Execution Engine 9.0 Cette bibliothèque de types est incluse dans Visual Studio Tools pour Office Runtime.

Lorsque vous affectez de nouveau à la propriété ReferenceAssemblyFromVbaProject la valeur False, Visual Studio effectue les tâches suivantes :

  1. Il supprime les références de la bibliothèque de types du projet VBA dans le document.

  2. Il supprime la bibliothèque de types incorporée de l'assembly.

Dépannage

Le tableau suivant répertorie quelques erreurs courantes et des suggestions pour les résoudre.

Erreur

Suggestion

Après avoir défini la propriété EnableVbaCallers ou ReferenceAssemblyFromVbaProject, un message d'erreur déclare que le document ne contient pas de projet VBA ou que vous n'avez pas l'autorisation d'accéder au projet VBA du document.

Vérifiez que le document dans le projet contient au moins une macro VBA, que le projet VBA a reçu un niveau de confiance suffisant pour s'exécuter et qu'il n'est pas protégé par un mot de passe.

Après avoir défini la propriété EnableVbaCallers ou ReferenceAssemblyFromVbaProject, un message d'erreur indique que la déclaration GuidAttribute est manquante ou endommagée.

Vérifiez que la déclaration GuidAttribute est localisée dans le fichier AssemblyInfo.cs ou AssemblyInfo.vb de votre projet et que cet attribut possède un GUID valide.

Après avoir défini la propriété EnableVbaCallers ou ReferenceAssemblyFromVbaProject, un message d'erreur indique que le numéro de version spécifié par AssemblyVersionAttribute n'est pas valide.

Vérifiez que la déclaration AssemblyVersionAttribute dans le fichier AssemblyInfo.cs ou AssemblyInfo.vb de votre projet est définie sur un numéro de version d'assembly valide. Pour plus d'informations sur les numéros de version d'assembly valides, consultez la classe AssemblyVersionAttribute.

Après avoir renommé l'assembly de personnalisation, le code VBA qui appelle l'assembly de personnalisation s'interrompt.

Si vous modifiez le nom de l'assembly de personnalisation après l'avoir exposé au code VBA, le lien entre le projet VBA du document et votre assembly de personnalisation est rompu. Pour résoudre ce problème, remplacez la valeur de la propriété ReferenceFromVbaAssembly dans votre projet par False, puis à nouveau par True, et remplacez ensuite toutes les références à l'ancien nom de l'assembly dans le code VBA par le nouveau nom.

Voir aussi

Tâches

Comment : exposer du code à VBA dans un projet Visual Basic

Comment : exposer du code à VBA dans un projet Visual C#

Procédure pas à pas : appel de code à partir de VBA dans un projet Visual Basic

Procédure pas à pas : appel de code à partir de VBA dans un projet Visual C#

Concepts

Publication de solutions Office

Autres ressources

Combinaison de VBA et de personnalisations au niveau du document

Programmation de personnalisations au niveau du document