Partager via


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

Cette procédure pas à pas vous explique comment appeler une méthode dans une personnalisation au niveau du document pour Microsoft Office Excel à partir du code VBA du classeur. Cette procédure comporte trois étapes de base : ajout d'une méthode à la classe d'élément hôte Sheet1, exposition de la méthode au code VBA du classeur et appel de la méthode depuis le code VBA du classeur.

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.

Bien que cette procédure pas à pas utilise spécifiquement Excel, les concepts démontrés sont applicables à d'autres projets au niveau du document pour Word.

Cette procédure pas à pas décrit les tâches suivantes :

  • Création d'un classeur contenant du code VBA

  • Approbation de l'emplacement du classeur à l'aide du Centre de gestion de la confidentialité d'Excel

  • Ajout d'une méthode à la classe d'élément hôte Sheet1

  • Extraction d'une interface pour la classe d'élément hôte Sheet1

  • Exposition de la méthode au code VBA

  • Appel de la méthode à partir du code VBA

Notes

Il est possible que pour certains des éléments de l'interface utilisateur de Visual Studio, votre ordinateur affiche des noms ou des emplacements différents de ceux indiqués dans les instructions suivantes. Ces éléments dépendent de l'édition de Visual Studio dont vous disposez et des paramètres que vous utilisez. Pour plus d'informations, consultez Utilisation des paramètres.

Composants requis

Pour exécuter cette procédure pas à pas, vous devez disposer des composants suivants :

-

Une édition de Visual Studio 2010 qui inclut les outils de développement Microsoft Office. Pour plus d'informations, consultez [Configuration d'un ordinateur pour développer des solutions Office](bb398242\(v=vs.100\).md).
  • Excel 2007 ou Excel 2010.

Création d'un classeur contenant du code VBA

La première étape consiste à créer un classeur prenant en charge les macros et contenant une macro VBA simple. Pour que vous puissiez exposer le code d'une personnalisation à VBA, le classeur doit préalablement contenir le code VBA. Sinon, Visual Studio ne peut pas modifier le projet VBA pour permettre au code VBA d'appeler l'assembly de personnalisation.

Si vous possédez déjà un classeur contenant du code VBA que vous souhaitez utiliser, vous pouvez ignorer cette étape.

Pour créer un classeur contenant du code VBA

  1. Démarrez Excel.

  2. Enregistrez le document actif en tant que Classeur Excel prenant en charge les macros (*.xlsm) sous le nom ClasseurAvecVBA dans un emplacement commode, tel que le Bureau.

  3. Dans le ruban, cliquez sur l'onglet Développeur.

    Notes

    Si l'onglet Développeur n'est pas visible, vous devez préalablement l'afficher. Pour plus d'informations, consultez Comment : afficher l'onglet Développeur sur le ruban.

  4. Dans le groupe Code, cliquez sur Visual Basic.

    Visual Basic Editor s'ouvre.

  5. Dans la fenêtre Projet, double-cliquez sur ThisWorkbook.

    Le fichier de code de l'objet ThisWorkbook s'ouvre.

  6. Ajoutez le code VBA suivant au fichier de code. Ce code crée une fonction simple qui ne fait rien, hormis s'assurer qu'un projet VBA existe dans le classeur. Elle est nécessaire pour les étapes ultérieures de cette procédure pas à pas.

    Sub EmptySub()
    End Sub
    
  7. Enregistrez le document et fermez Excel.

Création du projet

Vous pouvez à présent créer un projet au niveau du document pour Excel qui utilise le classeur prenant en charge les macros créé un peu plus tôt.

Pour créer un projet

  1. Démarrez Visual Studio.

  2. Dans le menu Fichier, pointez sur Nouveau, puis cliquez sur Projet.

  3. Dans le volet de modèles, développez Visual C#, puis développez Office.

  4. Sélectionnez le nœud 2010 ou 2007.

  5. Dans la liste des modèles de projet, sélectionnez le projet de Classeur Excel.

  6. Dans la zone Nom, tapez CallingCodeFromVBA.

  7. Cliquez sur OK.

    L'Assistant Projet Visual Studio Tools pour Office s'ouvre.

  8. Sélectionnez Copier un document existant et, dans la zone Chemin d'accès complet du document existant, spécifiez l'emplacement du classeur ClasseurAvecVBA créé précédemment. Si vous utilisez votre propre classeur prenant en charge les macros, spécifiez son emplacement à la place.

  9. Cliquez sur Terminer.

    Visual Studio ouvre le classeur ClasseurAvecVBA dans le concepteur et ajoute le projet AppelCodeDeVBA à l'Explorateur de solutions.

Approbation de l'emplacement du classeur

Avant d'exposer le code de votre solution au code VBA du classeur, vous devez approuver VBA dans le classeur à exécuter. Plusieurs méthodes sont possibles. Dans le cas présent, vous allez accomplir cette tâche en approuvant l'emplacement du classeur dans le Centre de gestion de la confidentialité d'Excel.

Pour approuver l'emplacement du classeur

  1. Démarrez Excel.

  2. Cliquez sur l'onglet Fichier (pour Excel 2010) ou le bouton Microsoft Office (pour Excel 2007).

  3. Cliquez sur le bouton Options Excel.

  4. Dans le volet des catégories, cliquez sur Centre de gestion de la confidentialité.

  5. Dans le volet d'informations, cliquez sur Paramètres du Centre de gestion de la confidentialité.

  6. Dans le volet de catégories, cliquez sur Emplacements approuvés.

  7. Dans le volet d'informations, cliquez sur Ajouter un nouvel emplacement.

  8. Dans la boîte de dialogue Emplacement de Microsoft Office approuvé, recherchez le dossier qui contient le projet CallingCodeFromVBA.

  9. Sélectionnez Les sous-dossiers de cet emplacement sont également approuvés.

  10. Dans la boîte de dialogue Emplacement de Microsoft Office approuvé, cliquez sur OK.

  11. Dans la boîte de dialogue Centre de gestion de la confidentialité, cliquez sur OK.

  12. Dans la boîte de dialogue Options Excel, cliquez sur OK.

  13. Quittez Excel.

Ajout d'une méthode à la classe Sheet1

Une fois le projet VBA configuré, ajoutez une méthode publique à la classe d'élément hôte Sheet1 que vous pouvez appeler à partir du code VBA.

Pour ajouter une méthode à la classe Sheet1

  1. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur Sheet1.cs, puis sur Afficher le code.

    Le fichier Sheet1.cs s'ouvre dans l'éditeur de code.

  2. Ajoutez le code suivant à la classe Sheet1. La méthode CreateVstoNamedRange crée un objet NamedRange à la plage spécifiée. Cette méthode crée également un gestionnaire d'événements pour l'événement Selected de NamedRange. À une étape ultérieure de cette procédure, vous appellerez la méthode CreateVstoNamedRange à partir du code VBA du document.

    private Microsoft.Office.Tools.Excel.NamedRange namedRange1;
    
    public void CreateVstoNamedRange(Excel.Range range, string name)
    {
        if (!this.Controls.Contains(name))
        {
            namedRange1 = this.Controls.AddNamedRange(range, name);
            namedRange1.Selected += new Excel.DocEvents_SelectionChangeEventHandler(
                    namedRange1_Selected);
        }
        else
        {
            MessageBox.Show("A named range with this specific name " +
                "already exists on the worksheet.");
        }
    }
    
    private void namedRange1_Selected(Microsoft.Office.Interop.Excel.Range Target)
    {
        MessageBox.Show("This named range was created by Visual Studio " +
            "Tools for Office.");
    }
    
  3. Ajoutez la méthode suivante à la classe Sheet1. Cette méthode substitue la méthode GetAutomationObject() pour retourner l'instance actuelle de la classe Sheet1.

    protected override object GetAutomationObject()
    {
        return this;
    }
    
  4. Appliquez les attributs suivants avant la première ligne de la déclaration de la classe Sheet1. Ces attributs permettent à COM de voir la classe, mais sans générer d'interface de classe.

    [System.Runtime.InteropServices.ComVisible(true)]
    [System.Runtime.InteropServices.ClassInterface(
        System.Runtime.InteropServices.ClassInterfaceType.None)]
    

Extraction d'une interface pour la classe Sheet1

Avant d'exposer la méthode CreateVstoNamedRange au code VBA, vous devez créer une interface publique qui définit cette méthode et l'exposer à COM.

Pour extraire une interface pour la classe Sheet1

  1. Dans le fichier de code Sheet1.cs, cliquez n'importe où dans la classe Sheet1.

  2. Dans le menu Refactoriser, cliquez sur Extraire l'interface.

  3. Dans la boîte de dialogue Extraire l'interface, dans la zone Sélectionner des membres publics pour former l'interface, cliquez sur l'entrée de la méthode CreateVstoNamedRange.

  4. Cliquez sur OK.

    Visual Studio génère une nouvelle interface nommée ISheet1 et modifie la définition de la classe Sheet1 afin qu'elle implémente l'interface ISheet1. Visual Studio ouvre également le fichier ISheet1.cs dans l'éditeur de code.

  5. Dans le fichier ISheet1.cs, remplacez la déclaration de l'interface ISheet1 par le code suivant. Ce code rend l'interface ISheet1 publique et applique l'attribut ComVisibleAttribute pour rendre l'interface visible par COM.

    [System.Runtime.InteropServices.ComVisible(true)]
    public interface ISheet1
    {
        void CreateVstoNamedRange(Microsoft.Office.Interop.Excel.Range range, string name);
    }
    
  6. Générez le projet.

Exposition de la méthode au code VBA

Pour exposer la méthode CreateVstoNamedRange au code VBA dans le classeur, affectez la valeur True à la propriété ReferenceAssemblyFromVbaProject de l'élément hôte Sheet1.

Pour exposer la méthode au code VBA

  1. Dans l'Explorateur de solutions, double-cliquez sur Sheet1.cs.

    Le fichier ClasseurAvecVBA s'ouvre dans le concepteur, en affichant Sheet1.

  2. Dans la fenêtre Propriétés, sélectionnez la propriété ReferenceAssemblyFromVbaProject et remplacez sa valeur par True.

  3. Cliquez sur OK en réponse au message qui s'affiche.

  4. Générez le projet.

Appel de la méthode à partir du code VBA

Vous pouvez à présent appeler la méthode CreateVstoNamedRange depuis le code VBA du classeur.

Notes

Au cours de cette procédure, vous allez ajouter le code VBA au classeur pendant le débogage du projet. Le code VBA que vous ajoutez au document sera substitué la prochaine fois que vous générerez le projet, car Visual Studio remplacera alors le document dans le dossier de sortie de génération par une copie issue du dossier du projet principal. Si vous voulez enregistrer le code VBA, copiez-le dans le document qui figure dans le dossier du projet. Pour plus d'informations, consultez Appel de code dans des personnalisations au niveau du document à partir de VBA.

Pour appeler la méthode à partir du code VBA

  1. Appuyez sur F5 pour exécuter votre projet.

  2. Sous l'onglet Développeur, dans le groupe Code, cliquez sur Visual Basic.

    Visual Basic Editor s'ouvre.

  3. Dans le menu Insertion, cliquez sur Module.

  4. Ajoutez le code suivant au nouveau module.

    Ce code appelle la méthode CreateTable dans l'assembly de personnalisation. La macro accède à cette méthode en utilisant la méthode globale GetManagedClass pour accéder à la classe d'élément hôte Sheet1 que vous avez exposée au code VBA. La méthode GetManagedClass a été générée automatiquement au moment où vous avez défini la propriété ReferenceAssemblyFromVbaProject un peu plus tôt dans cette procédure.

    Sub CallVSTOMethod()
        Dim VSTOSheet1 As CallingCodeFromVBA.Sheet1
        Set VSTOSheet1 = GetManagedClass(Sheet1)
        Call VSTOSheet1.CreateVstoNamedRange(Sheet1.Range("A1"), "VstoNamedRange")
    End Sub
    
  5. Appuyez sur F5.

  6. Dans le classeur ouvert, cliquez sur la cellule A1 dans Sheet1. Vérifiez que le message s'affiche.

  7. Quittez Excel sans enregistrer les modifications.

Étapes suivantes

Pour en savoir plus sur l'appel de code dans les solutions Office depuis VBA, consultez les rubriques suivantes :

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

Autres ressources

Combinaison de VBA et de personnalisations au niveau du document

Programmation de personnalisations au niveau du document