Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

msoControlPopup per VBA aufklappen

Forumthread: msoControlPopup per VBA aufklappen

msoControlPopup per VBA aufklappen
09.03.2017 10:24:36
Martin

Hallo Excel-Freunde,
ich versuche jetzt schon eine ganze Weile per VBA innerhalb eines CommandBar-msoBarPopup ein untergeordnetes msoControlPopup aufzuklappen:
Userbild
Per ShowPopup wird zwar das als CommandBar übergeordnete msoBarPopup geöffnet, aber kann ich auch irgendwie per VBA ein untergeordnetes msoControlPopup aufklappen?
Viele Grüße
Martin

Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: msoControlPopup per VBA aufklappen
10.03.2017 17:11:59
Mullit
Hallo,
mal 'n Schuß aus der Hüfte, probiers mal mit nem .Execute-Befehl auf Deinen Popup-Button...
Gruß, Mullit
AW: msoControlPopup per VBA aufklappen
12.03.2017 18:18:51
Martin
Hallo Mullit,
ich danke dir für deine Antwort, aber die Execute-Anweisung ist auf das msoControlPopup leider nicht anwendbar. Ich befürchte fast, dass es für mein Anliegen wohl keine Möglichkeit gibt :-(
Viele Grüße
Martin
Anzeige
AW: msoControlPopup per VBA aufklappen
12.03.2017 22:24:43
Mullit
Hallo,
[...] aber die Execute-Anweisung ist auf das msoControlPopup leider nicht anwendbar. [...]

...wie kommst Du darauf...?
Userbild
Gruß, Mullit
Anzeige
AW: msoControlPopup per VBA aufklappen
13.03.2017 11:06:13
Martin
Hallo Mullit,
da habe ich eine entscheidende Information in meiner Antwort vergessen: [...] die Execute-Anweisung ist auf das msoControlPopup nach Verwendung der ShowPopup-Methode leider nicht anwendbar.
Um es ausführlicher zu beschreiben: Mit der ShowPopup-Methode unterbricht der VBA-Code, bis das Kontextmenü wieder geschlossen ist. Danach folgt diese Fehlermeldung:
Userbild
Ich habe keine Idee, wie ich die Excecute-Methode vor bzw. mit der ShowPopup-Methode übergeben könnte.
Hast du vielleicht eine Idee?
Viele Grüße
Martin
Anzeige
AW: msoControlPopup per VBA aufklappen
13.03.2017 20:02:53
Mullit
Hallo,
ok, Du mußt Dich Deinem 'VBA gut'-Attribut annähern und den API-Timer ins Spiel bringen, kriegst Du das gebacken, oder soll ich Dir was proggen...?
Gruß, Mullit
AW: msoControlPopup per VBA aufklappen
14.03.2017 11:23:51
Martin
Hallo Mullit,
ohje, mit API kenne ich mich leider überhaupt nicht aus. Ich würde dein Angebot wirklich gerne in Anspruch nehmen und wäre dir für die Unterstützung sehr dankbar.
Viele Grüße
Martin
Anzeige
AW: msoControlPopup per VBA aufklappen
15.03.2017 07:23:04
Mullit
Hallo Martin,
ok, dann mal ran, vorab zur Theorie, wie Du schon richtig erkannt hast, läuft nach Aufruf der ShowPopup-Methode ähnlich wie nach Verwenden der Msgbox-Funktion kein Code mehr, d.h. man muß Code, der die Execute-Anw. ausführt, vor dem Einblenden des Popups anlaufen lassen, mit der Möglichkeit, daß er erst hinterher ausgeführt wird >>> das geht mit dem Api-Timer.
Hier also ein Bsp. der gesamte Code kommt in ein Standardmodul, dann 'prcCreatePopup' laufen lassen, einbauen in Dein Urkundenteil mußt Du's dann noch selbst...
' ********************************************************************** 
' Modul: Modul1  Typ: Standardmodul 
' ********************************************************************** 

Option Explicit

Private Declare Function SetTimer Lib "user32.dll" ( _
     ByVal hwnd As Long, _
     ByVal nIDEvent As Long, _
     ByVal uElapse As Long, _
     ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32.dll" ( _
     ByVal hwnd As Long, _
     ByVal nIDEvent As Long) As Long
Private Declare Function GetCursorPos Lib "user32.dll" ( _
     lpPoint As POINTAPI) As Long
     
Private Const GC_POPUP_BAR As String = "My_Menu_Bar"
Private Const GC_POPUP_POSITION As Long = 4

Private Type POINTAPI
     x As Long
     y As Long
End Type

Public Sub prcCreatePopup()
 Dim udtCursorPos As POINTAPI
 Call prcDeletePopup
 With Application.CommandBars.Add(Name:=GC_POPUP_BAR, _
        Position:=msoBarPopup, Temporary:=True)
      Call prcAddButtons(prcmbControls:=.Controls, pvlngMax:=6)
      Call GetCursorPos(udtCursorPos)
      Call prcStartTimer
      Call .ShowPopup(x:=udtCursorPos.x + 50, _
            y:=udtCursorPos.y + 50)
 End With
 Call prcDeletePopup
End Sub

Private Sub prcDeletePopup()
  Dim cmbBar As CommandBar
  For Each cmbBar In Application.CommandBars
     With cmbBar
         If .Name = GC_POPUP_BAR And _
           .Type = msoBarTypePopup Then _
              Call .Delete
     End With
  Next
End Sub

Private Sub prcAddButtons(ByRef prcmbControls As CommandBarControls, _
       ByVal pvlngMax As Long)
   Dim strText As String
   Dim lngIndex As Long
   If pvlngMax = 3 Then strText = "_Pop " _
   Else: strText = " "
   With prcmbControls
        For lngIndex = 1 To pvlngMax
            With .Add(Type:=msoControlButton, Temporary:=True)
                 .Caption = "Button" & strText & lngIndex
                 .OnAction = "TestMakro"
                 If pvlngMax = 3 And lngIndex = 3 Then _
                    .State = msoButtonDown
            End With
        Next
        If pvlngMax = 6 Then
            With .Add(Type:=msoControlPopup, _
                         Before:=GC_POPUP_POSITION, Temporary:=True)
                  Call prcAddButtons(prcmbControls:=.Controls, pvlngMax:=3)
                 .Caption = "My_Popup"
            End With
        End If
  End With
End Sub

Private Sub TestMakro()
MsgBox Application.CommandBars.ActionControl.Caption
End Sub

Private Sub prcStartTimer()
Call SetTimer(Application.hwnd, 0&, 10&, AddressOf TimerProc)
End Sub

Private Sub prcStopTimer()
Call KillTimer(Application.hwnd, 0&)
End Sub

Private Sub TimerProc(ByVal pvlngHwnd As Long, ByVal pvlngnIDEvent As Long, _
     ByVal pvlnguElapse As Long, ByVal pvlnglpTimerFunc As Long)
  Static slngTimerFunc As Long
  If slngTimerFunc = 0 Then slngTimerFunc = pvlnglpTimerFunc
  With Application.CommandBars(GC_POPUP_BAR)
      If .Visible Then
        Call prcStopTimer
        slngTimerFunc = 0
        Call .Controls(GC_POPUP_POSITION).Execute
      ElseIf pvlnglpTimerFunc - slngTimerFunc > 50 Then
        Call prcStopTimer
        slngTimerFunc = 0
        Call MsgBox("Can't show Popup...!", vbExclamation, "Error")
      End If
  End With
End Sub


VBA/HTML - CodeConverter für Office-Foren
AddIn für Excel/Word 2000-2010 - komplett in VBA geschrieben von Lukas Mosimann
Projektbetreuung durch mumpel



Code erstellt und getestet in Office 14

Gruß, Mullit
Anzeige
AW: msoControlPopup per VBA aufklappen
15.03.2017 13:42:19
Martin
Hallo Mullit,
vielen lieben Dank für deine Arbeit. Dein Code funktioniert wirklich hervorragend, ich bin beeindruckt! Ich wollte mich jetzt sofort bei dir melden und bedanken, habe den Code aber noch nicht auf meine Bedürfnisse angepasst. Deshalb würde ich dich bitten diesen Beitrag noch im Blick zu behalten, falls es mir nicht gelingen sollte deinen Code auf mein msoControlPopup zu übertragen.
Ich melde mich noch einmal, sobald es mir gelungen ist (...oder ein Problem auftritt).
Nochmals ein dickes Dankeschön!
Viele Grüße
Martin
PS: Wie hast du dir die API-Kenntnisse angeeignet? Gibt es irgendwelche Fachliteratur, die du empfehlen kannst?
Anzeige
AW: msoControlPopup per VBA aufklappen
15.03.2017 18:35:12
Martin
Hallo Mullit,
deine Programmierung funktioniert auch in meinem Fall perfekt. Nochmals vielen Dank! Das hätte ich allein niemals hinbekommen, weil ich keinerlei Kenntnisse von API habe. Darf ich an dieser Stelle trotzdem noch einmal fragen wie du dir dein API-Wissen angeeignet hast und ob du irgendwelche Fachliteratur empfehlen kannst?
Viele Grüße
Martin
Anzeige
AW: msoControlPopup per VBA aufklappen
17.03.2017 01:12:29
Mullit
Hallo Martin,
ok, prima, ja aus einer Mischung von Internet-Recherche und Pdf-Book Studium (ok, gehört irgendwie auch zur INet-Recherche...) mußt Du mal 'n bißchen Tante Gurgel befragen...
Als Bibel unter den Büchern zur VB-Api-Programmierung gilt Dan Appleman's Visual Basic Programmer's Guide to the Win32 API, gab's lange Zeit nur noch Secondhand, mußt Du mal bei Amazon gucken...
Bei den Webpages sind da u.a. als Quellen zu empfehlen:
http://www.activevb.de/startseite/index.html
http://www.vb-fun.de/vb/index.htm
http://www.vbarchiv.net/home/index.php
Vielleicht noch als Tipp: guck Dir in den Foren mal die Codes von Nepumuk (war für mich ein Top-Einstieg dazu...) und Isabelle, sowie den Blog von Case an, da findest Du schon jede Menge Beispiele...
Gruß, Mullit

Anzeige
;
Anzeige

Infobox / Tutorial

msoControlPopup per VBA aufklappen


Schritt-für-Schritt-Anleitung

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor in Excel zu öffnen.

  2. Modul erstellen: Klicke mit der rechten Maustaste auf "VBAProject (DeineDatei.xlsx)" und wähle "Einfügen" > "Modul".

  3. Code einfügen: Kopiere den folgenden Code in das neue Modul:

    Option Explicit
    
    Private Declare Function SetTimer Lib "user32.dll" ( _
       ByVal hwnd As Long, _
       ByVal nIDEvent As Long, _
       ByVal uElapse As Long, _
       ByVal lpTimerFunc As Long) As Long
    
    Private Declare Function KillTimer Lib "user32.dll" ( _
       ByVal hwnd As Long, _
       ByVal nIDEvent As Long) As Long
    
    Private Declare Function GetCursorPos Lib "user32.dll" ( _
       lpPoint As POINTAPI) As Long
    
    Private Const GC_POPUP_BAR As String = "My_Menu_Bar"
    Private Const GC_POPUP_POSITION As Long = 4
    
    Private Type POINTAPI
       x As Long
       y As Long
    End Type
    
    Public Sub prcCreatePopup()
       Dim udtCursorPos As POINTAPI
       Call prcDeletePopup
       With Application.CommandBars.Add(Name:=GC_POPUP_BAR, _
           Position:=msoBarPopup, Temporary:=True)
           Call prcAddButtons(prcmbControls:=.Controls, pvlngMax:=6)
           Call GetCursorPos(udtCursorPos)
           Call .ShowPopup(x:=udtCursorPos.x + 50, _
               y:=udtCursorPos.y + 50)
       End With
       Call prcDeletePopup
    End Sub
    
    Private Sub prcDeletePopup()
       Dim cmbBar As CommandBar
       For Each cmbBar In Application.CommandBars
           With cmbBar
               If .Name = GC_POPUP_BAR And _
                   .Type = msoBarTypePopup Then _
                   Call .Delete
           End With
       Next
    End Sub
    
    Private Sub prcAddButtons(ByRef prcmbControls As CommandBarControls, _
       ByVal pvlngMax As Long)
       Dim strText As String
       Dim lngIndex As Long
       If pvlngMax = 3 Then strText = "_Pop " _
       Else strText = " "
       With prcmbControls
           For lngIndex = 1 To pvlngMax
               With .Add(Type:=msoControlButton, Temporary:=True)
                   .Caption = "Button" & strText & lngIndex
                   .OnAction = "TestMakro"
                   If pvlngMax = 3 And lngIndex = 3 Then _
                       .State = msoButtonDown
               End With
           Next
           If pvlngMax = 6 Then
               With .Add(Type:=msoControlPopup, _
                   Before:=GC_POPUP_POSITION, Temporary:=True)
                   Call prcAddButtons(prcmbControls:=.Controls, pvlngMax:=3)
                   .Caption = "My_Popup"
               End With
           End If
       End With
    End Sub
    
    Private Sub TestMakro()
       MsgBox Application.CommandBars.ActionControl.Caption
    End Sub
  4. Makro ausführen: Führe das Makro prcCreatePopup aus, um dein msoControlPopup zu erstellen.


Häufige Fehler und Lösungen

  • Fehler: "Can't show Popup...!"
    Lösung: Stelle sicher, dass der Timer korrekt implementiert ist und der Code für das msoControlPopup korrekt aufgerufen wird.

  • Fehler bei der Ausführung von Execute
    Lösung: Achte darauf, dass die ShowPopup-Methode nicht den Codefluss blockiert. Nutze den API-Timer, um sicherzustellen, dass der Execute-Befehl erst nach dem Popup angezeigt wird.


Alternative Methoden

Wenn du Schwierigkeiten mit der VBA-Implementierung hast, kannst du auch die folgende Methode ausprobieren:

  1. Verwende Excel-Datenüberprüfung, um Dropdown-Listen zu erstellen, die ohne VBA auskommen.
  2. Nutze ActiveX-Steuerelemente, um mehr Interaktivität in deinen Excel-Arbeitsblättern zu schaffen.

Praktische Beispiele

Hier ist ein Beispiel, wie du das msoControlPopup verwenden kannst, um ein Menü mit Action-Buttons zu erstellen:

Sub BeispielPopup()
    Call prcCreatePopup
End Sub

Füge diesen Code in ein Modul ein und führe BeispielPopup aus, um dein Popup zu testen.


Tipps für Profis

  • API-Kenntnisse erweitern: Nutze Ressourcen wie Dan Appleman's Buch über die Win32 API, um dein Verständnis zu vertiefen.
  • Code optimieren: Halte deinen Code sauber und modular, um die Wartbarkeit zu verbessern.
  • Debugging: Verwende Debug.Print, um Variablenwerte während der Ausführung zu überwachen.

FAQ: Häufige Fragen

1. Was ist msoControlPopup?
msoControlPopup ist ein Steuerelement in VBA, das es ermöglicht, Popup-Menüs in Excel zu erstellen.

2. Wie kann ich ein Popup in einer anderen Sprache aufklappen?
In der englischen Version von Excel wird msoControlPopup als "msoControlPopup" bezeichnet. Die Methoden bleiben gleich, auch wenn die Sprache wechselt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige