finarfin95
Messages postés19Date d'inscriptionmardi 18 novembre 2003StatutMembreDernière intervention14 mars 2007
-
23 sept. 2005 à 17:09
galiolas
Messages postés2Date d'inscriptionjeudi 7 avril 2016StatutMembreDernière intervention31 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
finarfin95
Messages postés19Date d'inscriptionmardi 18 novembre 2003StatutMembreDernière intervention14 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
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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
finarfin95
Messages postés19Date d'inscriptionmardi 18 novembre 2003StatutMembreDernière intervention14 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!
finarfin95
Messages postés19Date d'inscriptionmardi 18 novembre 2003StatutMembreDernière intervention14 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 :)
finarfin95
Messages postés19Date d'inscriptionmardi 18 novembre 2003StatutMembreDernière intervention14 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)
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 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 :-)
finarfin95
Messages postés19Date d'inscriptionmardi 18 novembre 2003StatutMembreDernière intervention14 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;
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 :))
benumz
Messages postés1Date d'inscriptionvendredi 14 septembre 2007StatutMembreDernière intervention14 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>
galiolas
Messages postés2Date d'inscriptionjeudi 7 avril 2016StatutMembreDernière intervention31 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