Utiliser une librairie C# en VBA d'un fichier Excel

Résolu
finarfin95 Messages postés 19 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 mars 2007 - 23 sept. 2005 à 17:09
galiolas Messages postés 2 Date d'inscription jeudi 7 avril 2016 Statut Membre Dernière intervention 31 octobre 2018 - 7 avril 2016 à 14:58
Bonjour à toutes/tous,

Voila mon souci, qui je dois l'avouer, commence à me taper sur le système... et comme je n'y connais pas grand chose je rame à mort!

J'utilise une application Excel avec des contrôles fesant appel des méthodes VBA. Or d'un autre côté j'ai développé une librairie en C# pour les gros algorithmes.
Mon souci est que je n'arrive pas à appeler cette librairie.

Mode de génération de la librairie en C#:
1. Création d'un projet "Librairie de classe"
2. Développement, tests des méthodes etc...
3. Génération de la librairie (non chiffrée, peut-être que ça vien de là, mais je ne vois pas pourquoi j'en aurais besoin...)

Appel de la librairie dans le VB:
1. Copie de la dll dans le répertoire du fichier Excel
2. Insertion dans le code VB de :
Public Declare Function maSomme Lib "MyLibrary.dll" (ByVal a As Integer, ByVal b As Integer) As Integer
(en passant j'aimerais bien savoir comment intégrer la libraire dans sa totalité, car si je dois déclarer cheque méthode je suis pas rendu :p)
3. Appel de ma fameuse méthode dans le code:
Sub maSommeVBA()


a = Feuil1.Cells(1, 1)
b = Feuil1.Cells(1, 2)


Feuil1.Cells(1, 4) = maSomme(a, b)


End Sub

Resultat:
Erreur d'exécution '453':
Point d'entrée maSomme d'une dll introuvable dans MyLibrary.dll

Voila, peut-être que ce que je viens d'écrire parait abhérant, peut-être pas, mais en tout cas, toute aide sera grandement appréciée. Parceque là... je craque :p:p:p:p:p

Merci!

Romain

11 réponses

finarfin95 Messages postés 19 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 mars 2007
27 sept. 2005 à 18:16
Bon j'ai trouvé un mix de tout ce que 'jai pu entendre sur la question qui fonctionne bien:

1. générer ma librarie sans ajouter quoi que ce soit et sans mettre COM interop = true.
2. insérer cette lib dans le GAC (gacutil -i ...)
3. référencer la librairie (regasm ....)

et ça marche....

En tout cas merci de votre aide, je pense de toute façon qu'il y a plusieurs solutions lorsqu'il sagit de librairies... maintenant de là à connaitre la plus efficace... c'est autre chose :)

De toute façon j'ai un autre post en cours sur le même sujet pour ceux que ça intéresse héhéhé :D

Romain
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
23 sept. 2005 à 21:05
Salut,

Tu ne peux pas procéder de la même manière qu'avec une méthode exportée d'une dll C/C++, tu dois passer par COM.

Exemple :

Soit un projet de bibliotheque de classe appelé "CSharp" :
- sortie : "CSharp.dll"
- "Inscrire pour COM Interop" à true dans les propriétés du projet

Classe "CSharp", fichier CSharp.cs :
--------------
using System;
using System.Runtime.InteropServices;


namespace CSharp
{
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class CSharp : ICSharp
{
[ComVisible(true)]
public int Somme(int a, int b)
{
return a+b;
}
}
}
--------------

Interface "ICSharp" (fichier ICSharp.cs) :
--------------
using System;


namespace CSharp
{
public interface ICSharp
{
int Somme(int a, int b);
}
}
--------------

A la compilation, VS effectue l'inscription pour l'emplacement actuel de l'assembly .Net.

Dans ton VBA il ne te reste plus qu'à faire quelquechose de ce genre :
Dim csharp As Object
Dim result As Integer
Set csharp = CreateObject("CSharp.CSharp")
result = csharp.Somme(1, 3)
MsgBox (result)
Set csharp = Nothing

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
24 sept. 2005 à 06:02
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
24 sept. 2005 à 08:45
Ah oui j'ai oublier les liens MSDN qui vont bien, merci du complément :-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
finarfin95 Messages postés 19 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 mars 2007
25 sept. 2005 à 12:58
Merci beaucoup,

Je travaillerais dans ce sens lundi.... ben oui, là, on est diamnche faut pas abuser :D
Je pense que ça devrait aller avec une explication pareille :) sinon je vous tiens au courant!

Romain
0
finarfin95 Messages postés 19 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 mars 2007
26 sept. 2005 à 09:41
mmm j'ai un problème persistant... je n'arrive pas à référencer ma librairie en VB. Donc je n'arrive pas à créer l'objet CSharp.CSharp.
Je suis sur le problème, mais si quelqu'un connais une erreur fréquente à ce propos je suis tout ouïe :)

Romain
0
finarfin95 Messages postés 19 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 mars 2007
26 sept. 2005 à 10:08
En fait, si je référence le fichier .tlb généré par Visual Studio, j'ai l'erreur suivante:

Erreur d'exécution '429':
Un composant ActiveX ne peut pas créer d'objet

sur la ligne

Set myClass1 = CreateObject("MyLibrary.Class1")

Faut-il référencer la librairie dans le VB avec un importlib ou quelque chose du genre? Le fait de référencer par "Outils/Références/MyLibrary.tlb" est-il suffisant?
Pour l'instant je n'ai mis que ça dans le VB:

Sub maSommeVBA()
Dim myClass1 As Object
Set myClass1 = CreateObject("MyLibrary.Class1")


a = Feuil1.Cells(1, 1)
b = Feuil1.Cells(1, 2)
Feuil1.Cells(1, 4) = myClass1.maSomme(a, b)


Set myClass1 = Nothing
End Sub

Merci,
romain
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
26 sept. 2005 à 19:40
Il n'y a rien à référencer, juste s'assurer de bien faire l'enregistrement à COM, ce qui apparemment n'est pas le cas chez toi.
Moi côté VBA il n'y avait que ce que j'ai mit, rien de plus :-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
finarfin95 Messages postés 19 Date d'inscription mardi 18 novembre 2003 Statut Membre Dernière intervention 14 mars 2007
27 sept. 2005 à 09:27
Argh!
Je vois pas du tout là... bon je sais que ça fait glandeur, mais voici ce que j'ai fait pas à pas, si tu vois une erreur ou unh oubli quelque part ça me débloquerait peut-être...

Côté Visual Studio .NET:
1. Création d'un projet de type librairie de classes
2. Contenu 2 classes:
-----------------------------------------------------------------------------------------------------
Class1.cs
-----------------------------------------------------------------------------------------------------
using System;

using System.Runtime.InteropServices;

namespace MyLibrary
{

/// <summary>
/// Summary description for Class1.
/// </summary>
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(
true)]

public
class Class1:IClass1
{
[ComVisible(
true)]

public
int maSomme(
int a,
int b)
{
return a+b;}
}
}

-----------------------------------------------------------------------------------------------------
IClass1.cs
-----------------------------------------------------------------------------------------------------
using System;

namespace MyLibrary
{

/// <summary>
/// Summary description for IClass1.
/// </summary>
public
interface IClass1
{

int maSomme(
int a,
int b);
}
}
3. Compilation du projet avec "Register for COM interop" true> génération de MyLibrary.pdb, MyLibrary.dll et MyLibrary.tlb

Côté VBA:
1. Référencement de MyLibrary.tlb par "Outils/Références/add..."
2. Le code VBA est le suivant:
---------------------------------------------------------------------------------------------
Module1
---------------------------------------------------------------------------------------------
Sub maSommeVBA()
Dim myClass1 As Object
Set myClass1 = CreateObject("MyLibrary.Class1")


a = Feuil1.Cells(1, 1)
b = Feuil1.Cells(1, 2)
Feuil1.Cells(1, 4) = myClass1.maSomme(a, b)


Set myClass1 = Nothing
End Sub

Erreur générée sur le CreateObject :
Erreur d'exécution '429':
Un composant ActiveX ne peut pas créer d'objet

Voila tout ce que j'ai :(
Je suis vraiment désolé de balancer tout mon code comme ça pour que tu m'aides à trouver l'erreur, mais je te rassure, je ne joue pas aux cartes pendant ce temps :))

Merci beaucoup!
Romain
0
benumz Messages postés 1 Date d'inscription vendredi 14 septembre 2007 Statut Membre Dernière intervention 14 septembre 2007
14 sept. 2007 à 18:13
(Pour ceux qui ont des problèmes pour instantier l'objet COM en VBA)

Pour la petite histoire, j'ai fait comme le fait "finarfin95" dans son post du 27/09/2005 09:27:22 ; avec en plus, dans les project properties\Application, \Assembly Information ,  "Make Assembly COM-Visible" coché.... Mais en VBA ca ne fonctionnait pas: la ligne   Set myClass1 = New MyLibrary.Class1    laissait myClass1 à nothing et - justement - nothing ne se passait.

Dans ce cas, a
llez dans le dossier racine d'excel (par ex C:\Program Files\Microsoft Office\Office10) puis
    *verifiez que le dossier contient un fichier Excel.exe.config
    *si oui, vérifiez qu'il donne la bonne version de "supportedRuntime" (qu'on peut voir dans help\about Microsoft Visual Studio), par exemple on doit voir:
        <configuration>
          <startup>
            <supportedRuntime version ="v2.0.50727"/>
          </startup>
        </configuration>
    *si non, créer le fichier Excel.exe.config qui doit contenir
        <?xml version="1.0" encoding="utf-8" ?>
        <configuration>
          <startup>
            <supportedRuntime version="v2.0.50727"/>
          </startup>
        </configuration>

J'ai trouvé ca sur  http://richnewman.wordpress.com/2007/04/15/a-beginner%e2%80%99s-guide-to-calling-a-net-library-from-excel/#comment-688
     .... et ca marche bien.

Sinon, il est inutile chez moi d'utiliser regasm et gacutil.
0
galiolas Messages postés 2 Date d'inscription jeudi 7 avril 2016 Statut Membre Dernière intervention 31 octobre 2018
7 avril 2016 à 14:58
Bonjour, j'ai aussi developpé une DLL par contre au niveau deploiement comment ça fonctionne? Car je souhaiterai eviter l'étape regasm.exe sur les postes client simplement en utilisant une DLL C# a la racine du projet excel.
Y a t'il moyen de faire cela?
Merci
0
Rejoignez-nous