Utiliser DLL C# depuis macro VBA Office [Résolu]

Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Dernière intervention
21 mars 2016
- - Dernière réponse : zwyx
Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Dernière intervention
21 mars 2016
- 21 févr. 2011 à 16:45
Bonjour,

J'ai épuisé toutes les aides que pouvaient m'apporter google et codes-sources, sans trouver réponse à ma question: comment appeler une fonction d'une DLL codée en C#, sous Visual Studio 2008 (framework .NET version 3.5) depuis une macro VBA d'un document Excel (ou Word), office version 11.

Voici le code très ambitieux du projet compilé en DLL, avec l'option "inscrire pour COM interop" activée:
using System;
using System.Text;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace MyDLL
{
[ComVisible(true)]
public class Program
{
[ComVisible(true)]
public int TestDLL()
{
return 42;
}

}
}


Et voici l'appel dans ma macro Excel:
Public Declare Function TestDLL Lib "[Chemin de ma DLL]\MyDLL.dll" () As Integer

Sub TesterDLL()
    Dim iResult As Integer
    iResult = TestDLL()
    ActiveSheet.Cells(1, 1).Formula = iResult
End Sub


À l'exécution, de la ligne "iResult = TestDLL()", un message d'erreur mentionne:
Erreur d'exécution '453':
Point d'entrée TestDLL d'une DLL introuvable dans [Chemin de ma DLL]\MyDLL.dll


Par ailleurs, j'ai essayé d'ajouter ma DLL au projet VBA, via la menu Outils/Références, mais rien n'y fait.

Merci pour votre lecture. Si vous avez une piste, je suis preneur !
Afficher la suite 

Votre réponse

1 réponse

Meilleure réponse
Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Dernière intervention
21 mars 2016
3
Merci
J'ai trouvé une solution ici, il doit y avoir plus simple, mais ça fonctionne. La méthode consiste à interfacer la classe développée, comme suit:
using System;
using System.Text;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace MyDLL
{
[ComVisible(true)]
public interface IProgram
{
int TestDLL();
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class Program : IProgram
{
// default constructor is needed for COMInterop
public Program()
{
// nothing to do
}

[ComVisible(true)]
public int TestDLL()
{
return 42;
}
}
}

L'appel depuis une macro Excel devient alors:
Sub Btn1_OnClick()
Dim MyDLL
Set MyDLL = CreateObject("MyDLL.Program") ' [nom du namespace].[nom de la classe]

Dim iResult As Integer
iResult = MyDLL.TestDLL()
ActiveSheet.Cells(1, 1).Formula = Str(iResult)
End Sub

En espérant que ça puisse aider.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de zwyx

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.