Partager via


Combiner des personnalisations au niveau du document et VBA

Vous pouvez utiliser du code Visual Basic pour Applications (VBA) dans un document qui fait partie d’une personnalisation au niveau du document pour Microsoft Office Word ou Microsoft Office Excel. Vous pouvez appeler du code VBA dans le document à partir de l’assembly de personnalisation, ou vous pouvez configurer votre projet pour activer le code VBA dans le document pour appeler du code dans l’assembly de personnalisation.

S’applique à : Les informations contenues dans cette rubrique s’appliquent aux projets au niveau du document pour Excel et Word. Pour plus d’informations, consultez Fonctionnalités disponibles par type d’application et de projet Office.

Comportement du code VBA dans une personnalisation au niveau du document

Lorsque vous ouvrez votre projet dans Visual Studio, le document est ouvert en mode création. Le code VBA ne s’exécute pas lorsque le document est en mode création. Vous pouvez donc travailler sur le document et le code sans exécuter le code VBA.

Lorsque vous exécutez la solution, les gestionnaires d’événements dans VBA et l’assembly de personnalisation récupèrent les événements déclenchés dans le document, ainsi que les deux ensembles de code exécutés. Vous ne pouvez pas déterminer au préalable quel code s’exécutera avant l’autre ; vous devez déterminer cela par le biais de tests dans chaque cas individuel. Vous pouvez obtenir des résultats inattendus si les deux ensembles de code ne sont pas soigneusement coordonnés et testés.

Appeler le code VBA à partir de l’assembly de personnalisation

Vous pouvez appeler des macros dans des documents Word et appeler des macros et des fonctions dans des classeurs Excel. Pour cela, appliquez l’une des méthodes suivantes :

  • Pour Word, appelez la Run méthode de la Application classe.

  • Pour Excel, appelez la Run méthode de la Application classe.

    Pour chaque méthode, le premier paramètre identifie le nom de la macro ou de la fonction que vous souhaitez appeler, et les paramètres facultatifs restants spécifient les paramètres à passer à la macro ou à la fonction. Le premier paramètre peut avoir différents formats pour Word et Excel :

  • Pour Word, le premier paramètre est une chaîne qui peut être n’importe quelle combinaison de modèle, de module et de nom de macro. Si vous spécifiez le nom du document, votre code ne peut exécuter que des macros dans des documents liés au contexte actuel, pas seulement une macro dans n’importe quel document.

  • Pour Excel, le premier paramètre peut être une chaîne qui spécifie le nom de macro, un Range qui indique l’emplacement de la fonction ou un ID d’inscription pour une fonction DLL (XLL) inscrite. Si vous passez une chaîne, la chaîne est évaluée dans le contexte de la feuille active.

    L’exemple de code suivant montre comment appeler une macro nommée MyMacro à partir d’un projet au niveau du document pour Excel. Cet exemple suppose que MyMacro est défini dans Sheet1.

Globals.Sheet1.Application.Run("MyMacro", missing, missing, missing,
    missing, missing, missing, missing, missing, missing, missing,
    missing, missing, missing, missing, missing, missing, missing,
    missing, missing, missing, missing, missing, missing, missing,
    missing, missing, missing, missing, missing, missing);

Note

Pour plus d’informations sur l’utilisation de la variable globale missing à la place de paramètres facultatifs dans Visual C#, consultez Écrire du code dans les solutions Office.

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

Vous pouvez configurer un projet au niveau du document pour Word ou Excel afin que le code Visual Basic pour Applications (VBA) du document puisse appeler du code dans l’assembly de personnalisation. Ceci est utile dans les scénarios suivants :

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

  • Vous souhaitez rendre les services que vous développez dans une personnalisation au niveau du document à la disposition des utilisateurs finaux qui peuvent accéder aux services en écrivant du code VBA dans le document.

    Les outils de développement Office dans Visual Studio fournissent une fonctionnalité similaire pour les compléments VSTO. Si vous développez un complément VSTO, vous pouvez appeler du code dans votre complément VSTO à partir d’autres solutions Microsoft Office. Pour plus d’informations, consultez Appeler du code dans les compléments VSTO à partir d’autres solutions Office.

Note

Cette fonctionnalité ne peut pas être utilisée dans les projets de modèle Word. Il ne peut être utilisé que dans les projets de modèle Word, de classeur Excel ou de modèle Excel.

Spécifications

Avant de pouvoir activer le code VBA pour appeler l’assembly de personnalisation, votre projet doit répondre aux exigences suivantes :

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

    • Pour Word : .docm ou .doc

    • Pour Excel : .xlsm, .xltm, .xlsou .xlt

  • Le document doit déjà contenir un projet VBA qui contient du code VBA.

  • Le code VBA dans le document doit être autorisé à s’exécuter sans inviter l’utilisateur à activer les 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 qui contient un ou plusieurs membres publics que vous exposez à VBA.

    Vous pouvez exposer des méthodes, des propriétés et des événements à VBA. La classe que vous exposez peut être une classe d’élément hôte (par ThisDocument exemple, pour Word ou pour Excel) ou ThisWorkbookSheet1 une autre classe que vous définissez dans votre projet. Pour plus d’informations sur les éléments hôtes, consultez la vue d’ensemble des éléments hôtes et des contrôles hôtes.

Activer le code VBA pour appeler l’assembly de personnalisation

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

  • Vous pouvez exposer des membres d’une classe d’élément hôte dans un projet Visual Basic à VBA. Pour ce faire, définissez la propriété EnableVbaCallers de l’élément hôte sur True dans la fenêtre Propriétés tandis que l’élément hôte (autrement dit, le document, la feuille de calcul ou le classeur) est ouvert dans le concepteur. Visual Studio effectue automatiquement tout le travail nécessaire pour permettre au code VBA d’appeler des membres de la classe.

  • Vous pouvez exposer des membres dans n’importe quelle classe publique d’un projet Visual C# ou des membres d’une classe d’élément non hôte dans un projet Visual Basic à VBA. Cette option vous offre une plus grande liberté de choisir les classes que vous exposez à VBA, mais elle nécessite également des étapes manuelles supplémentaires.

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

    1. Exposez la classe à COM.

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

    3. Définissez la propriété ReferenceAssemblyFromVbaProject de n’importe quelle classe d’élément hôte dans le projet sur True. Cela incorpore la bibliothèque de types de l’assembly de personnalisation dans l’assembly et ajoute une référence à la bibliothèque de types au projet VBA dans le document.

    Pour obtenir des instructions détaillées, consultez Guide pratique pour 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 disponibles uniquement dans la fenêtre Propriétés au moment du design ; ils ne peuvent pas être utilisés 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 effectuées par Visual Studio lorsque vous définissez ces propriétés, consultez Tâches effectuées par les propriétés de l’élément hôte.

Note

Si le classeur ou le document ne contient pas déjà de code VBA ou si le code VBA du document n’est pas approuvé à exécuter, vous recevez un message d’erreur lorsque vous définissez la propriété EnableVbaCallers ou ReferenceAssemblyFromVbaProject sur True. Cela est dû au fait que Visual Studio ne peut pas modifier le projet VBA dans le document dans cette situation.

Utiliser des membres dans le code VBA pour appeler l’assembly de personnalisation

Après avoir configuré votre projet pour activer le code VBA pour 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 des 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 ThisDocumentThisWorkbookSheet1Sheet2Sheet3projet 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 dans le projet.

Note

Pendant que vous développez et déployez votre solution, il existe plusieurs copies différentes du document où vous pouvez ajouter le code VBA. Pour plus d’informations, consultez Instructions pour ajouter du code VBA au document.

Utiliser la propriété CallVSTOAssembly dans un projet Visual Basic

Utilisez la CallVSTOAssembly propriété 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 nommée MyVSTOMethod définie dans la Sheet1 classe dans un projet de classeur Excel.

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

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

La CallVSTOAssembly propriété a une déclaration similaire au code suivant. Ce code suppose que vous avez exposé la Sheet1 classe d’élément hôte dans un projet de classeur Excel nommé ExcelWorkbook1 à VBA.

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

Utiliser la méthode GetManagedClass

Pour utiliser la méthode globale GetManagedClass , transmettez l’objet VBA qui correspond à la classe d’élément hôte qui contient votre remplacement de la méthode GetAutomationObject . Ensuite, utilisez 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 qui est définie dans la Sheet1 classe d’élément hôte dans un projet de classeur Excel nommé ExcelWorkbook1.

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

La GetManagedClass méthode a 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 les paramètres de méthode de l’objet retourné apparaissent dans IntelliSense.

Instructions pour l’ajout de code VBA au document

Il existe plusieurs copies différentes du document où vous pouvez ajouter du code VBA qui appelle la personnalisation au niveau du document.

Lorsque vous développez et testez 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 dans le dossier de sortie de build). Toutefois, tout code VBA que vous ajoutez à ce document sera remplacé la prochaine fois que vous générez le projet, car Visual Studio remplace le document dans le dossier de sortie de build par une copie du document à partir du dossier du projet principal.

Si vous souhaitez enregistrer le code VBA que vous ajoutez au document lors du débogage ou de l’exécution de la solution, copiez le code VBA dans le document dans le dossier du projet. Pour plus d’informations sur le processus de génération, consultez Créer des solutions office.

Lorsque vous êtes prêt à déployer votre solution, il existe trois emplacements de document principaux dans lesquels vous pouvez ajouter le code VBA.

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

Cet emplacement est pratique si vous avez un contrôle complet sur le code VBA dans le document et le code de personnalisation. Étant donné que le document se trouve sur l’ordinateur de développement, vous pouvez facilement modifier le code VBA si vous modifiez 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 lorsqu’il est ouvert dans le concepteur. Vous devez d’abord fermer le document dans le concepteur, puis ouvrir le document directement dans Word ou Excel.

Caution

Si vous ajoutez du code VBA qui s’exécute lorsque le document est ouvert, dans de rares cas, ce code peut endommager le document ou l’empêcher d’ouvrir dans le concepteur.

Dans le dossier de publication ou d’installation

Dans certains cas, il peut être approprié d’ajouter le code VBA au document dans le dossier de publication ou d’installation. Par exemple, vous pouvez 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 la solution directement à partir du dossier de publication, vous devez ajouter le code VBA au document chaque fois que vous publiez la solution. Visual Studio remplace le document à l’emplacement de déploiement lorsque vous déployez 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 le dossier 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 indiquer comment appeler votre code à l’aide de la CallVSTOAssembly propriété ou de la GetManagedClass méthode dans leurs copies du document. Lorsque vous publiez des mises à jour de la solution, le code VBA du document sur l’ordinateur de l’utilisateur final ne sera pas remplacé, car le document n’est pas modifié par les mises à jour de publication.

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

Lorsque vous utilisez les propriétés EnableVbaCallers et ReferenceAssemblyFromVbaProject , Visual Studio effectue différents ensembles de tâches.

EnableVbaCallers

Lorsque vous définissez la propriété EnableVbaCallers d’un élément hôte sur 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 remplace la méthode GetAutomationObject de la classe d’élément hôte.

  3. Elle définit la propriété ReferenceAssemblyFromVbaProject de l’élément hôte sur True.

    Lorsque vous définissez la propriété EnableVbaCallers sur False, Visual Studio effectue les tâches suivantes :

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

  5. Elle supprime la méthode GetAutomationObject de la classe d’élément hôte.

    Note

    Visual Studio ne définit pas automatiquement la propriété ReferenceAssemblyFromVbaProject sur False. Vous pouvez définir cette propriété sur False manuellement à l’aide de la fenêtre Propriétés .

AssemblageDeRéférenceDepuisProjetVba

Lorsque la propriété ReferenceAssemblyFromVbaProject d’un élément hôte dans 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 incorpore la bibliothèque de types dans l’assembly.

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

    • Bibliothèque de types pour votre module de personnalisation.

    • Bibliothèque de types du moteur d'exécution de Microsoft Visual Studio Tools pour Office 9.0. Cette bibliothèque de types est incluse dans Visual Studio Tools pour le runtime Office.

    Lorsque la propriété ReferenceAssemblyFromVbaProject est définie sur False, Visual Studio effectue les tâches suivantes :

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

  4. Elle supprime la bibliothèque de types incorporée de l’assembly.

Troubleshoot

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

Erreur Suggestion
Après avoir défini la propriété EnableVbaCallers ou ReferenceAssemblyFromVbaProject , un message d’erreur indique que le document ne contient pas de projet VBA ou que vous n’êtes pas autorisé à accéder au projet VBA dans le document. Vérifiez que le document du projet contient au moins une macro VBA, que le projet VBA dispose d’une approbation suffisante pour s’exécuter et que le projet VBA 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 GuidAttribute déclaration est manquante ou endommagée. Vérifiez que la GuidAttribute déclaration se trouve dans le fichier AssemblyInfo.cs ou AssemblyInfo.vb dans votre projet, et que cet attribut est défini sur 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 celui-ci AssemblyVersionAttribute n’est pas valide. Vérifiez que la AssemblyVersionAttribute déclaration 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 AssemblyVersionAttribute classe.
Après avoir renommé l’assembly de personnalisation, le code VBA qui appelle l’assembly de personnalisation cesse de fonctionner. Si vous modifiez le nom de l’assembly de personnalisation après l’avoir exposé au code VBA, le lien entre le projet VBA dans le document et votre assembly de personnalisation est rompu. Pour résoudre ce problème, remplacez la propriété ReferenceFromVbaAssembly dans votre projet par False , puis revenez à True, puis remplacez les références à l’ancien nom d’assembly dans le code VBA par le nouveau nom d’assembly.