Microsoft Excel

Herbers Excel/VBA-Archiv

Wie abfragen, ob Menu besteht? | Herbers Excel-Forum


Betrifft: Wie abfragen, ob Menu besteht? von: Peter
Geschrieben am: 13.01.2010 15:02:05

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

  

Betrifft: Wo ist das Problem??? von: Björn B.
Geschrieben am: 13.01.2010 15:21:14

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.


  

Betrifft: AW: Wo ist das Problem??? von: Peter
Geschrieben am: 13.01.2010 16:19:35

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


  

Betrifft: AW: Wo ist das Problem??? von: Björn B.
Geschrieben am: 13.01.2010 16:24:16

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.


  

Betrifft: AW: Danke, owT von: Peter
Geschrieben am: 13.01.2010 16:26:06




  

Betrifft: AW: Wie abfragen, ob Menu besteht? von: Nepumuk
Geschrieben am: 13.01.2010 21:06:13

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


  

Betrifft: AW: Wie abfragen, ob Menu besteht? von: Peter
Geschrieben am: 13.01.2010 22:25:55

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



  

Betrifft: AW: Wie abfragen, ob Menu besteht? von: Rudi Maintaire
Geschrieben am: 14.01.2010 10:35:53

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.


  

Betrifft: AW: Wie abfragen, ob Menu besteht? von: Peter
Geschrieben am: 14.01.2010 13:48:27

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



  

Betrifft: AW: Wie abfragen, ob Menu besteht? von: F1
Geschrieben am: 14.01.2010 15:09:50

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



  

Betrifft: AW: Wie abfragen, ob Menu besteht? von: Peter
Geschrieben am: 14.01.2010 15:37:45

Hallo F1
Wir wollten ja nicht mit "on error resume next" arbeiten.
Gruss, Peter


  

Betrifft: Deklarationsfehler von: Rudi Maintaire
Geschrieben am: 14.01.2010 19:57:36

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


  

Betrifft: AW: Deklarationsfehler von: Peter
Geschrieben am: 14.01.2010 21:51:48

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


  

Betrifft: AW: Deklarationsfehler von: Nepumuk
Geschrieben am: 14.01.2010 22:28:59

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


  

Betrifft: AW: Deklarationsfehler von: Peter
Geschrieben am: 14.01.2010 22:39:07

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


  

Betrifft: AW: Deklarationsfehler von: Nepumuk
Geschrieben am: 15.01.2010 08:18:02

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


  

Betrifft: AW: Deklarationsfehler von: Peter
Geschrieben am: 15.01.2010 08:54:19

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


  

Betrifft: hatte Beitrag irrt. geschlossen ... von: Peter
Geschrieben am: 15.01.2010 22:16:40

Hallo Nepumuk
Hallo Alle

Irgendwie schaffe ich es nicht.

Wer hilft mir? Danke, Peter


  

Betrifft: letzte Antwort von: Rudi Maintaire
Geschrieben am: 16.01.2010 00:10:04

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


  

Betrifft: AW: letzte Antwort von: Peter
Geschrieben am: 16.01.2010 18:15:15

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


Beiträge aus den Excel-Beispielen zum Thema "Wie abfragen, ob Menu besteht?"