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

Signaler
Messages postés
146
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016
-
Messages postés
146
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016
-
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 !

1 réponse

Messages postés
146
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016

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.