Warum noch ein Access-Buch?
Für wen ist das Buch?
Jetzt bestellen
+ direkter Download des eBooks!
Nur EUR 59,95!
Fehler gefunden?
Bitte melden!
Wünsche an das Buch?
Her damit!
Was denken die Leser über dieses Buch?
Lesen Sie aktuelle Rezensionen!
Kapitel des noch nicht veröffentlichten Buchs zum Downloaden, Probelesen und Kommentieren
Beispieldatenbanken
Zusätzliches Material

Das Buch im HTML-Format

Für unbestimmte Zeit bieten Addison-Wesley und André Minhorst den kompletten Inhalt des Buchs als Download an. Schauen Sie rein und informieren Sie sich über den Inhalt! Und wenn Ihnen das Buch nützlich erscheint und Sie glauben, dass Sie etwas gelernt haben oder durch das Gelesene sogar etwas Zeit und somit Geld bei Ihrer Arbeit einsparen konnten, können Sie sich ja beim Autor und beim Verlag revanchieren - beispielsweise durch den Kauf dieses Buchs.

Am schönsten wäre es natürlich, wenn Sie das Buch direkt hier bestellen - Sie erhalten das Buch dann direkt vom Verlag, und der Autor und Verlag haben dann noch mehr davon, als wenn Sie es anderswo kaufen.

Danke für Ihr Interesse!

17.8.5 Das Userdocument als Toolwindow

17.8.6 Ereignisprozeduren des COM-Add-Ins mit Leben füllen

Selbstverständlich bekommen Sie in der VBA-Entwicklungsumgebung kein Toolwindow zu sehen, ohne es mit der grundlegenden Funktionalität zu bestücken. Die folgenden Prozeduren gehören alle ins Codemodul des Add-In-Designers. Den Start machen einige modulweite Konstanten und Deklarationen (siehe Listing 17.17).

Die String-Konstanten werden in mehreren Ereignisprozeduren benötigt und sind daher modulweit erreichbar.

Die Variable evtMenu hat den Typ CommandbarEvents und wird mit dem Schlüsselwort WithEvents deklariert. Später wird die Variable auf Ereignisse des Menüelements für das neue COM-Add-In im Menü Add-Ins reagieren. Die Deklaration der Variable für dieses Menüelement namens cbc befindet sich in der nächsten Zeile.

Die letzten drei Zeilen enthalten die Deklarationen von Objektvariablen für die VBA-Entwicklungsumgebung selbst (objApplication), für das Toolwindow (objToolwindow) und das Benutzerdokument (objUserDocument), das zur Laufzeit zum Toolwindow wird.

Option Explicit

Const strGUID$ = "{E3A0FF80-720A-4AB2-BAAC-0BB233E7526E}"
Const strAppTitle = "COMAddin" 'Applikations-Titel
Const strTitle = "Toolwindow (COM-Add-In)" 'Titelzeile des Addin-Fensters
Const strMenu = "Add-&Ins" 'Menü für Eintrag des Addins
Const strSubMenu = "Beispiel-Toolwindow-Add-In" 'Bezeichnung Menüeintrag
Const strUserDocument = "Toolwindow" 'Name des Userdocuments

Public WithEvents evtMenu As VBIDE.CommandBarEvents

Private cbc As Office.CommandBarControl

Dim strMenubar As String

Public objApplication As VBIDE.VBE
Public objToolwndow As VBIDE.Window
Public objUserDocument As Object

Listing 17.17: Deklarationsteil des Add-In-Designer-Moduls

Als Nächstes folgt die Prozedur, die beim Aufrufen des COM-Add-Ins durch die VBA-Entwicklungsumgebung gestartet wird. Voraussetzung für diesen Aufruf ist, dass Sie im Dialog Add-In-Manager die Eigenschaft Geladen|Entladen aktivieren und den Dialog schließen oder dass die VBA-Entwicklungsumgebung bei aktivierter Beim Start laden-Eigenschaft des jeweiligen COM-Add-Ins geöffnet wird.

Diese Ereignisprozedur heißt AddinInstance_ OnConnection und enthält folgenden Code:

Private Sub AddinInstance_OnConnection( _
    ByVal Application As Object, _
    ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, _
    ByVal AddInInst As Object, _
    custom() As Variant)

    Dim cbcTemp As Office.CommandBarControl
    Dim i As Long

    On Error GoTo AddinInstance_OnConnection_Err

    Set objApplication = Application

    App.Title = strAppTitle

    On Error Resume Next
    strMenubar = "Menüleiste"
    strMenubar = objApplication.CommandBars(strMenubar).Name

    If Err.Number <> 0 Then
        strMenubar = "Menu Bar"
    End If

    On Error GoTo AddinInstance_OnConnection_Err
    For i = objApplication.CommandBars(strMenubar). _
        Controls(strMenu).Controls.Count To 1 Step -1
        Set cbcTemp = objApplication.CommandBars(strMenubar). _
            Controls(strMenu).Controls(i)
        If cbcTemp.Caption = strSubMenu Then
            cbcTemp.Delete
        End If
    Next i

    If Not objToolWindow Is Nothing Then
        objToolWindow.Visible = True
    Else
        Set objToolWindow = objApplication.Windows.CreateToolWindow( _
            AddInInst, strAppTitle & "." & strUserDocument, strTitle, _
            strGUID$, objUserDocument)
    End If

    AddToCommandBar

AddinInstance_OnConnection_Exit:
    Set cbcTemp = Nothing
    Exit Sub

AddinInstance_OnConnection_Err:
    MsgBox "...in Zeile " & Erl & " Fehlernummer " & Err.Number _
        & vbNewLine & "- " & Err.Description _
        & " in Prozedur: AddinInstance_OnConnection in Connect", _
        vbCritical, "Fehler in " & strTitle
    Resume AddinInstance_OnConnection_Exit

End Sub

Listing 17.18: Die Ereignisprozedur AddinInstance_OnConnection

Die Eingangsparameter der Prozedur übergeben automatisch die benötigten Informationen über die aufrufende VBA-Entwicklungsumgebung. Die Prozedur führt im Wesentlich die folgenden Schritte aus:

  • Entfernen des Eintrags für das Toolwindow aus dem Menü Add-Ins, sofern noch vorhanden - was zum Beispiel durch einen früheren Absturz der Umgebung der Fall sein könnte.
  • Überprüfen, ob das Toolwindow schon instanziert ist, und es gegebenenfalls in den Vordergrund holen oder es mit der Methode CreateToolWindow neu erzeugen.
  • Aufruf der Prozedur AddToCommandBar zum Hinzufügen eines Eintrags für das Toolwindow in das Menü Add-Ins und Funktion zur Verarbeitung der Menü-Ereignisse dieses Eintrags hinzufügen.
  • Die Prozedur AddToCommandBar macht zunächst die Hauptmenüleiste der VBA-Entwicklungsumgebung sichtbar, sofern das noch nicht der Fall war. Anschließend fügt sie dem Menü Add-Ins einen Eintrag zum Aktivieren des Toolwindows hinzu und stellt dessen Beschriftung, Symbol und das beim Klicken auszulösende Ereignis ein. Schließlich überprüft die Routine, ob das Toolwindow beim letzten Schließen sichtbar war oder nicht, und stellt diesen Zustand wieder her. Dabei greift sie mit der Funktion GetSetting auf die Registry zu.

    Weitere Informationen zum Erstellen von Menüs per VBA erhalten Sie einem Kapitel aus »Das Access 2003 Entwicklerbuch«, das Sie auf der Buch-CD unter \Kap17\Menueleisten.pdf finden.

    Sub AddToCommandBar()

        On Error GoTo AddToCommandBar_Err

        objApplication.CommandBars(strMenubar).Visible = True

        Set cbc = objApplication.CommandBars(strMenubar). _
            Controls(strMenu).Controls.Add(1 , , , , True)

        cbc.Caption = strSubMenu
        cbc.Style = msoButtonIconAndCaption
        cbc.FaceId = 611

        Set Me.evtMenu = objApplication.Events.CommandBarEvents(cbc)

        If GetSetting("VBA AddIns", App.Title, "DisplayOnConnect", "0") _
            = "1" Then
            objToolWindow.Visible = True
        End IfAddToCommandBar_Exit:

        Exit Sub

    AddToCommandBar_Err:

        MsgBox "...in Zeile " & Erl & " Fehlernummer " & Err.Number _
            & vbNewLine & "- " & Err.Description _
            & " in Prozedur: AddToCommandBar in Connect", vbCritical, _
         "Fehler in " & strTitle
        Resume AddToCommandBar_Exit

    End Sub

    Listing 17.19: Hinzufügen eines Menüleisteneintrags zum Aktivieren des Toolwindows

    Damit der Menüeintrag beim Klicken auch das Toolwindow aktiviert, benötigt das Modul noch einen Event-Handler. Dieser enthält lediglich eine Anweisung, die das Toolwindow sichtbar macht:

    Private Sub evtMenu_Click(ByVal CommandBarControl As Object, _
        handled As Boolean, CancelDefault As Boolean)

        On Error Resume Next
        objToolWindow.Visible = True

    End Sub

    Listing 17.20: Event-Handler für den Toolwindow-Menüeintrag

    Zu guter Letzt bleibt noch die Ereignisprozedur, die beim Entladen des COM-Add-Ins ausgelöst wird. Die Prozedur sorgt für das Entfernen des Menüeintrags zum Anzeigen des Toolwindows, speichert den aktuellen Zustand bezüglich der Sichtbarkeit des Toolwindows in der Registry und gibt die Objektvariablen wieder frei:

    Private Sub AddinInstance_ OnDisconnection(ByVal RemoveMode As _
        AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)

        Dim cbcTemp As Office.CommandBarControl
        Dim i As Long

        On Error Resume Next

        For i = objApplication.CommandBars(strMenubar).Controls(strMenu). _
            Controls.Count To 1 Step -1
            Set cbcTemp = objApplication.CommandBars(strMenubar). _
                Controls(strMenu).Controls(i)
            If cbcTemp.Caption = strSubMenu Then
                cbcTemp.Delete
            End If
        Next i

        If objToolWindow.Visible Then
            SaveSetting "VBA AddIns", App.Title, "DisplayOnConnect", "1"
            objToolWindow.Visible = False
        Else
            SaveSetting "VBA AddIns", App.Title, "DisplayOnConnect", "0"
        End If

        objToolWindow.Close
        Set Me.evtMenu = Nothing
        Set cbcTemp = Nothing
        Set cbc = Nothing
        Set objToolWindow = Nothing
        Set objUserDocument = Nothing
        Set objApplication = Nothing

    End Sub

    Listing 17.21: Die Ereignisprozedur AddinInstance_OnDisconnection wird beim Entladen des COM-Add-Ins ausgelöst

    Nächster Abschnitt:

    17.8.7 Anpassen der Eigenschaften des COM-Add-Ins

    © 2006-2008 André Minhorst Alle Rechte vorbehalten.