none
Access-AddIn Menüleiste

    Frage

  • Hallo,

    für Access 2003 erstelle ich mir gerade ein AddIn. Ich möchte in der Menüleiste eine zusätzliche Commandbar haben mit einem Label und einem Combo. Meine Startfunktion ruft nachfolgende Prozedur auf. Wenn ich das AddIn als AddIn öffne, kommt die definierte Fehlermeldung. Problem macht msoControlLabel. Ändere ich zu msoControlEdit wird die Menüleiste erstellt, aber der Fehler kommt trotzdem.

    Was mach ich falsch?

    Gruß Andreas

    Private Sub cmdBarInstall()
        On Error GoTo Fehler

        Dim cBar As CommandBar
        Dim CtrlEdit As CommandBarControl
        Dim Ctrlcombo As CommandBarControl
        Dim CtrlPopup As CommandBarControl

        If BarFind("SvDevCounter") Then
            CommandBars("SvDevCounter").Delete
        End If

        Set cBar = CommandBars.Add("SvDevCounter", msoBarTop, True, False)
        With cBar.Controls
            Set CtrlEdit = .Add(msoControlLabel)
            Set Ctrlcombo = .Add(msoControlComboBox)
            Set CtrlPopup = .Add(msoControlPopup)
        End With
       
        With Ctrlcombo
            .AddItem "Sitzung"
            .AddItem "Heute"
            .AddItem "Gesamt"
            .OnAction = "=SwitchCounter()"
        End With
        cBar.Visible = True

    Fehler:
        MsgBox "Fehler bei der Menüleistenerstellung!"
    End Sub


    http://www.AccessBlog.de

    Mittwoch, 21. März 2012 13:19

Antworten

  • Hallo!

    Wenn du eine Deklaration mit Withevents machst, musst du auch dessen Eventhandler verwenden, um auf die Ereignisse zu reagieren.

    clsCommandbarEvents:

    Option Compare Database
    Option Explicit
    
    Private WithEvents cmdStart As Office.CommandBarButton
    Private WithEvents cmdStop As Office.CommandBarButton
    
    Public Sub InitButton(ByRef rButton1 As Office.CommandBarButton, ByRef rButton2 As Office.CommandBarButton)
        Set cmdStart = rButton1
        Set cmdStop = rButton2
    End Sub
    
    Private Sub cmdStart_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
       MsgBox "test 1"
    End Sub
    
    Private Sub cmdStop_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
       MsgBox "test 2"
    End Sub

    An deiner Stelle würde ich aber auch den Code aus mdlDevCounter, der mit den Commandbars umgeht, in die Klasse verlagern, damit etwas besser aufgeräumt ist.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch



    Sonntag, 25. März 2012 08:56
  • Hallo!

    Ich glaub, die Funktion, die du per AdressOf übergibst muss in einem Standardmodul sein. Den Rest könntest du aber in die Klasse stecken. Das würde dir zumindest das doppelte Abspeichern der Referenzen der Commandbuttons ersparen.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    • Als Antwort markiert Andreas Vogt Sonntag, 25. März 2012 18:30
    Sonntag, 25. März 2012 17:08

Alle Antworten

  • Hallo,

    scheinbar gibt es keinen Label, mit Edit hat es dann geklappt.

    Mein nächstes Problem ist, dass die Functions nicht gefunden werden:

        With cBar.Controls
            Set CtrlButtonStart = .Add(msoControlButton)
            Set CtrlButtonStop = .Add(msoControlButton)

        End With
       
        With CtrlButtonStart
            .Caption = "Zähler Start"
            .OnAction = "=APITimerStart()"
            .TooltipText = "Projektzeit-Zähler starten"
            .FaceId = 186
        End With

    Obwohl die Function APITimerStart als Public deklariert ist, wird sie nicht gewunden wenn die die MDA als Add In öffne.

    Meldung: Der von Ihnen eingegebene Ausdruck enthält den Namen einer Funktion, die Microsoft Office Access nicht finden kann.

    Was mach ich falsch?

    Gruß Andreas


    http://www.AccessBlog.de

    Mittwoch, 21. März 2012 16:00
  • Hallo!

    Ich nehme an, die Funktion wird im VBA-Projekt der jeweiligen Access-Anwendung gesucht.
    Zum Testen: wenn du dort eine solche Funktion erstellst, wird sie aufgerufen, oder?

    Grundsätzlich nachgefragt: Warum reagierst du im Add-In nicht auf das Click-Ereignis des CommandBarButton?

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    Mittwoch, 21. März 2012 17:07
  • Hallo Josef,

    ja nur wie? Da ich keine Objektmodule habe kann ich auch nicht auf "Private WithEvents Button1 As Office.CommandButton" o.Ä. zugreifen.

    Andreas


    http://www.AccessBlog.de

    Mittwoch, 21. März 2012 18:21
  • Hallo!

    Eine Klasse, die beim Start des Add-Ins instanziert wird, für die Erstellung der CommandButton sorgt und an dessen Ereignissen lauscht, könntest du aber erstellen. ;-)

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    Mittwoch, 21. März 2012 18:36
  • Also ich kriegs nicht gebacken.

    Code in Standardmodul:

        Set cBar = CommandBars.Add("SvDevCounter", msoBarTop, False, True)
        With cBar.Controls
            Set CtrlButtonStart = .Add(msoControlButton)
            Set CtrlButtonStop = .Add(msoControlButton)
            Set CtrlEdit = .Add(msoControlEdit)
            Set Ctrlcombo = .Add(msoControlComboBox)
        End With
       
        With CtrlButtonStart
            .Caption = "Zähler Start"
            .OnAction = "=APITimerStart()"
            .TooltipText = "Projektzeit-Zähler starten"
            .FaceId = 186
        End With

    ....

    Deklaration:

    Dim CtrlButtonStart As CommandBarControl
    Dim CtrlButtonStop As CommandBarControl
    Dim cBar As CommandBar
    Dim clsCommandbarClass As New clsCommandbarEvents

    Klasseninitialisierung:

    Private Sub InitEvents()
        Dim cbrBar As Office.CommandBar
        Set cbrBar = CommandBars("SvDevCounter")
        With cbrBar
            Set clsCommandbarClass.cmdStart = CtrlButtonStart
            Set clsCommandbarClass.cmdStop = CtrlButtonStop
        End With

    End Sub

    Klassenmodul clsCommandbarEvents:

    Public WithEvents cmdStart As Office.CommandBarButton
    Public WithEvents cmdStop As Office.CommandBarButton

    Lokale Function im AddIn:

    Public Function APITimerStart()

    ...

    Andreas


    http://www.AccessBlog.de

    Freitag, 23. März 2012 23:56
  • Hallo!

    Aus welchen Grund packst du die Events in eine extra Klasse?

    Ansonsten: Wenn di auf das Click-Ereignis reagierst, wirst du die Zuweisung '.OnAction = "=APITimerStart()"' nicht benötigen.

    Wenn du eine Beispiel-mdb hochlädst sehe ich mir das gerne an.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    Samstag, 24. März 2012 10:04
  • Hallo,

    das wäre gut. Hab leider von Add-Ins wenig Ahnung, ist mein erstes Access Add-In.

    Hab noch mal gestern daran gearbeitet, hat aber auch nicht geholfen.

    http://www.accessblog.de/Files/SvDevCounter.mda

    Gruß Andreas


    http://www.AccessBlog.de


    • Bearbeitet Andreas Vogt Samstag, 24. März 2012 17:41 Link falsch
    Samstag, 24. März 2012 15:58
  • Sorry, groß/kleinschreibung.....

    Andreas


    http://www.AccessBlog.de

    Samstag, 24. März 2012 17:42
  • Hallo Andreas,

    Am 24.03.2012 16:58, schrieb Andreas Vogt:

    Hab leider von Add-Ins wenig Ahnung, ist mein erstes Access Add-In.

    ich habe meine Kenntnisse in einem Whitepaper zusammengefasst. DU findest es hier (am Ende der Seite):
    http://www.team-moeller.de/?Downloads

    Vielleicht kannst Du dort die eine oder andere Anregung entnehmen.

    CU


    Thomas

    Homepage: www.Team-Moeller.de

    Sonntag, 25. März 2012 08:06
  • Hallo!

    Wenn du eine Deklaration mit Withevents machst, musst du auch dessen Eventhandler verwenden, um auf die Ereignisse zu reagieren.

    clsCommandbarEvents:

    Option Compare Database
    Option Explicit
    
    Private WithEvents cmdStart As Office.CommandBarButton
    Private WithEvents cmdStop As Office.CommandBarButton
    
    Public Sub InitButton(ByRef rButton1 As Office.CommandBarButton, ByRef rButton2 As Office.CommandBarButton)
        Set cmdStart = rButton1
        Set cmdStop = rButton2
    End Sub
    
    Private Sub cmdStart_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
       MsgBox "test 1"
    End Sub
    
    Private Sub cmdStop_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
       MsgBox "test 2"
    End Sub

    An deiner Stelle würde ich aber auch den Code aus mdlDevCounter, der mit den Commandbars umgeht, in die Klasse verlagern, damit etwas besser aufgeräumt ist.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch



    Sonntag, 25. März 2012 08:56
  • Hallo,

    jetzt funktioniert es 1a, danke.

    @ Thomas, danke für den Link. Kannte ich aber schon.

    Gruß Andreas


    http://www.AccessBlog.de

    Sonntag, 25. März 2012 13:17
  • Äh - hab noch eine Frage hinterher.

    Wollte jetzt alles in eine Klasse packen, aber beim AddressOf Operator streikt der Compiler mit der Meldung "unzulässige Verwendung..."  Scheinbar darf die Aufgerufene Prozedur nicht in einer Klasse sein - oder wie kann ich diese sonst aufrufen?

    Andreas


    http://www.AccessBlog.de

    Sonntag, 25. März 2012 13:41
  • Hallo!

    Ich glaub, die Funktion, die du per AdressOf übergibst muss in einem Standardmodul sein. Den Rest könntest du aber in die Klasse stecken. Das würde dir zumindest das doppelte Abspeichern der Referenzen der Commandbuttons ersparen.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    • Als Antwort markiert Andreas Vogt Sonntag, 25. März 2012 18:30
    Sonntag, 25. März 2012 17:08
  • Noch ein Problem hinterher:

    Wenn ich im AddIn in eine Tabelle im AddIn per Codedb.Execute hineinschreibe, und zur Laufzeit per db.RecordsAffected überprüfe ist alles OK. Selbst auslesen per Recordset geht. Wenn ich aber danach das AddIn selbst öffne, ist die Tabelle leer!

    Wo sind die Daten hin?

    Andreas


    http://www.AccessBlog.de

    Sonntag, 25. März 2012 20:37
  • Hallo,

    OK, Fehler gefunden (sitzt vor dem Bildschirm)

    Hab die mda statt im AddIn-Ordner im Projektordner geöffnet, da kann natürlich nichts zu finden sein.

    Gruß Andreas


    http://www.AccessBlog.de

    Montag, 26. März 2012 06:34