COM-AddIns für die Microsoft Office Anwendungen und andere Anwendungen, die VBA und COM-AddIns unterstützen, sind eine feine Sache. Sie können in einem solchen COM-AddIn neue Symbolleisten und Objekte anlegen, die auf Mausklick oder Tastendruck reagieren und so diese Anwendungen um nahezu beliebige Funktionalität erweitern. Allerdings scheint das AddIn vollkommen von der Anwendung abgeschottet zu sein, von der es geladen worden ist. Aus dem VBA-Code, aus Makros und Modulen, haben Sie offensichtlich keine Möglichkeit, auf das AddIn zuzugreifen - genauer gesagt: funktional zuzugreifen und öffentliche Objekte Ihres AddIns zu nutzen.
Ihr AddIn finden Sie zwar sehr wohl als COMAddIn-Objekt in der COMAddIns-Collection des jeweiligen Application-Objects über den üblichen ProgId-Namen ("Projektname.AddInKlasse") wieder. Ein Blick im Objekt-Katalog auf das COMAddIn-Objekt fördert eine Reihe von Eigenschaften zu Tage, die eher "bürokatischen" Zwecken dienen - bis auf die Eigenschaft Object. Und genau diese enthält... NICHTS!
Wo also steckt nun Ihr AddIn tatsächlich? Es steckt in der Tat irgendwie in oder hinter dem COMAddIn-Objekt. Doch VBA ist nicht in der Lage, die öffentlichen Schnittstellen Ihres AddIns bzw. der Objekte desselben direkt zugänglich zu machen.
Aber werfen wir einmal einen Blick auf das OnConnection-"Ereignis" des AddIn-Designers in Visual Basic. Der folgende Versuch zeigt Ihnen, welcher Art das dort im Parameter AddInInst übergeben Objekt ist:
Private Sub AddinInstance_OnConnection(ByVal Application As Object, _
ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _
ByVal AddInInst As Object, custom() As Variant)
Debug.Print TypeName(AddInInst)
End Sub
Ausgegeben wird "COMAddIn"! So weit so gut - aber bis jetzt ist das immer noch eine Einbahnstraße. Und auch hier ergibt die Prüfung, was sich denn nun in der Object-Eigenschaft des COMAddIn-Objekts befinden könnte weiterhin Nothing.
Vielleicht haben Sie auch schon vermutet, dass diese Object-Eigenschaft der gesuchte Verbindungskanal sein könnte, und versucht, ein Objekt Ihres AddIns zu instanzieren und dieser Object-Eigenschaft zuzuweisen. Angenommen, Ihr öffentliches Objekt hieße CTest:
Private Sub AddinInstance_OnConnection(ByVal Application As Object, _
ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _
ByVal AddInInst As Object, custom() As Variant)
Set AddInInst.Object = New CTest
End Sub
Pech gehabt - VB quittiert den Versuch mit dem Laufzeitfehler 438 - "Objekt unterstützt diese Eigenschaft oder Methode nicht."
Probieren Sie es aber einmal - natürlich vollkommen regelwidrig - ohne das Set-Schlüsselwort, ist VB glücklich und zufrieden:
Private Sub AddinInstance_OnConnection(ByVal Application As Object, _
ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _
ByVal AddInInst As Object, custom() As Variant)
AddInInst.Object = New CTest
End Sub
Ein einfaches Beispiel für Ihr Objekt-Klasse CTest (Instancing 5 - MultiUse) könnte etwa folgendermaßen aussehen:
Private mName As String
Public Property Get Name() As String
Name = "Ich heiße " & mName
End Property
Public Property Let Name(New_Name As String)
mName = New_Name
End Property
Schauen wir nun auf der anderen Seite in einer COM-AddIn-fähigen Anwendung nach, etwa in Microsoft Word, ob Ihr Objekt tatsächlich dort ankommt und nutzbar wird. In einem Standard-Modul dort könnte beispielsweise folgendes Makro stehen, das Sie auch mit einem Symbol einer Symbolleiste verbinden können:
Public Sub AddInTest()
Dim objCOMAddIn As Object
Dim objAddIn As Object
Set objCOMAddIn = _
application.COMAddIns("avbAddInPublicObject.Connect")
If objCOMAddIn.Connect Then
Set objAddIn = objCOMAddIn.Object
If objAddIn Is Nothing Then
MsgBox "Object ist Nothing!"
Else
With objAddIn
.Name = InputBox("Geben Sie einen Namen ein:")
MsgBox .Name
End With
End If
Else
MsgBox "COMAddIn ist nicht geladen!"
End If
End Sub
Siehe da: Wenn Ihr AddIn als COMAddIn geladen ist, steht Ihr Objekt nunmehr wie erhofft zur Verfügung.
|