9
Accueil Codes Tutoriels Forum Livres Emploi Services Connexion Déposé par ShareVB le 20/09/2007 19:28:22 Dans la catégorie Applications Vu : 21 639 fois Site perso Ecrire un message privé à l'auteur Commentaire sur cette source (9) Ajouter un commentaire et/ou une note Note: Aucunenote CS VB, VB.NET ASP.NET,ASP C, C++ ColdFusion PHP Javascript Delphi Flash Java Graphisme Irc Assembleur C# Mobilité SQL Foxpro Python Regex Flex Windev Trouver un code source : dans Tout le site Rechercher [ Dernières recherches ] Accueil > Tutoriels > Applications > CRÉER UN ADDIN AUTOMATION POUR EXCEL CRÉER UN ADDIN AUTOMATION POUR EXCEL Annonces Google QlikTech QlikView Outil d'analyse pour tout le monde. Regardez la demo. www.QlikView.com Information sur le tutoriel Description Ce tutoriel montre comment créer un Addin Automation pour Excel permettant de fournir des fonctions utilisables dans les formules des cellules. Tutorial Créer un Add-in Automation pour Excel en C# Introduction Depuis la version 2002 (XP) d’Office, Excel propose le concept d’Add-In Automation. Ceci est donc disponible dans Excel XP, Excel 2003 et Excel 2007. Ce concept d’Add-In Automation permet d’accéder aux méthodes publiques des Dll COM en tant que Fonctions Définies par l’Utilisateur, c’est-à-dire de pouvoir les utiliser directement dans les formules des cellules. Cet article décrit la manière de construire un Add-in Automation pour Excel et de le déployer. Je me suis inspiré fortement de “Create an Automation Add-In for Excel using .NET”. Version VB6 Vous pouvez tout à fait développer un tel Add-in avec Visual Basic 6 avec les options par défaut. Pour cela, il vous suffit de : Créer un projet « Dll ActiveX » Ajouter un « module de classe » Déclarer et implémenter vos méthodes dans ce module de classe : Option Explicit Public Function TestAutomationAddInt(ByVal a As Integer, ByVal b As Integer) As Integer TestAutomationAddInt = a + b End Function 'Un test de macros prenant deux flottants et en faisant la somme Public Function TestAutomationAddDouble(ByVal a As Double, _ ByVal b As Double) As Double TestAutomationAddDouble = a + b End Function D'autres ressources pour interfaces dotnet interop dans excel 2003 si cette page ne contient pas votre bonheur EXCELDOTNET : PROGRAMMER EXCEL EN DOTNET SANS VBA NI VSTO EXPORTER UN DATAGRIDVIEW VERS EXCEL CRÉER UN VRAI OCX EN DOTNET EXPORTER UNE BASE DE DONNEES MS ACCESS VERS MYSQL OU POSTGRESQL XLDOTNET : QUITTER EXCEL SANS Annonces Google Nos sponsors Derniers Blogs AFTERWORKS DES COMMUNAUTéS MICROSOFT SHAREPOINT : INTéRêT DE ZIPPER UN BACKUP [WINDOWS SERVER 2008 R2] CONFIGURATION MEILLEURS VŒUX ET PLUS POUR 2012 par themit SOMVC - TEMPLATE DE SOLUTION ASP.NET MVC3 La suite RSS Forum RE : [DéPLACé VB -> C#]PROJET C# ETUDE DE RE : [DéPLACé VB -> C#]PROJET C# ETUDE DE RE : PROJET C# ETUDE DE FONCTION par NHenry RE : PROJET C# ETUDE DE FONCTION par jack Ce site au démarrage Page 1 sur 9 CRÉER UN ADDIN AUTOMATION POUR EXCEL, Tutoriel N°743, 03/01/2012 http://www.csharpfr.com/tutoriaux/CREER-ADDIN-AUTOMATION-EXCEL_743.a...

CRÉER UN ADDIN AUTOMATION POUR EXCEL

  • Upload
    lolo406

  • View
    270

  • Download
    1

Embed Size (px)

Citation preview

Page 1: CRÉER UN ADDIN AUTOMATION POUR EXCEL

Accueil Codes Tutoriels Forum Livres Emploi Services Connexion

Déposé par ShareVB le 20/09/2007 19:28:22Dans la catégorie Applications

Vu : 21 639 fois

Site perso

Ecrire un message privé à l'auteur

Commentaire sur cette source (9)

Ajouter un commentaire et/ou une note

Note :

Aucune note

CS VB, VB.NET ASP.NET,ASP C, C++ ColdFusion PHP Javascript Delphi Flash Java Graphisme Irc Assembleur C# Mobilité SQL Foxpro Python Regex Flex Windev

Trouver un code source : dans Tout le site Rechercher [ Dernières recherches ]

Accueil > Tutoriels > Applications > CRÉER UN ADDIN AUTOMATION POUR EXCEL

CRÉER UN ADDIN AUTOMATION POUR EXCEL

Annonces Google

QlikTech QlikView

Outil d'analyse pour tout le monde. Regardez la demo. www.QlikView.com

Information sur le tutoriel

Description

Ce tutoriel montre comment créer un Addin Automation pour Excel permettant de fournir des fonctions utilisables dans les formules des cellules.

Tutorial

Créer un Add-in Automation pour Excel en C#

Introduction

Depuis la version 2002 (XP) d’Office, Excel propose le concept d’Add-In Automation. Ceci est donc disponible dans Excel XP, Excel 2003 et Excel 2007.

Ce concept d’Add-In Automation permet d’accéder aux méthodes publiques des Dll COM en tant que Fonctions Définies par l’Utilisateur, c’est-à-dire de pouvoir les utiliser directement dans les formules des cellules.

Cet article décrit la manière de construire un Add-in Automation pour Excel et de le déployer. Je me suis inspiré fortement de “Create an Automation Add-In for Excel using .NET”.

Version VB6

Vous pouvez tout à fait développer un tel Add-in avec Visual Basic 6 avec les options par défaut.

Pour cela, il vous suffit de :

Créer un projet « Dll ActiveX »Ajouter un « module de classe »Déclarer et implémenter vos méthodes dans ce module de classe :

Option Explicit

Public Function TestAutomationAddInt(ByVal a As Integer, ByVal b As Integer) As Integer

TestAutomationAddInt = a + b

End Function

'Un test de macros prenant deux flottants et en faisant la somme

Public Function TestAutomationAddDouble(ByVal a As Double, _

ByVal b As Double) As Double

TestAutomationAddDouble = a + b

End Function

D'autres ressources pour interfaces dotnet

interop dans excel 2003 si cette page ne

contient pas votre bonheur

EXCELDOTNET : PROGRAMMER EXCEL EN

DOTNET SANS VBA NI VSTO

EXPORTER UN DATAGRIDVIEW VERS

EXCEL

CRÉER UN VRAI OCX EN DOTNET

EXPORTER UNE BASE DE DONNEES MS

ACCESS VERS MYSQL OU POSTGRESQL

XLDOTNET : QUITTER EXCEL SANS

Annonces Google

Nos sponsors

Derniers Blogs

AFTERWORKS DES COMMUNAUTéS MICROSOFT

SHAREPOINT : INTéRêT DE ZIPPER UN BACKUP

[WINDOWS SERVER 2008 R2] CONFIGURATION

MEILLEURS VŒUX ET PLUS POUR 2012 par themit

SOMVC - TEMPLATE DE SOLUTION ASP.NET MVC3

La suite RSS

Forum

RE : [DéPLACé VB -> C#]PROJET C# ETUDE DE

RE : [DéPLACé VB -> C#]PROJET C# ETUDE DE

RE : PROJET C# ETUDE DE FONCTION par NHenry

RE : PROJET C# ETUDE DE FONCTION par jack

Ce site au démarrage

Page 1 sur 9CRÉER UN ADDIN AUTOMATION POUR EXCEL, Tutoriel N°743,

03/01/2012http://www.csharpfr.com/tutoriaux/CREER-ADDIN-AUTOMATION-EXCEL_743.a...

Page 2: CRÉER UN ADDIN AUTOMATION POUR EXCEL

'un test avec une plage de cellules

Public Function TestAutomationAddRange(ByVal r As Range) As Double

'On peut très bien accéder aux valeurs des plages de cellules

'Par contre, il peut arriver que définir les propriétés

'des cellules génère une erreur 800A03EC,

'erreur qu'Excel renvoie dans 90% des cas où il y a une erreur

'dans la définition de la propriété

'Par exemple, je n'ai pas trouvé de solution pour définir

'les propriétés de Range.Interior...

'par contre, définir la couleur de la police se fait sans erreur

On Error GoTo erreur

Dim ret As Double

Dim i As Integer, j As Integer

ret = 0

'fait la somme des valeurs des cellules de la plage fournie

For i = 1 To r.Cells.Rows.Count

For j = 1 To r.Cells.Columns.Count

Dim d As Double

d = 0

Dim cell As Range

Set cell = r.Cells(i, j)

'test si la valeur est définie et si c'est un entier...

If Not IsEmpty(cell.Value) Then

d = d + val(cell.Value2)

End If

ret = ret + d

Next

Next

TestAutomationAddRange = ret

Exit Function

erreur:

MsgBox Err.Description

End Function

CompilerEnregistrer votre dll avec « regsvr32 votre_dll.dll »

Pour déboguer, il suffit de faire Ctrl-F5 puis de choisir « Démarrer le programme » / « Start external program» (également accessible dans les propriétés du projet), de cliquer sur « … » puis de choisir le fichier « excel.exe » dans le dossier d’installation d’Office. Une fois que vous avez ajouté votre DLL dans la liste des macros Automation comme indiqué dans la partie « Tester », si vous mettez des breakpoints dans votre code, vous pourrez déboguer directement votre code à l’exécution (recalcule) de la macro.

Version .Net

Développement de base

Voici la méthode générale :

Créer une « bibliothèque de classes » par exemple « TestAutomationAddin »Dans les propriétés du projet, dans l’onglet « Compilation »/ « Build », vérifier que « Enregistrer pourInteropérabilité COM » / « Register for COM Interop » est coché.Toujours dans les propriétés du projet, dans l’onglet « Application », cliquer sur « Information sur l’Assemblage » / « Assembly Information », puis vérifier que « Rendre l’assemblage visible de COM » / « Make assembly COM-Visible» est cochée.Ajouter la référence COM (clic droit sur le projet, « Ajouter une référence » / « Add reference », onglet COM) : Microsoft Excel X.0 Object Library (où X peut être 10 (XP/2002), 11 (2003), 12 (2007)).Renommer la classe existante « Class1 » en « TestAutomationAddinClass » par exemple.Remplacer le code contenu dans cette classe par le code suivant :

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

using Microsoft.Office.Interop.Excel;

using System.Windows.Forms;

namespace TestAutomationAddin

{

/// <summary>

/// Interface définissant les "macros" qui seront disponibles

La suite RSS

Côté IT

Utiliser Office 365 pour un projet d?équipe -

Utiliser Office 365 pour un projet d?équipe -

SharePoint 2007 : Installation du Service Pack

SharePoint 2007 : Installation du Service Pack

Installation de SQL Server DENALI CTP3

Mise à jour de Windows 2003 R2 vers

Upgrade de SQL Server 2005 vers SQL Server

La suite RSS

Offres d'emploi

Recherche développeur Web

Recherche Développeur/Intégrateur (H/F)

Recherche un Développeur web expérimenté

Recherche Développeur Jeux iOS

Recherche Développeur Web CDI

Recherche Développeur Web & Multimédia

Recherche Développeur DotNet confirmé

Déposer une offre La suite RSS

Formations Video

Contao : Les fondamentaux

ZBrush 4 : Les fondamentaux

Microsoft Office Excel 2003 : Les

Microsoft Office Word 2003 : Les

Drupal 7 : Les fondamentaux

Photoshop Elements 10 : Les fondamentaux

Premiere Elements 10 : Les fondamentaux

La suite RSS

Appels d'offres

Site internet pour client

Budget : 4 000€

Developpement site de voyages pour un pays

Budget : 3 000€

Developpement module php pour application

Budget : 6 000€

La suite RSS

Logiciels

Academy System (16.9.2.0)

PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO

LettresFaciles 2011 (8.0.0.1)

DocTranslate (V3.0.1.0)

sDEVIS-FACTURES vlPRO (7.3.0.2)

+ de logiciels à télécharger

Vidéos drôles

Halloween Party

Terry Tate Office Linebacker Superbowl 2003

Jeu vidéo instructif

C'est un véritable vol !

Banana Song

Comment attraper la grippe A

Parodie Pub Window 7

La suite RSS

Sondage...

Page 2 sur 9CRÉER UN ADDIN AUTOMATION POUR EXCEL, Tutoriel N°743,

03/01/2012http://www.csharpfr.com/tutoriaux/CREER-ADDIN-AUTOMATION-EXCEL_743.a...

Page 3: CRÉER UN ADDIN AUTOMATION POUR EXCEL

/// dans Excel

/// </summary>

[InterfaceType(ComInterfaceType.InterfaceIsDual)]

[Guid("5B016456-A7A0-4cf0-A738-DCC9B400251D")]

public interface ITestAutomationAddin

{

//un test avec des entiers

int TestAutomationAddInt(int a,int b);

//un test avec des floattants

double TestAutomationAddDouble(double a, double b);

//un test avec une plage de cellule

double TestAutomationAddRange(Range r);

}

/// <summary>

/// Classe implémentant les "macros" définies

/// dans l'interface précédente

/// </summary>

[ClassInterface(ClassInterfaceType.None),

ComDefaultInterface(typeof(ITestAutomationAddin))]

public class TestAutomationAddin

: ITestAutomationAddin

{

#region ITestAutomationAddin Members

//Un test de macros prenant deux entiers et en faisant la somme

public int TestAutomationAddInt(int a, int b)

{

return a + b;

}

//Un test de macros prenant deux flottants et en faisant la somme

public double TestAutomationAddDouble(double a, double b)

{

return a + b;

}

//un test avec une plage de cellules

public double TestAutomationAddRange(Range r)

{

//On peut très bien accéder aux valeurs des plages de cellules

//Par contre, il peut arriver que définir les propriétés

//des cellules génère une erreur 800A03EC,

//erreur qu'Excel renvoie dans 90% des cas où il y a une erreur

//dans la définition de la propriété

//Par exemple, je n'ai pas trouvé de solution pour définir

//les propriétés de Range.Interior...

//par contre, définir la couleur de la police se fait

//sans erreur

double ret = 0;

try

{

//fait la somme des valeurs des cellules

//de la plage fournie

for (int i = 1; i <= r.Cells.Rows.Count; i++)

{

for (int j = 1; j <= r.Cells.Columns.Count; j++)

{

double val = 0;

Range cell = (Range)r[i, j];

//test si la valeur est définie et

//si c'est un entier...

if (cell.Value2 != null)

Vous êtes

Un Homme

Une Femme

Sondage fourni par ProSondage.com

Statistiques

1 863 837 membres174 nouveaux aujourd'hui

16 132 membres club

Comparez les prix

Motorola MILESTONEEntre 489€ et 489€

Visiter le guide achat

CalendriCode

Janvier 2012L M M J V S D

1

2 3 4 5 6 7 8

9 10 11 12 13 14 15

16 17 18 19 20 21 22

23 24 25 26 27 28 29

30 31

Consulter la suite du CalendriCode

Photothèque

Visiter la photothèque

CS Tool Box

Page 3 sur 9CRÉER UN ADDIN AUTOMATION POUR EXCEL, Tutoriel N°743,

03/01/2012http://www.csharpfr.com/tutoriaux/CREER-ADDIN-AUTOMATION-EXCEL_743.a...

Page 4: CRÉER UN ADDIN AUTOMATION POUR EXCEL

Double.TryParse(cell.Value2.ToString(),

out val);

ret += val;

}

}

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

return ret;

}

/// <summary>

/// Permet d'enregistrer nos macros de sorte

/// qu'Excel puisse les voir

/// </summary>

/// <param name="t"></param>

[ComRegisterFunctionAttribute]

public static void RegisterFunction(System.Type t)

{

Microsoft.Win32.RegistryKey key ;

//Excel recherche les composants COM "Programmable"

Microsoft.Win32.Registry.ClassesRoot.CreateSubKey("CLSID\\{" +

t.GUID.ToString().ToUpper() + "}\\Programmable");

//De plus, afin de ne pas avoir de message indiquant

//que "mscoree.dll" est introuvable

//On définit son chemin absolu (normalement

//dans C:\Windows\System32\mscoree.dll"

key = Microsoft.Win32.Registry.ClassesRoot.CreateSubKey(

"CLSID\\{" +

t.GUID.ToString().ToUpper() + "}\\InprocServer32");

key.SetValue("",

Environment.GetFolderPath(Environment.SpecialFolder.System) +

@"\mscoree.dll");

}

/// <summary>

/// Retire l'enregistrement de nos macros (nettoyage)

/// </summary>

/// <param name="t"></param>

[ComUnregisterFunctionAttribute]

public static void UnregisterFunction(System.Type t)

{

Microsoft.Win32.Registry.ClassesRoot.DeleteSubKey

("CLSID\\{" + t.GUID.ToString().ToUpper() +

"}\\Programmable");

}

#endregion

}

}

Compiler le projet pour produire bin\Debug\TestAutomationAddin.dll

Tester

Tester dans Excel 2002 (XP), Excel 2003

Dans le menu Outils, cliquer sur ComplémentsDans la boîte de dialogue Compléments, cliquer sur Automatisation. Dans la liste des serveurs COM enregistrés, sélectionner votre Add-In Automation « TestAutomationAddin. TestAutomationAddinClass » et cliquer sur OK.Votre Add-In Automation devrait apparaître dans la boîte de dialogue des Compléments. Cliquer OK pour fermer la boîte de dialogue des Compléments.

Page 4 sur 9CRÉER UN ADDIN AUTOMATION POUR EXCEL, Tutoriel N°743,

03/01/2012http://www.csharpfr.com/tutoriaux/CREER-ADDIN-AUTOMATION-EXCEL_743.a...

Page 5: CRÉER UN ADDIN AUTOMATION POUR EXCEL

Dans une cellule, ajouter =TestAutomationAddDouble(2,3 ;3,2)Normalement, la cellule devrait afficher « 5,5 »Dans une autre cellule, ajouter =TestAutomationAddRange(A3:B5)Normalement, cela devrait faire la somme des valeurs que vous avez saisi dans la plage « A3:B5 »

Tester dans Excel 2007

Cliquer sur le Bouton Microsoft Office, puis sur le bouton Options Excel.Cliquer sur Compléments.Dans Gérer, choisir Compléments Excel, puis cliquer sur Atteindre.Dans la boîte de dialogue Compléments, cliquer sur Automatisation.Dans la liste des serveurs COM enregistrés, sélectionner votre Add-In Automation « TestAutomationAddin. TestAutomationAddinClass » et cliquer sur OK.Votre Add-In Automation devrait apparaître dans la boîte de dialogue des Compléments. Cliquer OK pour fermer la boîte de dialogue des Compléments.Dans une cellule, ajouter =TestAutomationAddDouble(2,3 ;3,2)Normalement, la cellule devrait afficher « 5,5 »Dans une autre cellule, ajouter =TestAutomationAddRange(A3:B5)

Normalement, cela devrait faire la somme des valeurs que vous avez saisi dans la plage « A3:B5 »

Débogguer

Pour déboguer facilement, il suffit dans les propriétés de votre Bibliothèque de classes, dans l’onglet « Débogage » / « Debug » puis de choisir « Démarrer le programme externe » / « Start external program », de cliquer sur « … » puis de choisir le fichier « excel.exe » dans le dossier d’installation d’Office. Une fois que vous avez ajouté votre DLL dans la liste des macros Automation comme indiqué dans la partie « Tester », si vous mettez des breakpoints dans votre code, vous pourrez déboguer directement votre code à l’exécution (recalcule) de la macro.

Déploiement .Net

Déploiement manuel

Pour enregistrer la dll après l’avoir déplacée dans un autre dossier, exécuter « regasm » avec l’option /codebase et le nom du fichier de la dll (regasm doit se trouver dans « C:\Windows\Microsoft .Net\Framework\vX.Y.Z\). Si vous obtenez une warning du fait que l’assembly n’est pas signé, ce n’est pas grave.

Déploiement par projet de déploiement

Pour que l’enregistrement se fasse correctement lors de l’installation par un projet de déploiement, il est nécessaire d’ajouter une « custom action ».

La procédure est la suivante :

Dans le projet de votre bibliothèque de classe, ajouter un « Installer » nommé « SelfRegisterInstaller » avec le code suivant à l’intérieur :

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Configuration.Install;

using System.Runtime.InteropServices;

namespace TestAutomationAddin

{

/// <summary>

/// Classe permettant d'enregistrer votre DLL pour Interop COM

/// avec l'option CodeBase et l'appel systématique

/// des méthodes ComRegisterFunction/ComUnregisterFunction

/// </summary>

[RunInstaller(true)]

public partial class SelfRegisterInstaller : Installer

{

public SelfRegisterInstaller()

{

InitializeComponent();

}

//enregistre l'assembly et appelle les méthodes marquées

//comme ComRegisterFunction

public override void Install(System.Collections.IDictionary stateSaver)

{

base.Install(stateSaver);

//appel le service d'enregistrement

//interop COM "Regasm /codebase"

RegistrationServices reg = new RegistrationServices();

reg.RegisterAssembly(this.GetType().Assembly, AssemblyRegistrationFlags.SetCodeBase);

}

//désenregistre l'assembly et appelle les méthodes marquées

//comme ComUnregisterFunction

Page 5 sur 9CRÉER UN ADDIN AUTOMATION POUR EXCEL, Tutoriel N°743,

03/01/2012http://www.csharpfr.com/tutoriaux/CREER-ADDIN-AUTOMATION-EXCEL_743.a...

Page 6: CRÉER UN ADDIN AUTOMATION POUR EXCEL

public override void Uninstall(System.Collections.IDictionary savedState)

{

//désenregistre de l'interop COM

RegistrationServices reg = new RegistrationServices();

reg.UnregisterAssembly(this.GetType().Assembly);

base.Uninstall(savedState);

}

}

}

Dans le projet de Setup, dans l’ « Editeur du système de fichiers », ajouter la « sortie principale » du projet de Bibliothèque de classes dans le dossier « Dossier de l’application » / « Application Folder »dans l’« Editeur d’actions personnalisées » (clic droit sur le projet de Setup, « Vues » / « View »), ajouter une « action personnalisée » dans « Install » et « Uninstall » en choisissant « Sortie principale » / « Primary Output» (dans le dossier « Dossier de l’application » / « Application Folder »)

Tout ceci permet d’exécuter les méthodes ComRegisterFunction de la DLL Addin Automation à l’installation et à la désinstallation.

Points Importants

La bibliothèque de classes doit être enregistrée avec regasm.exe ou en cochant l’option « Enregistrer pour interopérabilité COM ».Pour que Excel trouve notre Add-In Automation, il faut ajouter une sous clé « Programmable » dans l’enregistrement de la classe en tant que classe COM (dans HKCR\CLSID\{xxx}\.) . Ceci doit se faire dans deux méthodes static marquées avec les attributs ComRegisterFunction et ComUnregisterFunction.Pour empêcher le message d’erreur “mscoree.dll est introuvable”, il faut changer la valeur inscrite dans la sous clé “InProcServer32”, pour mettre le chemin complet de « mscoree.dll ».Il est nécessaire de marquer la classe qui implémente le complément Automation avec l’attribut ClassInterface. Vous avez ensuite deux solutions pour donner une valeur à cet attribut :ClassInterface.None : il faut alors définir une « interface par défaut » avec toutes les méthodes accessibles par Excel qu’implémente la classe marquée. Cela vous permet de définir explicitement ce qui est exposé. C’est la méthode recommandée pour les développements de production.ClassInterface.AutoDual : il suffit juste de définir et d’implémenter les méthodes directement et l’interface COM sera générée automatiquement. Cette méthode est non recommandée car les identifiants des interfaces peuvent changer lors que la classe change.On peut marquer « l’interface par défaut » avec l’attribut InterfaceType pour spécifier comment sont exposées ses méthodes :ComInterfaceType.InterfaceIsIDispatch : les méthodes sont résolues à l’exécution et ne sont donc pas incluses dans la typelib générée pour la bibliothèque de classe. On pourra les utiliser mais elles n’apparaîtront pas dans l’Intellisense ou dans la liste des macros disponibles.ComInterfaceType.InterfaceIsIUnknown : les méthodes sont résolues à la compilation et sont donc incluses dans la typelib générée pour la bibliothèque de classe. On pourra les utiliser et elles apparaîtront dans l’Intellisense et dans la liste des macros disponibles.ComInterfaceType.InterfaceIsDual : les méthodes peuvent être résolues à l’exécution ou à la compilation et sont donc incluses dans la typelib générée pour la bibliothèque de classe. On pourra les utiliser et elles apparaîtront dans l’Intellisense et dans la liste des macros disponibles.On peut préciser explicitement « l’interface par défaut » de la classe de nos macros Automation avec l’attribut ComDefaultInterface.Il est nécessaire de définir au moins le Guid de « l’interface par défaut » afin de ne pas avoir à réenregistrer la bibliothèque de classe à chaque fois que l’on ajoute/supprime une méthode à cet interface.Pour faire l’enregistrement correctement, on utilise les RegistrationServices dans un Custom Installer (un composant qui dérivent de la classe Installer et qui est marquée avec l’attribut RunInstaller(true)) et qui sera appelé à notre demande par une Custom Action.

Problèmes courants

Quand vous développez des Addins Automation, vous pouvez vous trouver confronté à un certain nombre de problèmes :

Problème d’installation : là, ca va il y a des solutionsProblème « 0x800A03EC » lors de l’exécution des méthodes exposées…là par contre…

Problème d’enregistrement

Description

Quand vous enregistrez votre DLL .Net en tant qu’Add-in Automation dans Excel, vous pouvez recevoir le message d’erreur : « Le fichier que vous avez spécifié ne contient pas de nouveau serveur Automation, ou vous ne disposez pas des privilèges suffisants pour enregistrer le serveur Automation. » ou en anglais : « The file you selected doesnot contain a new Automation Server, or you do not have sufficient privileges to register the Automation Server. ».

Cause

Cela est dû au fait qu’une DLL .Net ne contient pas les points d’entrée COM. En fait, c’est la dll « mscoree.dll », constituant le cœur du framework .Net, qui expose n’importe quelle DLL .Net en tant que COM. C’est cette DLL qui sert de InprocServer et qui localise la DLL .Net qui implémente les méthodes demandées.

Solution

Si vous obtenez cette erreur, c’est que vous avez cliqué sur « Parcourir » et que vous avez choisi votre DLL dans son dossier. Mais cette méthode ne marche pas. Normalement, votre Add-In Automation devrait se trouver dans la liste qui se trouve à côté du bouton « Parcourir ». Il vous suffit de choisir votre DLL dans la liste, sous le nom « espace_de_nom.nom_classe ».

Problème de mscoree.dll

Description

Quand vous ajoutez (ou que vous modifiez) votre DLL à la liste des « macros complémentaires », un message d’erreur « mscoree.dll est introuvable, voulez-vous supprimer le complément ?» apparaît.

Cause

Cela vient du fait que pour une raison quelconque, Excel recherche « mscoree.dll » dans le dossier de votre DLL (ou du moins pas dans le dossier System32) et forcément ne la trouve pas…Cela vient du fait que « regasm » a enregistré dans la sous clé « InProcServer32 » de l’enregistrement classique des classes COM, « mscoree.dll » sans son chemin.

Solution

Page 6 sur 9CRÉER UN ADDIN AUTOMATION POUR EXCEL, Tutoriel N°743,

03/01/2012http://www.csharpfr.com/tutoriaux/CREER-ADDIN-AUTOMATION-EXCEL_743.a...

Page 7: CRÉER UN ADDIN AUTOMATION POUR EXCEL

Normalement, le code présenté ci-dessus devrait avoir résolu le problème. Cependant la solution manuelle reste de localiser l’enregistrement de la classe et de modifier la sous clé « InProcServer32 » et d’ajouter le chemin complet de « mscoree.dll » à savoir « C:\Windows\System32\mscoree.dll ».

Problème de HRESULT 0x800A03EC

Alors là, c’est beaucoup plus compliqué. Tout d’abord, c’est une exception qui survient à l’exécution et qui peut donner l’affichage « #VALEUR » ou « #ERREUR » ou « #NOM » ou « #REF », ou alors la valeur que renvoie votre fonction au moment de l’exception suivant l’humeur d’Excel et des try/catch que vous avez mis dans votre code... En principe, cette erreur est renvoyée quand vous avez défini une valeur invalide pour une propriété d’un objet Excel quelque soit cette valeur invalide et quelque soit la propriété en question, c’est-à-dire dans 90% des cas.

J’ai eu le cas par exemple pour définir la couleur de fond d’une cellule (et je n’ai toujours pas trouvé de solution, d’autant que le même code marche parfaitement dans une macro du classeur). Par contre, définir la couleur de la police marche parfaitement.

Bibliographie

Voici quelques articles qui parlent d’Add-in Automation :

Q291392 - Excel COM add-ins and Automation add-insQ285337 - How To Create a Visual Basic Automation Add-in for Excel Worksheet FunctionsQ278328 - XL2002: How to Mark an Automation Add-In Function as VolatileHow to: Use Managed Code as an Automation Add-In for Excel (C# Programming Guide)Create an Automation Add-In for Excel using .NET

Commentaires

COMMENTAIRE DE LEGALANT LE 27/09/2007 21:54:13

ok sur le pc de developpement mais lors du deploiement de cet addin sur un pc ne disposant pas de visual studio aucune méthode n'apparait dans les macros disponibles. Elles apparaissent pourtant ds l'intellisense. Aussi 1 new sur une variable TestAutomationAddin declenche une erreur.

COMMENTAIRE DE SHAREVB LE 01/10/2007 23:10:36

euh, normalement, il suffit que le framework .Net soit installé...

voici le code complet de ce tutoriel : http://www.csharpfr.com/codes/CREER-ADDIN-AUTOMATION-EXCEL_44236.aspx

ShareVB

COMMENTAIRE DE LEGALANT LE 03/10/2007 11:09:09

Merci pr le code mais en fait est-ce-que cela ne pourrait pas etre dû à un packaging pas terrible de visual ou autre (option non cochée)? En effet au risque de me repeter sur un pc disposant du framework .net et pas de visual : automation = ok; intellisense = ok; new sur une variable = erreur "Run-time error '2147220999 (800401f9)' : Automation error Error in the DLL"Merci encore pr ton aide :)

COMMENTAIRE DE BISTOURY LE 08/10/2007 15:57:37

Vue comment le COM-INTEROP est user-friendly, voici quelques trucs qui devraient vous simplifier la vie... (enfin bon...qui auraient facilité la mienne ;) )1/ si vous utilisez Excel, mettez un fichier EXCEL.EXE.CONFIG, dans le dossier ou se situe le EXCEL.exe, contenant : <configuration><startup>

<supportedRuntime version="v2.0.50727" /></startup></configuration>

-> ceci est la cause de l'erreur automation "Run-time error '2147220999' ..."-> changer la version en fonction du framework que vous utilisez-> attention, dans tous le cas Excel utilisera UNIQUEMENT cette version specifique du framework. Il est donc a proiri impossible d'utiliser en même temps des librairies COM (Excel COM Add-in ou simple DLL) utilisant 2 versions différentes du framework. Le framework 1 et 1.1 etant compatible avec le framework 2, ceci ne devrait pas trop poser de probleme.-> ce fichier a été testé avec Excel 2002 (XP)

2/ Evitez au maximum les interfaces Autodual : à la moindre modif de la classe, BOUM ! -> définir d'abord l'interface :<Guid("XXX"_InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _Public Interface IMyClass-> puis implementer l'interface dans la classe :<Guid("YYY"), _ClassInterface(ClassInterfaceType.None)> _Public Class MyClass Implements IMyClass

Désolé pour la syntaxe mais je ne connais que VB .NET, le C# étant relativement voisin (...pas taper...), vous devrier pouvoir vous debrouiller...

quelques lien utiles :http://www.codeproject.com/vb/net/MusaExposingCOM.asphttp://www.codeproject.com/dotnet/nettocom.asphttp://www.dotnetinterop.com/faq/?q=ClassInterface

COMMENTAIRE DE ALPHARD2008 LE 28/12/2007 13:57:39

Bonjour ShareVB,

Merci pour ce tutoriel dont je me suis beaucoup inspire pour ecrire une dll qui fait l'interface entre excel et un serveur de donnees temps reel.

J'ai neanmoins encore un probleme:Mon serveur "pousse" les donnees (quand justifie) aux clients (plutot que l'inverse car l'aspect "justifie" est hors de portee des clients) et ma dll les recoit bien en utilisant le principe que tu exposes. Par contre je n'ai pas trouver la facon de raffraichir automatiquement mes cellules excel (ce qui est le but ultime).

Par exemple: supposons que mon serveur recupere une mesure (que l'on peut supposer de type simple) en flux continu et la met a disposition de ses clients. Mon but est de coder une dll qui affiche cette donnee en actualisation constante (raffraichie disons chaque seconde) dans une cellule excel sans "bloquer" l'interface de sorte que l'utilisateur puisse exploiter son client excel normalement (idealement que le rafraichissement soit transparent). Jusque-la j'arrive a "rapatrier" mon flux jusque dans la dll COM mais je coince sur le dernier segment: l'affichage temps reel. Je pense que cela vient de ce que la methode interfacee rapatrie une fois pour

Page 7 sur 9CRÉER UN ADDIN AUTOMATION POUR EXCEL, Tutoriel N°743,

03/01/2012http://www.csharpfr.com/tutoriaux/CREER-ADDIN-AUTOMATION-EXCEL_743.a...

Page 8: CRÉER UN ADDIN AUTOMATION POUR EXCEL

Nom d'utilisateur :

Mot de passe :

Code C# Tous les langages Tutoriels Forum Livres Groups Logiciels Boutique

toutes ma donnee une bonne fois pour toute: meme en recalculant ma feuille (F9), la valeur de la cellule ne s'actualise pas, alors que si je donne ma methode a une autre cellule, cette derniere renvoie la bonne valeur au moment ou je tape "Entree". Pour etre encore plus precis: a t = 0, ma mesure vaut 1, en excutant ma methode MaMethode() en formule de ma cellule C a cet instant, la valeur renvoyee (et affichee dans ma cellule C) est bien 1. A l'instant t = 1, ma mesure est passee a 2, mais ma cellule C vaut toujours 1! Pourtant l'objet dans la dll, auquel MaMethode se refere (MaMethode ne fait qu'afficher cet objet rien de plus), est a jour. Taper F9 ne raffraichit pas la valeur de ma cellule, mais si j'execute MaMethode en formule d'une cellule C', alors la valeur affichee est bien 2, cellule qui se comporte ensuite comme C. Mon but est que si l'objet de la dll s'update, la valeur de la cellule s'update aussi et je ne sais pas comment faire (bouhhh)!

Certains logiciel payant propose ce type de service dans excel. Comment font-ils?

Desole pour la longueur du post et merci d'avance pour ton aide (et bonne annee 2008)

COMMENTAIRE DE SHAREVB LE 30/12/2007 20:42:47

salut,

En fait, j'aurais du intitulé cette source : "fournir ses propres fonctions de macros" car il ne s'agit pas d'un addin au sens habituel...pour ce que tu cherches à faire, il faut créer un "Addin partagé"/"Shared Addin" (modèle de projet VS2005) qui va recevoir un objet Application complet

d'Excel sur lequel tu pourras associer des handlers pour les évènements d'ouverture de workbook, ajouter des menus, modifier les cellules du classeurs ouvert, enfin bref, tout faire, y compris un timer qui rafraichit une cellule toute les N secondes à partir de l'ouverture du classeur...

enfin, voici des liens utiles :http://support.microsoft.com/kb/302901http://msdn2.microsoft.com/en-us/library/aa537184(office.11).aspx

tu as donc deux solutions : les addins en C# ou les macros en vb.net

ShareVB

COMMENTAIRE DE ALPHARD2008 LE 04/01/2008 02:50:14

Merci ShareVB, je vais regarder ca!

COMMENTAIRE DE BOSSUN LE 19/03/2008 11:58:46

Tutoriel très très bien fait.. je te félicite et te remercie car ça m'aide à un point ou tu ne peux pas imaginer...

COMMENTAIRE DE BOSSUN LE 19/03/2008 15:01:21

AU fait j'ai une question qui rejoint un peu le soucis de Alphard2008.

J'ai codé ma DLL qui me récupère juste une donnée d'une base sql. ça fonctionne plutôt bien mais le soucis est qu'à l'ouverture du classeur, les données ne se rafraichissent pas.

J'ai activé le calcul automatique de mon classeur. mais rien n'y fait. pour que ça rafraichisse, je dois aller dans la cellule et faire ENTER.

Aurais-tu une idée pour résoudre ce problème?

Merci d'avance

Ajouter un commentaire

Authentification

Se souvenir du profil

Connexion

Mot de passe oublié ? / Activation de compteCréer un compte

Codes en rapport avec CRÉER UN ADDIN AUTOMATION POUR EXCEL si cette page ne contient pas votre

bonheur

Créer un addin automation pour excelCe code montre comment créer un addin automation pour excel permettant de fournir des fonctions utilisables

dans les formules des cellules d'excel. ce code est en annexe du tutoriel http://www.csharpf...

http://www.csharpfr.com/codes/CREER-ADDIN-AUTOMATION-EXCEL_44236.aspx

Win courrier

Logiciel permettant de gérer tous les documents administratifs tel que les impôts, les factures ou tout autre document

dans un treeview façon explorateur windows avec cette source vous pouvez : - ...

http://www.cppfrance.com/codes/WIN-COURRIER_44272.aspx

Directorystructure2excel: application copiant la structure d'un répertoire dans unexcelC'est une application très simple écrite en vc++ (avec mfc) permettant d'écrire la structure d'un répertoire (et ses sous

-répertoires) dans un fichier excel (qui est créé). elle écrit aussi dans le fi...

http://www.cppfrance.com/codes/DIRECTORYSTRUCTURE2EXCEL-APPLICATION-COPIANT-STRUCTURE-REPERTOIRE-

DANS-FICHIER-EXCEL_45307.aspx

Page 8 sur 9CRÉER UN ADDIN AUTOMATION POUR EXCEL, Tutoriel N°743,

03/01/2012http://www.csharpfr.com/tutoriaux/CREER-ADDIN-AUTOMATION-EXCEL_743.a...

Page 9: CRÉER UN ADDIN AUTOMATION POUR EXCEL

+ de ressources pour CRÉER UN ADDIN AUTOMATION POUR EXCEL

Outils

Convertisseur VB/C#Snippets et scripts

Outils en ligneLa ToolBox

Communauté

ProgrammationPhotographieTechnologieNewsgroups

EmploiForumBlogs

Guide d'achat

Téléphonie mobileImage et sonInformatiqueBureautiqueJeux vidéo

Logiciels

Internet & RéseauDéveloppementMarket AndroidJeux & Loisirs

GraphismeMultimédiaSécuritéPilotes

Loisirs

Cartes virtuellesVidéos drolesJeux en ligne

GéoguideAndroLib (Android Market)

Project timer

Vous avez du misère à comptabiliser vos heures passés sur un projet ? utilisez ce petit utilitaire pour vous assister.

ok, ok, il y a mélange de néerlandais et anglais .... mais bon, je ne suis pas fl...

http://www.vbfrance.com/codes/PROJECT-TIMER_28186.aspx

Automation excelCe programme a vu le jour quand des rapports excel générés automatiquement par une application laissaient de

nombreuses instances d'excel invisibles et qui devaient être terminées avec le 'task manage...

http://www.vbfrance.com/codes/AUTOMATION-EXCEL_39123.aspx

Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster

CodeS-SourceS.com© est une marque déposée tous droits réservés

Temps d'éxécution de la page : 0,109 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales

Page 9 sur 9CRÉER UN ADDIN AUTOMATION POUR EXCEL, Tutoriel N°743,

03/01/2012http://www.csharpfr.com/tutoriaux/CREER-ADDIN-AUTOMATION-EXCEL_743.a...