Partager via


Procédure pas à pas : appel de code dans un complément d'application à partir de VBA

Mise à jour : novembre 2007

S'applique à

Les informations de cette rubrique s'appliquent uniquement aux projets Visual Studio Tools pour Office et versions de Microsoft Office spécifiés.

Type de projet

  • Projets au niveau de l'application

Version de Microsoft Office

  • Version 2007 de Microsoft Office System

  • Microsoft Office 2003

Pour plus d'informations, consultez Fonctionnalités disponibles par type d'application et de projet.

Cette procédure pas à pas explique comment exposer un objet d'un complément d'application à d'autres solutions Microsoft Office, y compris des compléments VBA (Visual Basic for Applications) et COM.

Bien que cette procédure utilise spécifiquement Excel, les concepts présentés ici s'appliquent à tous les projets de complément fournis par Visual Studio Tools pour Office.

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

  • Définition d'une classe susceptible d'être exposée à d'autres solutions Office.

  • Exposition de la classe à d'autres solutions Office.

  • Appel d'une méthode de la classe à partir du code VBA.

Remarque :

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

Composants requis

Les composants suivants sont nécessaires pour exécuter cette procédure pas à pas :

  • Visual Studio Tools pour Office (composant facultatif de Visual Studio 2008 Professional et Visual Studio Team System)

  • Microsoft Office Excel 2007

    Remarque :

    Vous pouvez également effectuer cette procédure à l'aide de Microsoft Office Excel 2003. Certaines instructions partent toutefois du principe que vous utilisez le ruban d'Excel 2007.

Visual Studio Tools pour Office est installé par défaut avec les versions répertoriées de Visual Studio. Pour vérifier s'il est installé, consultez Installation de Visual Studio Tools pour Office.

Pour une présentation vidéo, consultez la page Comment : appeler du code dans un complément d'application à partir de VBA.

Création du projet de complément

La première étape consiste à créer un projet de complément pour Excel.

Pour créer un projet

  • Créez un projet de complément Excel portant le nom ImporterDonnéesExcel à l'aide du modèle de projet de complément Excel intégré à la version 2007 de Microsoft Office System. Pour plus d'informations, consultez Comment : créer des projets Visual Studio Tools pour Office.

    Visual Studio ouvre le fichier de code ThisAddIn.cs ou ThisAddIn.vb et ajoute le projet ImporterDonnéesExcel à l'Explorateur de solutions.

Définition d'une classe susceptible d'être exposée à d'autres solutions Office

Cette procédure pas à pas a pour but d'appeler la méthode ImportData d'une classe nommée AddInUtilities dans votre complément à partir du code VBA. Cette méthode importe des données dans une nouvelle feuille de calcul du classeur actif et crée un DataSet simple destiné à contenir les données.

Pour exposer la classe AddInUtilities à d'autres solutions Office, vous devez faire rendre la classe publique et visible par COM. Vous devez également faire en sorte d'exposer l'interface IDispatch dans la classe. Le code de la procédure suivante vous explique comment respecter ces exigences. Pour plus d'informations, consultez Appel de code dans des compléments d'application à partir d'autres solutions Office.

Pour définir une classe susceptible d'être exposée à d'autres solutions Office

  1. Dans le menu Projet, cliquez sur Ajouter une classe.

  2. Dans la boîte de dialogue Ajouter un nouvel élément, remplacez le nom de la nouvelle classe par AddInUtilities, puis cliquez sur Ajouter.

    Le fichier AddInUtilities.cs ou AddInUtilities.vb s'ouvre dans l'éditeur de code.

  3. Ajoutez les instructions suivantes au début du fichier.

    Imports System.Data
    Imports System.Runtime.InteropServices
    Imports Excel = Microsoft.Office.Interop.Excel
    
    using System.Data;
    using System.Runtime.InteropServices;
    using Excel = Microsoft.Office.Interop.Excel;
    
  4. Remplacez la déclaration de la classe AddInUtilities vide par le code suivant.

    Ce code rend la classe AddInUtilities visible par COM et ajoute la méthode ImportData à la classe. Pour exposer l'interface IDispatch, la classe AddInUtilities implémente également une interface dotée de l'attribut InterfaceIsIDispatch.

    <System.Runtime.InteropServices.ComVisibleAttribute(True)> _
    <System.Runtime.InteropServices.InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
    Public Interface IAddInUtilities
        Sub ImportData()
    End Interface
    
    <System.Runtime.InteropServices.ComVisibleAttribute(True)> _
    <System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)> _
    Public Class AddInUtilities
        Implements IAddInUtilities
    
        Public Sub ImportData() Implements IAddInUtilities.ImportData
    
            ' Create a new DataTable.
            Dim ds As New DataSet()
            Dim dt As DataTable = ds.Tables.Add("Customers")
            dt.Columns.Add(New DataColumn("LastName"))
            dt.Columns.Add(New DataColumn("FirstName"))
    
            ' Add a new row to the DataTable.
            Dim dr As DataRow = dt.NewRow()
            dr("LastName") = "Chan"
            dr("FirstName") = "Gareth"
            dt.Rows.Add(dr)
    
            ' Add a new XML map to the collection.
            Dim activeWorkbook As Excel.Workbook = Globals.ThisAddIn.Application.ActiveWorkbook
            Dim xmlMap1 As Excel.XmlMap = activeWorkbook.XmlMaps.Add(ds.GetXmlSchema(), _
                "NewDataSet")
    
            ' Import the data.
            If Not (xmlMap1 Is Nothing) Then
                Dim lastSheet As Object = activeWorkbook.Sheets(activeWorkbook.Sheets.Count)
                Dim newSheet As Excel.Worksheet = CType(activeWorkbook.Sheets.Add( _
                    After:=lastSheet), Excel.Worksheet)
                newSheet.Name = "Imported Data"
                activeWorkbook.XmlImportXml(ds.GetXml(), xmlMap1, True, _
                    newSheet.Range("A1"))
            End If
        End Sub
    End Class
    
    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    [System.Runtime.InteropServices.InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IAddInUtilities
    {
        void ImportData();
    }
    
    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    [System.Runtime.InteropServices.ClassInterface(ClassInterfaceType.None)]
    public class AddInUtilities : IAddInUtilities
    {
        public void ImportData()
        {
            // Create a new DataTable.
            DataSet ds = new DataSet();
            DataTable dt = ds.Tables.Add("Customers");
            dt.Columns.Add(new DataColumn("LastName"));
            dt.Columns.Add(new DataColumn("FirstName"));
    
            // Add a new row to the DataTable.
            DataRow dr = dt.NewRow();
            dr["LastName"] = "Chan";
            dr["FirstName"] = "Gareth";
            dt.Rows.Add(dr);
    
            // Add a new XML map to the collection.
            Excel.Workbook activeWorkbook = Globals.ThisAddIn.Application.ActiveWorkbook;
            Excel.XmlMap xmlMap1 = activeWorkbook.XmlMaps.Add(ds.GetXmlSchema(), 
                "NewDataSet");
    
            // Import the data.
            if (xmlMap1 != null)
            {
                object lastSheet = activeWorkbook.Sheets[activeWorkbook.Sheets.Count];
                Excel.Worksheet newSheet = (Excel.Worksheet)activeWorkbook.Sheets.Add(
                    System.Type.Missing, lastSheet, 1, System.Type.Missing);
                newSheet.Name = "Imported Data";
    
                activeWorkbook.XmlImportXml(ds.GetXml(), out xmlMap1, true,
                    newSheet.get_Range("A1", System.Type.Missing));
            }
        }
    }
    

Exposition de la classe à d'autres solutions Office

Pour exposer la classe AddInUtilities à d'autres solutions Office, substituez la méthode RequestComAddInAutomationService de la classe ThisAddIn. Dans le cas de cette substitution, retournez une instance de la classe AddInUtilities.

Pour exposer la classe AddInUtilities à d'autres solutions Office

  1. Dans l'Explorateur de solutions, développez Excel.

  2. Cliquez avec le bouton droit sur ThisAddIn.cs ou ThisAddIn.vb, puis cliquez sur Afficher le code.

  3. Ajoutez le code suivant à la classe ThisAddIn.

    Private utilities As AddInUtilities
    
    Protected Overrides Function RequestComAddInAutomationService() As Object
        If utilities Is Nothing Then
            utilities = New AddInUtilities()
        End If
        Return utilities
    End Function
    
    private AddInUtilities utilities;
    
    protected override object RequestComAddInAutomationService()
    {
        if (utilities == null)
            utilities = new AddInUtilities();
    
        return utilities;
    }
    
  4. Dans le menu Générer, cliquez sur Générer la solution.

    Vérifiez que la solution est générée sans erreur.

Test du complément

Vous pouvez appeler la classe AddInUtilities à partir de plusieurs types de solutions Office. Cette procédure pas à pas utilise le code VBA dans un classeur Excel. Pour plus d'informations sur les autres types de solutions Office utilisables, consultez Appel de code dans des compléments d'application à partir d'autres solutions Office.

Pour tester votre complément

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

  2. Dans Excel, enregistrez le classeur actif en tant que Classeur Excel prenant en charge les macros (*.xlsm) dans un emplacement commode, tel que le Bureau.

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

    Remarque :

    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. Dans un premier temps, ce code reçoit un objet COMAddIn représentant le complément ImporterDonnéesExcel. Il utilise ensuite la propriété Object de l'objet COMAddIn pour appeler la méthode ImportData.

    Sub CallVSTOMethod()
        Dim addIn As COMAddIn
        Dim automationbject As Object
        Set addIn = Application.COMAddIns("ExcelImportData")
        Set automationObject = addIn.Object
        automationObject.ImportData
    End Sub
    
  7. Appuyez sur F5.

  8. Vérifiez qu'une nouvelle feuille Données importées a été ajoutée au classeur. Assurez-vous également que la cellule A1 contient le chaîne Chan et la cellule B1 la chaîne Gareth.

  9. Quittez Excel.

Étapes suivantes

Pour en savoir plus sur la programmation de compléments, consultez les rubriques ci-dessous :

Voir aussi

Tâches

Comment : créer des projets Visual Studio Tools pour Office

Concepts

Programmation de compléments d'application

Appel de code dans des compléments d'application à partir d'autres solutions Office

Développement de solutions Office

Élément hôte AddIn

Personnalisation des fonctionnalités de l'interface utilisateur à l'aide d'interfaces d'extensibilité

Architecture des compléments d'application