Utiliser une librairie C# en VBA d'un fichier Excel [Résolu]

finarfin95 19 Messages postés mardi 18 novembre 2003Date d'inscription 14 mars 2007 Dernière intervention - 23 sept. 2005 à 17:09 - Dernière réponse : galiolas 1 Messages postés jeudi 7 avril 2016Date d'inscription 7 avril 2016 Dernière intervention
- 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
Afficher la suite 

11 réponses

Répondre au sujet
finarfin95 19 Messages postés mardi 18 novembre 2003Date d'inscription 14 mars 2007 Dernière intervention - 27 sept. 2005 à 18:16
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de finarfin95
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 23 sept. 2005 à 21:05
0
Utile
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#
Commenter la réponse de cs_coq
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 24 sept. 2005 à 06:02
Commenter la réponse de Lutinore
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 24 sept. 2005 à 08:45
0
Utile
Ah oui j'ai oublier les liens MSDN qui vont bien, merci du complément :-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
Commenter la réponse de cs_coq
finarfin95 19 Messages postés mardi 18 novembre 2003Date d'inscription 14 mars 2007 Dernière intervention - 25 sept. 2005 à 12:58
0
Utile
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
Commenter la réponse de finarfin95
finarfin95 19 Messages postés mardi 18 novembre 2003Date d'inscription 14 mars 2007 Dernière intervention - 26 sept. 2005 à 09:41
0
Utile
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
Commenter la réponse de finarfin95
finarfin95 19 Messages postés mardi 18 novembre 2003Date d'inscription 14 mars 2007 Dernière intervention - 26 sept. 2005 à 10:08
0
Utile
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
Commenter la réponse de finarfin95
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 26 sept. 2005 à 19:40
0
Utile
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#
Commenter la réponse de cs_coq
finarfin95 19 Messages postés mardi 18 novembre 2003Date d'inscription 14 mars 2007 Dernière intervention - 27 sept. 2005 à 09:27
0
Utile
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
Commenter la réponse de finarfin95
benumz 1 Messages postés vendredi 14 septembre 2007Date d'inscription 14 septembre 2007 Dernière intervention - 14 sept. 2007 à 18:13
0
Utile
(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.
Commenter la réponse de benumz
galiolas 1 Messages postés jeudi 7 avril 2016Date d'inscription 7 avril 2016 Dernière intervention - 7 avril 2016 à 14:58
0
Utile
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
Commenter la réponse de galiolas

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.