Jeder der beruflich mit VBA zu tun hat kennt das. Man braucht etwas, aber die benötigte Funktion ist in Excel, Word und Co. nicht enthalten und kann, wenn überhaupt, nur über die Installation von Zusatzsoftware (COM-DLL) oder kompliziert über die Win32API gelöst werden.
Nun darf man allerdings nicht überall installieren, was man braucht.
Hier kommt dieses kleine Tutorial ins Spiel.
Die Vorgabe:
Zugriff auf eine NET-DLL, ohne etwas zu installieren.
Lösung:
Aufrufen der NET-DLL über die COM-Versionen der mscorlib bzw mscoree.
Zuerst erstellen wir die DLL. Dazu öffnen wir Visual Studio (Express) und legen eine neues DLL-Projekt mit dem Namen "TestDLL" an.
Wichtig: Das Ganze funktioniert leider nur bis Framework 3.5. Dies muss vor dem Erstellen geändert werden
Nun zum Code ("Class1.vb"):
Der einzige Unterschied zu einer normalen DLL, ist die Verwendung von
um dem Compiler zu sagen, dass die gesamte Klasse für COM-Clients sichtbar ist.
Nun zu VBA.
In VBA müssen zwei Verweise hinzugefügt werden:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscoree.tlb (Common Language Runtime Execution Engine 2.4 Library)
C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.tlb
Danach kann man mit folgendem Code die Funktionen der DLL aufrufen.
Nun kann man auf (fast) alle Funktionen der DLL zugreifen.
Vorteil dieser Methode:
Keine Installation
Nachteile dieser Methode:
Keine IntelliSens in VBA
Allgemein gilt, wie bei normalen COM-DLLs, gewisse Dinge können nicht an VBA übergeben werden. Dafür kann man sich allerdings meistens einen Workaround basteln.
Nun darf man allerdings nicht überall installieren, was man braucht.
Hier kommt dieses kleine Tutorial ins Spiel.
Die Vorgabe:
Zugriff auf eine NET-DLL, ohne etwas zu installieren.
Lösung:
Aufrufen der NET-DLL über die COM-Versionen der mscorlib bzw mscoree.
Zuerst erstellen wir die DLL. Dazu öffnen wir Visual Studio (Express) und legen eine neues DLL-Projekt mit dem Namen "TestDLL" an.
Wichtig: Das Ganze funktioniert leider nur bis Framework 3.5. Dies muss vor dem Erstellen geändert werden
Nun zum Code ("Class1.vb"):
Der einzige Unterschied zu einer normalen DLL, ist die Verwendung von
um dem Compiler zu sagen, dass die gesamte Klasse für COM-Clients sichtbar ist.
Nun zu VBA.
In VBA müssen zwei Verweise hinzugefügt werden:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscoree.tlb (Common Language Runtime Execution Engine 2.4 Library)
C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.tlb
Danach kann man mit folgendem Code die Funktionen der DLL aufrufen.
Visual Basic-Quellcode
- Sub DLLTest()
- 'Wird benötigt, um Funktionen mit der CLR auszuführen
- Dim clr As mscoree.CorRuntimeHost
- 'Stellt die Funktionalität zum Laden der DLL bereit
- Dim domain As mscorlib.AppDomain
- 'Hier wird die Instanz der Klasse "TestDLL.Test" gespeichert
- Dim objTest As Object
- 'Erzeugt einen neuen RuntimeHost
- Set clr = New mscoree.CorRuntimeHost
- 'Starten des RuntimeHosts
- clr.Start
- 'Die Standard AppDomain holen
- clr.GetDefaultDomain domain
- 'Hier wird eine Instanz der Klasse "TestDLL.Test" erstellt
- 'Pfad_Zur_Dll muss mit dem Pfad ersetzt werden, auf dem die DLL liegt. Kann auch ein UNC-Pfad sein.
- Set objTest = domain.CreateInstanceFrom("Pfad_Zur_Dll\TestDLL.dll", "TestDLL.Test").Unwrap
- 'Hier wird das Ganze getestet
- MsgBox objTest.MYProperty
- objTest.MYProperty = "Franz"
- Call objTest.Add(14, 6)
- MsgBox objTest.MYProperty
- 'Referenz löschen
- Set objTest = Nothing
- 'RuntimeHost stoppen
- clr.Stop
- End Sub
Nun kann man auf (fast) alle Funktionen der DLL zugreifen.
Vorteil dieser Methode:
Keine Installation
Nachteile dieser Methode:
Keine IntelliSens in VBA
Allgemein gilt, wie bei normalen COM-DLLs, gewisse Dinge können nicht an VBA übergeben werden. Dafür kann man sich allerdings meistens einen Workaround basteln.
SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=
Weil einfach, einfach zu einfach ist!
Weil einfach, einfach zu einfach ist!