IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dotnet Discussion :

C# addin Excel-2003, appeler une fonction C# depuis une cell formula


Sujet :

Dotnet

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Points : 81
    Points
    81
    Par défaut C# addin Excel-2003, appeler une fonction C# depuis une cell formula
    Bonjour a tous,

    J'aimerai faire appel a une de mes fonctions C# lorsque je rentre une formule dans une cellule, pour ceci j'ai suivi le tutorial de Gabhan Berry, mais il ne fonctionne pas chez moi car la fonction n'est pas reconnu, en revanche il n'y a aucun probleme de compilation.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    [assembly: ComVisible(true)]
    namespace ExcelAddIn {
        interface ICellFunctions {
            String dnaGetBlock(String blockName);
        }
     
        [ComDefaultInterface(typeof(ICellFunctions))]
        public class CellFunctions : ICellFunctions {
            [ComRegisterFunctionAttribute]
            public static void RegisterFunction(Type type) {
                Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type));
            }
     
            [ComUnregisterFunctionAttribute]
            public static void UnregisterFunction(Type type) {
                Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type), false);
            }
     
            private static string GetSubKeyName(Type type) {
                string s = @"CLSID\{" + type.GUID.ToString().ToUpper() + @"}\Programmable";
                return s;
            }
     
            public String dnaGetBlock(String blockName) {
                MessageBox.Show("block");
                return "";
            }
        }
    }
    Voila je repete que j'ai cree un addin excel 2003 et que j'utilise VSTO 2005.

    Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Points : 81
    Points
    81
    Par défaut
    UP..


  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Points : 81
    Points
    81
    Par défaut
    Bon j'ai trouvé.

    La solution de Gabhan Berry decrite ci-dessus ne marche pas chez moi, Excel 2003 VSTO 2005.

    En revanche j'ai essayé ce tuto de eric carter et ca fonctionne a merveille !!
    http://blogs.msdn.com/eric_carter/ar...01/273127.aspx

    Alors comment appeler une fonction C# depuis une formula excel ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    using System;
    using System.Text;
    using ExcelAddIn.Model;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using Microsoft.Win32;
    
    namespace ExcelAddIn {
    
        [Guid("5EE52F90-AD1A-4681-B2DA-35E82759BB9B")]
        [ClassInterface(ClassInterfaceType.AutoDual)]
        [ComVisible(true)]
        public class CellFunctions {
    
            public CellFunctions() {}
    
            [ComRegisterFunctionAttribute]
            public static void RegisterFunction(Type type) {
                Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type, "Programmable"));
                RegistryKey key = Registry.ClassesRoot.OpenSubKey(GetSubKeyName(type, "InprocServer32"), true);
                key.SetValue("", System.Environment.SystemDirectory + @"\mscoree.dll", RegistryValueKind.String);
            }
    
            [ComUnregisterFunctionAttribute]
            public static void UnregisterFunction(Type type) {
                Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type, "Programmable"), false);
            }
    
            private static string GetSubKeyName(Type type, string subKeyName) {
                System.Text.StringBuilder s = new System.Text.StringBuilder();
                s.Append(@"CLSID\{");
                s.Append(type.GUID.ToString().ToUpper());
                s.Append(@"}\");
                s.Append(subKeyName);
                return s.ToString();
            }  
    
    // Ici le nom des fonctions accessible depuis excel =dnaGetBlock("string")
            public String dnaGetBlock(String blockName) {
                MessageBox.Show("block");
                return "";
            }
        }
    }
    Vous devez reproduire le meme schema.

    Pour creer un nouvel GUID, rendez vous dans visual studio puis "tools->create GUID", puis creer un GUID au format registre et remplacer le dans [Guid("5EE52F90-AD1A-4681-B2DA-35E82759BB9B")] du code ci dessus.

    Ensuite dans excel vous devez importer votre classe en vous rendant dans "Outils->Macro complementaires", la choisissez le bouton "Automatisation..." sur la droite et importer votre classe qui se trouve sous "namespacedevotreclasse.laclasse", valider, c'est bon

    PS : Il faut egalement cliquer droit sur le repertoire "properties" de votre addin dans visual studio et l'ouvrir, dans l'onglet build cocher la case "register for com interop"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Free Pascal] Enregistrer une fonction callback depuis une fonction membre
    Par EpiTouille dans le forum Free Pascal
    Réponses: 3
    Dernier message: 11/03/2015, 11h11
  2. Réponses: 3
    Dernier message: 19/12/2014, 17h03
  3. Appel d'une fonction A depuis une fonction B.
    Par LeFlou dans le forum C++
    Réponses: 9
    Dernier message: 22/05/2007, 17h36
  4. [WebForms]Comment appeler une fonction ASP depuis une JavaScript ?
    Par flagadda dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 11/08/2006, 14h24
  5. [VBA-E] Appel de fonction/procédure depuis une variable
    Par truman dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 09/05/2006, 16h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo