Benutzer mit den meisten Antworten
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 FehlerDim cBar As CommandBar
Dim CtrlEdit As CommandBarControl
Dim Ctrlcombo As CommandBarControl
Dim CtrlPopup As CommandBarControlIf BarFind("SvDevCounter") Then
CommandBars("SvDevCounter").Delete
End IfSet 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 = TrueFehler:
MsgBox "Fehler bei der Menüleistenerstellung!"
End Subhttp://www.AccessBlog.de
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
- Bearbeitet Josef Pötzl Sonntag, 25. März 2012 09:02
- Als Antwort markiert Andreas Vogt Sonntag, 25. März 2012 13:16
-
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
JosefCode-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
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 WithObwohl 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
-
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
JosefCode-Bibliothek für Access-Entwickler
AccUnit - Testen von Access-Anwendungen
Virtueller Access-Stammtisch -
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
JosefCode-Bibliothek für Access-Entwickler
AccUnit - Testen von Access-Anwendungen
Virtueller Access-Stammtisch -
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 clsCommandbarEventsKlasseninitialisierung:
Private Sub InitEvents()
Dim cbrBar As Office.CommandBar
Set cbrBar = CommandBars("SvDevCounter")
With cbrBar
Set clsCommandbarClass.cmdStart = CtrlButtonStart
Set clsCommandbarClass.cmdStop = CtrlButtonStop
End WithEnd Sub
Klassenmodul clsCommandbarEvents:
Public WithEvents cmdStart As Office.CommandBarButton
Public WithEvents cmdStop As Office.CommandBarButtonLokale Function im AddIn:
Public Function APITimerStart()
...
Andreas
http://www.AccessBlog.de
-
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
JosefCode-Bibliothek für Access-Entwickler
AccUnit - Testen von Access-Anwendungen
Virtueller Access-Stammtisch -
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
-
Error 404 - Object nicht gefunden
Code-Bibliothek für Access-Entwickler
AccUnit - Testen von Access-Anwendungen
Virtueller Access-Stammtisch -
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/?DownloadsVielleicht kannst Du dort die eine oder andere Anregung entnehmen.
CU
Thomas
Homepage: www.Team-Moeller.de
-
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
- Bearbeitet Josef Pötzl Sonntag, 25. März 2012 09:02
- Als Antwort markiert Andreas Vogt Sonntag, 25. März 2012 13:16
-
Ä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
-
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
JosefCode-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
-
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