Anzeige
Archiv - Navigation
1128to1132
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Wie abfragen, ob Menu besteht?

Wie abfragen, ob Menu besteht?
Peter
Guten Tag
Untenstehender

Sub wird von verschiedenen Codes aufgerufen. Manchmal ist das Menu schon weg, dann passiert  _
nichts weiteres. Nun rufe ich diesen Code aus einem 

Sub auf, in dem auch "On Error Resume Next" steht und bei dem die Err.Number ausgewertet wird.
Wie kann ich untenstehenden 

Sub anpassen, dass ich die Err.Number nicht zuletzt auf 0 stellen muss? Mit anderen Worten: Wie  _
frage ich ab, ob das entsprechende Menu überhaupt angezeigt wird?
Danke und Gruss, Peter

Sub Menü_Löschen()
On Error Resume Next
CommandBars.ActiveMenuBar.Controls(MenueName).Delete
Err.Number = 0 'Wert muss auf NULL gesetzt werden, da Err.Number in aufrufendem
'

Sub zu Problemen führt
'hier ergibt sich Err.Number, wenn Menu nicht vorhanden
End Sub

Wo ist das Problem?
13.01.2010 15:21:14
Björn
Hallo Peter,
ich verstehe ehrlich gesagt nicht, wo Dein Problem ist.
Dein Code funktioniert doch jetzt so, wie er da steht, oder?
Dich stört nur die eine Zeile?
Also ich mache das genauso (Auszug aus meiner Datei, also nicht auf Deine Namen angepasst):

Sub CmdDelete()
'Löschen der erzeugten Menüeinträge
'Aufruf aus "Workbook_WindowDeactivate" in "DieseArbeitsmappe"
On Error GoTo ERRORHANDLER
Application.CommandBars("Worksheet Menu Bar").Controls("Teilekatalog").Delete
ERRORHANDLER:
Err.Number = 0
End Sub
Das funktioniert seit Jahren bei mir.
Gruß
Björn B.
Anzeige
AW: Wo ist das Problem?
13.01.2010 16:19:35
Peter
Hallo Björn
Es ist ja nicht wirklich ein Problem; ich habe mich nur gefragt, ob es auch "elegant" ist oder ob man das anders löst.
Danke und Gruss, Peter
AW: Wo ist das Problem?
13.01.2010 16:24:16
Björn
Hallo,
nun, es gibt andere Wege, aber ob die schneller, eleganter, aufwändiger, oder was auch immer sind...
Du könntest z.B. alle Controls durchgehen und prüfen, ob sie einen bestimmten namen haben, wenn der gesuchte dabei ist, deinen Code ausführen.
Wenn Dir das besser gefällt, dann mach es so, aber weniger Code wird es dadurch nicht.
So viel ich weiß, geht das in VBA nicht anders. In anderen Programmiersprachen kann man einzelne Elemente abfragen, ob sie vorhanden sind (z.B. mit AVAILABLE). Das ist da immer ganz hilfreich.
Hilft Dir aber natürlich hier nicht weiter...
Gruß
Björn B.
Anzeige
AW: Danke, owT
13.01.2010 16:26:06
Peter
AW: Wie abfragen, ob Menu besteht?
13.01.2010 21:06:13
Nepumuk
Hallo Peter,
1. So geht es zwar Err.Number = 0, aber das macht man nicht. Schöner ist es so: Err.Clear
2. Gib dem Button eine eindeutige Tag-Eigenschaft. Dann kannst du es so lösen:
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Private Const BUTTON_TAG = "Mein Button"

Public Sub Create_Button()
    Dim objButton As CommandBarButton
    Call Delete_Button
    Set objButton = CommandBars(1).Controls.Add(Type:=msoControlButton, TemporarY:=True)
    With objButton
        
        'Hier kommen deine Eigenschaften
        
        .Tag = BUTTON_TAG
    End With
    Set objButton = Nothing
End Sub

Public Sub Delete_Button()
    Dim objButton As CommandBarButton
    Set objButton = CommandBars.FindControl(Tag:=BUTTON_TAG)
    If Not objButton Is Nothing Then objButton.Delete
    Set objButton = Nothing
End Sub

Gruß
Nepumuk
Anzeige
AW: Wie abfragen, ob Menu besteht?
13.01.2010 22:25:55
Peter
Hallo Nepumuk
Vielen Dank für deine Antwort. Wenn ich richtig verstehe, bist du davon ausgegangen, dass ich mich mit einem Button herumschlage. Es handelt sich aber um ein benutzerdefiniertes Menü, das ich mit nachstehendem Code erstelle.
Kannst ich deinen Code auch auf ein benutzerdefiniertes Menü anwenden?
Bin gespannt auf die Antwort.
Gruss, Peter
Const MenueName = "&psMenü"
Sub Menü_Erstellen()
Dim MB As Object, MeinMenü As Object, Befehl As Object
Call Menü_Löschen
Set MB = CommandBars.ActiveMenuBar
Set MeinMenü = MB.Controls.Add(Type:=msoControlPopup, Temporary:=True)
MeinMenü.Caption = MenueName
Set Befehl = MeinMenü.Controls.Add(Type:=msoControlButton, ID:=1)
With Befehl
.Caption = Befehl1
.OnAction = "Machwas1"
End With
End Sub

Sub Machwas1()
Call DatenEintragen
End Sub

Anzeige
AW: Wie abfragen, ob Menu besteht?
14.01.2010 10:35:53
Rudi
Hallo,
das ist das gleiche in grün.
Public Const BUTTON_TAG As String = "MeinMenue"
Public Sub Menue_Erstellen()
Dim MB As Object, MeinMenue As Object, Befehl As Object
Call Delete_Menue
Set MB = CommandBars.ActiveMenuBar
Set MeinMenue = MB.Controls.Add(Type:=msoControlPopup, Temporary:=True)
With MeinMenue
.Caption = MenueName
.Tag = BUTTON_TAG
End With
Set Befehl = MeinMenue.Controls.Add(Type:=msoControlButton, ID:=1)
With Befehl
.Caption = Befehl1
.OnAction = "Machwas1"
End With
End Sub
Public Sub Delete_Button()
Dim objButton As CommandBarButton
Set objButton = CommandBars.FindControl(Tag:=BUTTON_TAG)
If Not objButton Is Nothing Then objButton.Delete
Set objButton = Nothing
End Sub
Gruß
Rudi
Vermeide Umlaute in Prozedurnamen, Variablennamen etc.
Anzeige
AW: Wie abfragen, ob Menu besteht?
14.01.2010 13:48:27
Peter
Hallo Rudi
Irgend etwas klappt beim Löschen des Menus noch nicht. Ich habe diesen Sub jetzt "Delete_Menue" benannt. Aber es sit ja nicht ein CommandBarButton, doch ich konnte es irgendwie nicht umschreiben. Hilfe ist sehr erwünscht. Danke und Gruss, Peter
Public Sub Delete_Menue()
Dim objButton As CommandBarButton
Set objButton = CommandBars.FindControl(Tag:=Menue_Tag)
If Not objButton Is Nothing Then objButton.Delete
Set objButton = Nothing
End Sub

AW: Wie abfragen, ob Menu besteht?
14.01.2010 15:09:50
F1

Sub Menü_Löschen()
On Error Resume Next
CommandBars.ActiveMenuBar.Controls(MenueName).Delete
End Sub
Die OnError-Routine wird bei End

Sub auromatisch beendet.

Anzeige
AW: Wie abfragen, ob Menu besteht?
14.01.2010 15:37:45
Peter
Hallo F1
Wir wollten ja nicht mit "on error resume next" arbeiten.
Gruss, Peter
Deklarationsfehler
14.01.2010 19:57:36
Rudi
Hallo,
Dim objButton As CommandControl
  Public Sub Menue_Erstellen()
Dim MB As Object, MeinMenue As Object, Befehl As Object
Call Delete_Button
Set MB = CommandBars.ActiveMenuBar
Set MeinMenue = MB.Controls.Add(Type:=msoControlPopup, Temporary:=True)
With MeinMenue
.Caption = Menuename
.Tag = BUTTON_TAG
End With
Set Befehl = MeinMenue.Controls.Add(Type:=msoControlButton, ID:=1)
With Befehl
.Caption = Befehl1
.OnAction = "Machwas1"
End With
End Sub
Public Sub Delete_Button()
Dim objButton As CommandBarControl
Set objButton = CommandBars.FindControl(Tag:=BUTTON_TAG)
If Not objButton Is Nothing Then objButton.Delete
Set objButton = Nothing
End Sub

dann sollte es laufen
Gruß
Rudi
Anzeige
AW: Deklarationsfehler
14.01.2010 21:51:48
Peter
Hallo Rudi
Irgend etwas klappt noch nicht. So wird jetzt beim Aktivieren der Datei kein Menu mehr erstellt - ob es wieder Entfernt würde beim Deaktivieren, kann ich so nicht feststellen.
Ich habe nun das Modul "Menuerweiterung" in eine Beispielmappe genommen und hochgeladen.
Wäre super, wenn mir jemand sagen könnte, was da schief ist.
Nach meiner Vorstellung sollte beim Aufstarten resp. Aktivieren der Datei ein Menu namens "psMenu" mit den Unterpunkten (oder wie sagt man dem) "Menu 1", "Menu 2" und "Menu 3" erscheinen.
Beim Deaktivieren entsprechend wieder verschwinden.
Gruss, Peter
https://www.herber.de/bbs/user/67232.xls
Anzeige
AW: Deklarationsfehler
14.01.2010 22:28:59
Nepumuk
Hallo Peter,
setz in einem der Buttons in deiner Leiste die Tag-Eigenschaft. Beim löschen suchst du den Button und löschst das Parent-Objekt.
Public Sub Delete_Button()
    Dim objButton As CommandBarControl
    Set objButton = CommandBars.FindControl(Tag:=BUTTON_TAG)
    If Not objButton Is Nothing Then objButton.Parent.Delete
    Set objButton = Nothing
End Sub

Gruß
Nepumuk
Anzeige
AW: Deklarationsfehler
14.01.2010 22:39:07
Peter
Hallo Nepumuk
Bin da leider etwas schwer von Begriff. Meinstest du so (z.B. beim Menu 1)? Da kommt dann als Fehlermeldung: "Die Methode 'Delete' für das Objekt Commandbar ist fehlgeschlagen."
Gruss, Peter
Set Befehl = MeinMenue.Controls.Add(Type:=msoControlButton, ID:=1)
With Befehl
.Caption = Befehl1
.OnAction = "Machwas1"
.Tag = BUTTON_TAG
End With
AW: Deklarationsfehler
15.01.2010 08:18:02
Nepumuk
Hallo Peter,
ein Beispiel:
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Private Const BUTTON_TAG = "Mein Button"

Public Sub Create_Bar()
    Dim objBar As CommandBar, objButton As CommandBarButton
    Call Delete_Bar
    Set objBar = CommandBars.Add(Name:="Meine Commandbar", Temporary:=True)
    Set objButton = objBar.Controls.Add(Type:=msoControlButton)
    With objButton
        .Tag = BUTTON_TAG
    End With
    objBar.Visible = True
    Set objButton = Nothing
    Set objBar = Nothing
End Sub

Public Sub Delete_Bar()
    Dim objButton As CommandBarControl
    Set objButton = CommandBars.FindControl(Tag:=BUTTON_TAG)
    If Not objButton Is Nothing Then objButton.Parent.Delete
    Set objButton = Nothing
End Sub

Gruß
Nepumuk
AW: Deklarationsfehler
15.01.2010 08:54:19
Peter
Hallo Nepumuk
Ich stehe wohl an verschiedenen Orten auf der Leitung und deshalb komme ich nicht klar. Beim Auswechseln des Codes bekomme ich das Menu nicht mehr hin.
Könntest du mir allenfalls in der hochgeladenen Datei die Routine einbauen, dass ein bei "Create" ein benutzerdefiniertes Menu mit den drei anwählbaren Positionen erstellt wird und bei "Delete" dieses wieder entfernt wird. Und wenn "Delete" aufgerufen wird, wenn das Menu schon entfernt wurde, soll nichts mehr passieren. Das wäre super.
Danke und Gruss, Peter
https://www.herber.de/bbs/user/67232.xls
hatte Beitrag irrt. geschlossen ...
15.01.2010 22:16:40
Peter
Hallo Nepumuk
Hallo Alle
Irgendwie schaffe ich es nicht.
Wer hilft mir? Danke, Peter
letzte Antwort
16.01.2010 00:10:04
Rudi
Hallo,
du solltest mal Option Explicit einschalten.
Die Var MenueName ist leer. Ergo ist die Caption deines Controls "" und somit nicht sichtbar.
Geh mal vorsichtig mit der Maus von re nach li über die Arbeitsblattleiste.
Gruß
Rudi
AW: letzte Antwort
16.01.2010 18:15:15
Peter
Hallo Rudi
Ich danke dir für alle Hilfe. Letztlich bin ich an meinem Unvermögen diesmal gescheitert. Ich wollte ein Menue etwas eleganter ausschalten und habe den Hinweis zum Button_Tag erhalten, der wieder in einer bestimmten Beziehung zu einer Command-Bar steht.
Danke und Gruss, Peter

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige