2
www.ChF-Online.de  

Kontextmenü für UserForm-Steuerelemente

   Neuigkeiten
   API-Aufrufe in VBA
   VBA2HTML
   Word
   Word-VBA
 Verschiedenes
 Feld-Arbeiten
 Form-Sachen
 Menü-/Symbolleisten
 VBA und Lotus Notes
 VBA und Mail
 Inside VBAIDE
 Von Word nach Outlook
aktiv aktiv Fix-und-Fertiges/Projekte
 Aufgaben in OL eintragen
 Einfacher Dateibrowser
 Formatvorlagen
 Formularfelder sichern
 Formluarfelder formatieren
 Formluarfelder formatieren 2
 Formluarfelder formatieren 3
 Formular-QuickInfos
aktiv  Kontextmenü erstellen
 Sicherheitskopien an bel. Orten
 Sicherheitskopien erstellen Word 2007/2010
 ToolTipps ändern
 Dokumenteigenschaften kopieren
 (Jahres-)Kalender erstellen
 Zeichen-Zähler
   Word2007 (RibbonX)
   Word2010 (RibbonX)
   Outlook-VBA
   Links zu VB(A)
   DocToHelp
   Netport Express XL
   Astronomie
   Gästebuch
   Volltextsuche
   Sitemap
   Buch:Word-Programmierung
   Impressum & Kontakt
   Datenschutzerklärung
Getestet unter Word2000Getestet unter WordXPGetestet unter Word2003  
VBA-Code verfügbar: Ja
Beispiel anzeigen
Makro/Datei speichern
Print

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.
Für die Menüeinträge werden die Standard-Symbole (über die FaceId-Eigenschaft) von Word verwendet und mit den entsprechenden Prozeduren verbunden, z.B. für den Kopieren-Befehl:

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
Leider lassen sich die Word-internen Befehle zum Kopieren und Einfügen nicht verwenden, da diese nicht auf die Steuerelemente wirken, sondern Text in das Dokument einfügen.
Aus diesem Grund müssen die beiden Befehle über entsprechende Funktionen nachgebildet werden.

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
Die normalen Kopier/Einfüge-Befehle stehen aber auch weiterhin über die Tastenkombinationen Strg+C und Strg+V zur Verfügung.

In der zum Download bereitgestellten Datei findet Ihr in der Prozedur MakeContextMenuUF noch weiteren Code zum Prüfen und Erstellen des Kontextmenüs.


 Besucher: 1 online  |  78 heute  |  2678 diesen Monat  |  1593927 insgesamt | Seitenaufrufe: 103   Letzte Änderung: 02.10.2006 © 2001-14 Christian Freßdorf
  In zweifelhaften Fällen entscheide man sich für das Richtige.
Karl Kraus
 powered by phpCMS and PAX