Kontextmenü für UserForm-Steuerelemente |
|
|||||||||||||||||||||
Standardmäßig hat auf einem UserForm nur die Titelzeile ein Kontextmenü (variables Menü der rechten Maustaste) zum Verschieben oder Schließen des UserForms. Den einzelnen Steuerelementen der Werkzeugsammlung stehen diese aber erstmals nicht zur Verfügung. Mit einer Eigenschaft des CommandBars-Objektes lässt sich aber ein Menü als Kontextmenü aufrufen: der msoPupUp-Eigenschaft. Diese Eigenschaft kann entweder direkt beim Erstellen des Menüs: CommandBars.Add Name:="MyMenuUF", Position:=msoBarPopup oder anschließend über die Positions-Eigenschaft festgelegt werden: CommandBars("MyMenuUF").Position = msoBarPopup Anschließend kann das Menü mit Menüeinträgen gefüllt werden. In diesem Beispiel sollen die TextBox-Steuerelemente mit den Funktionen Kopieren und Einfügen versehen werden. Set ctl = cb.Controls("Kopieren") If ctl Is Nothing Then Set ctl = cb.Controls.Add(msoControlButton, 1) End If ctl.FaceId = 19 'Kopieren-Symbol ctl.Caption = "Kopieren" ctl.OnAction = "MyCopyUF" ctl.Tag = "MyCopyUF" Set ctl = Nothing Wichtig Um in VBA mit der Zwischenablage arbeiten zu können, wird das DataObject-Objekt benötigt. Dieses steht allerdings nur dann zur Verfügung, wenn ein Verweis auf die Microsoft Forms 2.0 Object Library in den VBE-Verweisen gesetzt ist - sofern Ihr nicht direkt in einem UserForm ein DataObject verwendet. ' Im Modul modToolTipp Public oData As DataObject ' Im UserForm frmToolTipp If modToolTipp.oData Is Nothing Then 'Neues DatenObject für die Zwischenablage Set oData = New DataObject End If Damit wird ggf. ein neues DataObject erzeugt, wenn das erstellte nicht mehr gültig ist. In den Funktionen zum Kopieren und Einfügen werden markierte Texte in das DataObject und Inhalte aus dem DataObjekt in die TextBox eingefügt, über der das Kontextmenü aufgerufen wird.
Sub MyCopyUF() ' Kopieren Dim oCTL As TextBox Set oCTL = frmToolTipp.ActiveControl If TypeOf oCTL Is MSForms.TextBox Then 'Nur aus eine Textbox kopieren With oCTL oData.SetText .SelText, 1 'markierten Text oData.PutInClipboard 'in Zwischenablage End With End If End Sub ' Sub MyPasteUF() ' Einfügen Dim oCTL As TextBox Set oCTL = frmToolTipp.ActiveControl On Error Resume Next If TypeOf oCTL Is MSForms.TextBox Then 'Nur in eine Textbox einfügen With oCTL oData.GetFromClipboard 'Text aus Zwischenablage .SelText = oData.GetText(1) 'Markierung ersetzen/einfügen End With End If On Error GoTo 0 End Sub Damit überhaupt ein Kontextmenü bei den TextBox-Elementen angezeigt wird, werden im KeyUp-Ereignis der jweiligen TextBox-Elemente zuerst das Kontextmenü erzeugt und anschließend über die ShowPopup-Methode das Kontextmenü an der Mauszeigerposition angezeigt. Private Sub TextBox1_MouseUp(ByVal Button As Integer, _ ByVal Shift As Integer, _ ByVal X As Single, _ ByVal Y As Single) If Button = FmButtonRight Then 'bei rechter Maustaste MakeContextMenuUF Me.ActiveControl.Object 'Menü vorhanden? GGf. erzeugen CommandBars("MyMenuUF").ShowPopup 'Kontextmenü anzeigen End If End Sub Hinweis In der zum Download bereitgestellten Datei findet Ihr in der Prozedur MakeContextMenuUF noch weiteren Code zum Prüfen und Erstellen des Kontextmenüs. |
www.chf-online.de/vba/vbpUFToolTipps.htm | © 2001-11 Christian Freßdorf (Zaphod-Systems) |