Autor: Max Kaffl (Nepumuk)  --- Aus Excel VBA - Gruppe: Tutorials

Symbolleisten (4) - Pop Up (Ab E2000) - Weiter heftig!!!

Autor: Max Kaffl (Nepumuk) - Erstellt: --      - Letzte Revision: --Gruppenthema: 5 Folgen 1 2 3 4 5 Sie sind in Folge:4
Im vierten Teil der als Trilogie geplanten Reihe werden sie das Popup - Menü kennen lernen.

Dieser Code ist erst ab Excel 2000 lauffähig!


Das liegt daran, dass in den Übergabeparametern enumerierte Variablen verwendet werden. Diese wurden schon im dritten Teil erwähnt.

Auch hier gilt wieder: Sollte Excel völlig unerwartet abstürzen, während die Symbolleiste geändert ist, können sie diese Änderung durch erneutes öffnen und schließen der Mappe zurücksetzen.


Als kleine Aufwärmübung wollen wir ein Popup erstellen, welches durch den Rechtsklick auf einen Tabellenreiter erscheint.

Nun gut, da gibt es ja schon eines, welches wir deaktivieren könnten. Aber wie bekommen wir dann ein eigenes? In Excel gibt es keine Möglichkeit, den Rechtsklick auf einen Tabellenreiter auszuwerten. Also übernehmen wir das vorhandene Popup und frisieren es um.

Dazu löschen wir die vorhandenen Einträge in einer For Each - Next Schleife. Die leere Leiste wird dann mit eigenen Buttons bestückt. Sie können aber auch andere Steuerelemente in die Leiste packen. Wir bedienen uns hierbei der Methoden aus dem dritten Teil.

Fügen sie die folgenden Hauptroutinen in ein Standardmodul ein.

Option Explicit
Option Private Module

Private Declare Function MakeSureDirectoryPathExists Lib "imagehlp.dll" ( _
 ByVal DirPath As String) As Long
 
Private Const FILE_NAME As String = "NeueDaten.xls"
Private Const FILE_PATH As String = "C:\Temp\"
Private Const MAIL_ADDRESS As String = "xxxxx@yyyyy.zz" 'Mailadresse !!!

Public Sub prcChangeMenu()
 Dim cmdCommandBar As CommandBar
 Dim cmdCommandBarControl As CommandBarControl
 Set cmdCommandBar = Application.CommandBars("Ply")
 For Each cmdCommandBarControl In cmdCommandBar.Controls
 cmdCommandBarControl.Delete
 Next
 Call prcControlAdd(objParent:=cmdCommandBar, enumType:=msoControlButton, _
 varCaption:="Aufsteigend sortieren", varFaceId:=210, _

 varOnAction:="prcSort", enumStyle:=msoButtonIconAndCaption, _
 varTag:="1")
 Call prcControlAdd(objParent:=cmdCommandBar, enumType:=msoControlButton, _
 varCaption:="Absteigend sortieren", varFaceId:=211, _
 varOnAction:="prcSort", enumStyle:=msoButtonIconAndCaption, _
 varTag:="0")
 Call prcControlAdd(objParent:=cmdCommandBar, enumType:=msoControlButton, _
 varCaption:="Monatstabelle einfügen", varFaceId:=635, _
 varOnAction:="prcInsertNewMonth", enumStyle:=msoButtonIconAndCaption)
 Call prcControlAdd(objParent:=cmdCommandBar, enumType:=msoControlButton, _
 bolBeginGroup:=True, varCaption:="Als Mailanhang senden", _
 varFaceId:=2188, varOnAction:="prcMail", _
 enumStyle:=msoButtonIconAndCaption)
 Set cmdCommandBar = Nothing
End Sub

Public Sub prcResetMenu()
 Application.CommandBars("Ply").Reset
End Sub

Private Sub prcControlAdd( _
 ByRef objParent As Object, _
 Optional ByRef varControl As Variant, _
 Optional ByVal enumType As MsoControlType, _
 Optional ByVal varId As Variant, _
 Optional ByVal varBefore As Variant, _
 Optional ByVal varTemporary As Variant, _
 Optional ByVal bolBeginGroup As Boolean = False, _
 Optional ByVal varCaption As Variant, _
 Optional ByVal varFaceId As Variant, _
 Optional ByVal varOnAction As Variant, _
 Optional ByVal enumStyle As MsoButtonStyle, _
 Optional ByVal varTipText As Variant, _
 Optional ByVal enumState As MsoButtonState, _
 Optional ByVal varTag As Variant, _
 Optional ByVal enumLinkType As MsoCommandBarButtonHyperlinkType, _
 Optional ByVal bolEnabled As Boolean = True, _
 Optional ByVal bolVisible As Boolean = True)
 Dim cmbControl As CommandBarControl
 Select Case IIf(enumType, 1, 0) & IIf(IsMissing(varId), 0, 1) & _
 IIf(IsMissing(varBefore), 0, 1) & IIf(IsMissing(varTemporary), 0, 1)
 Case "0100": Set cmbControl = objParent.Controls.Add(ID:=varId)
 Case "0101": Set cmbControl = objParent.Controls.Add(ID:=varId, _
  Temporary:=varTemporary)
 Case "0110": Set cmbControl = objParent.Controls.Add(ID:=varId, _
  Before:=varBefore)
 Case "0111": Set cmbControl = objParent.Controls.Add(ID:=varId, _
  Before:=varBefore, Temporary:=varTemporary)
 Case "1000": Set cmbControl = objParent.Controls.Add(Type:=enumType)
 Case "1001": Set cmbControl = objParent.Controls.Add(Type:=enumType, _
  Temporary:=varTemporary)
 Case "1010": Set cmbControl = objParent.Controls.Add(Type:=enumType, _
  Before:=varBefore)
 Case "1011": Set cmbControl = objParent.Controls.Add(Type:=enumType, _
  Before:=varBefore, Temporary:=varTemporary)
 Case "1100": Set cmbControl = objParent.Controls.Add(Type:=enumType, _
  ID:=varId)
 Case "1101": Set cmbControl = objParent.Controls.Add(Type:=enumType, _
  ID:=varId, Temporary:=varTemporary)
 Case "1110": Set cmbControl = objParent.Controls.Add(Type:=enumType, _
  ID:=varId, Before:=varBefore)
 Case "1111": Set cmbControl = objParent.Controls.Add(Type:=enumType, _
  ID:=varId, Before:=varBefore, Temporary:=varTemporary)
 End Select
 With cmbControl
 .BeginGroup = bolBeginGroup
 If Not IsMissing(varCaption) Then .Caption = varCaption
 If Not IsMissing(varFaceId) Then .FaceId = varFaceId
 If Not IsMissing(varOnAction) Then .OnAction = varOnAction
 If enumStyle Then .Style = enumStyle
 If Not IsMissing(varTipText) Then .TooltipText = varTipText
 If enumState Then .State = enumState
 If Not IsMissing(varTag) Then .Tag = varTag
 If enumLinkType Then .HyperlinkType = enumLinkType
 .Enabled = bolEnabled
 .Visible = bolVisible
 End With
 If Not IsMissing(varControl) Then Set varControl = cmbControl
 Set cmbControl = Nothing
End Sub

Dazu gibt es, als Beispiele, ein paar kleine Routinen, welche durch das Popup aufgerufen werden können. Wenn sie eine davon in ihr Projekt integrieren wollen, so müssen sie angepasst werden. Beispielsweise um Fehler abzufangen, oder denken sie bei Tabellenoperationen an den Mappenschutz.

Das erste Makro sortiert die Tabellen nach Namen, aufsteigend oder absteigend.

Das zweite fügt ein Tabellenblatt mit einem definierten Namen hinzu.

Das dritte ruft eine Prozedur auf, die als Standardroutine für den Mailversand mit Outlook dient. Sie wird dazu benutzt, die aktive Tabelle als Anhang an eine Mailadresse zu schicken. Da in dem Makro die Tabelle temporär gespeichert werden muss, wird mit der API - Funktion „MakeSureDirectoryPathExists" sichergestellt, dass der entsprechende Ordner auch existiert. Gibt es ihn, passiert nichts, gibt es ihn nicht, wird er angelegt.

Fügen sie die Makros unter den bestehenden ein.

Private Sub prcSort()
 Dim intSheetCount As Integer
 Dim intIndex1 As Integer, intIndex2 As Integer
 Dim bolAscending As Boolean
 bolAscending = CBool(Application.CommandBars.ActionControl.Tag)
 Application.ScreenUpdating = False
 With ThisWorkbook
 intSheetCount = .Sheets.Count
 For intIndex1 = 1 To intSheetCount
  For intIndex2 = intIndex1 To intSheetCount
  If .Sheets(intIndex2).Visible = xlSheetVisible _
   And .Sheets(intIndex1).Visible = xlSheetVisible Then
   If bolAscending Then
   If UCase$(.Sheets(intIndex2).Name) _
    < UCase$(.Sheets(intIndex1).Name) Then _
    .Sheets(intIndex2).Move Before:=.Sheets(intIndex1)
   Else
   If UCase$(.Sheets(intIndex2).Name) _
    > UCase$(.Sheets(intIndex1).Name) Then _
    .Sheets(intIndex2).Move Before:=.Sheets(intIndex1)
   End If
  End If
  Next
 Next
 End With
 Application.ScreenUpdating = True
End Sub

Private Sub prcInsertNewMonth()
 Dim objSheet As Object
 Dim strSheetname As String
 Dim bolFound As Boolean
 Dim intCount As Integer
 With ThisWorkbook
 Do
  strSheetname = Format(CStr(Year(DateAdd("m", intCount, Date))), "0000") _
  & " " & Format(CStr(Month(DateAdd("m", intCount, Date))), "00")
  For Each objSheet In .Sheets
  If objSheet.Name = strSheetname Then bolFound = True: Exit For
  Next
  If Not bolFound Then
  .Worksheets.Add After:=.Sheets(.Sheets.Count)
  .ActiveSheet.Name = strSheetname
  Exit Do
  Else
  bolFound = False
  End If
  intCount = intCount + 1
 Loop
 End With
End Sub

Private Sub prcMail()
 Dim strBody As String
 MakeSureDirectoryPathExists FILE_PATH
 If Dir(FILE_PATH & FILE_NAME) <> "" Then Kill FILE_PATH & FILE_NAME
 Application.ScreenUpdating = False
 ThisWorkbook.ActiveSheet.Copy
 ActiveWorkbook.Close SaveChanges:=True, Filename:=FILE_PATH & FILE_NAME
 Application.ScreenUpdating = True
'Html - Body
' strBody = "<p>Hallo,</p><p>im Anhang die neuesten Daten.</p>" & _
 "<p>mfg</p><p>Mein Name</p><p>" & CStr(Now) & "</p>"
'Text - Body
 strBody = "Hallo," & vbLf & "im Anhang die neuesten Daten." & _
 vbLf & "mfg " & vbLf & "Mein Name" & vbLf & _
 CStr(Now) & String(3, vbLf)
 Call prcSendMail(bolHtml:=False, bolSend:=False, varTo:=MAIL_ADDRESS, _
 varSubject:="Änderungen vom " & CStr(Date), varMailBody:=strBody, _
 varAttachments:=FILE_PATH & FILE_NAME)
 If Dir(FILE_PATH & FILE_NAME) <> "" Then Kill FILE_PATH & FILE_NAME
End Sub

Private Sub prcSendMail( _
 ByVal bolHtml As Boolean, _
 ByVal bolSend As Boolean, _
 Optional ByVal varTo As Variant, _
 Optional ByVal varCc As Variant, _
 Optional ByVal varBcc As Variant, _
 Optional ByVal varSubject As Variant, _
 Optional ByVal varMailBody As Variant, _
 Optional ByVal varAttachments As Variant)
 Dim objOutlookApplication As Object, objMail As Object
 On Error GoTo Err_Exit
 Set objOutlookApplication = CreateObject(Class:="Outlook.Application")
 Set objMail = objOutlookApplication.CreateItem(0)
 With objMail
 .To = IIf(IsMissing(varTo), "", varTo)
 .Cc = IIf(IsMissing(varCc), "", varCc)
 .Bcc = IIf(IsMissing(varBcc), "", varBcc)
 .Subject = IIf(IsMissing(varSubject), "", varSubject)
 If Not IsMissing(varMailBody) Then If bolHtml Then _
  .HTMLBody = varMailBody Else .Body = varMailBody
 If Not IsMissing(varAttachments) Then .Attachments.Add varAttachments
 If bolSend Then .Send Else .Display
 End With
Err_Exit:
 Select Case Err.Number
 Case 0: If bolSend Then _
  MsgBox "Die Nachricht wurde erfolgreich gesendet.", 64, "Information"
 Case 287: MsgBox " Die Nachricht wurde nicht gesendet," & vbLf & _
  " da Sie den Vorgang abgebrochen haben.", 48, "Hinweis"
 Case Else: MsgBox "Fehler: " & CStr(Err.Number) & vbLf & vbLf & _
  Err.Description, 16, "Fehlermeldung"
 End Select
 Set objOutlookApplication = Nothing
 Set objMail = Nothing
End Sub

Damit die Änderung der Leiste auf diese Mappe beschränkt bleibt, benötigen wir wieder die Ereignisroutinen in deren Klassenmodul. Dabei muss die Leiste beim deaktivieren der Mappe grundsätzlich zurückgesetzt und beim aktivieren gesetzt werden. Aus diesem Grund können wir uns die zusätzlichen Abfragen sparen.

Option Explicit

Private Sub Workbook_Activate()
 Call prcChangeMenu
End Sub

Private Sub Workbook_Deactivate()
 Call prcResetMenu
End Sub

Und weil das so leicht war, gleich noch eins.

Das zweit Popup, welches wird nun komplett selbst erstellen, werden wir in ein Userform integrieren. Legen sie dazu in einer leeren Mappe ein Userform mit einem Commandbutton und mehreren Textboxen (mindestens 3) an.

Kopieren sie den folgenden Code in das Klassenmodul des Userforms.

Starten sie das Userform nicht, sie würden sofort eine Fehlermeldung erhalten.

Option Explicit

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
 ByVal lpClassName As String, _
 ByVal lpWindowName As String) As Long
Private Declare Function OpenClipboard Lib "user32.dll" ( _
 ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32.dll" () As Long
Private Declare Function CloseClipboard Lib "user32.dll" () As Long

Dim colTextBox As Collection

Private Sub CommandButton1_Click()
 Unload Me
End Sub

Private Sub UserForm_Activate()
 Dim frmControl As Control
 Dim intCount As Integer
 Dim ctxtTextBox() As New clsTextBox
 OpenClipboard FindWindow("XLMAIN", Application.Caption)
 EmptyClipboard
 CloseClipboard
 Call prcCreateCommandBar
 Set frmForm = Me
 Set colTextBox = New Collection
 For Each frmControl In Controls
 If TypeOf frmControl Is MSForms.TextBox Then
  intCount = colTextBox.Count + 1
  frmControl.Tag = CStr(intCount)
  ReDim Preserve ctxtTextBox(1 To intCount)
  Set ctxtTextBox(intCount).mtxtTextBox = frmControl
  colTextBox.Add ctxtTextBox(intCount)
  frmControl.Value = frmControl.Name
 End If
 Next
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
 Call prcDeleteCommandBar
 Set frmForm = Nothing
 Set colTextBox = Nothing
End Sub

Das erste, was sie in dem Code sehen, sind wieder ein paar API - Aufrufe. Da wir eine Copy & Paste - Funktion in das Popup aufnehmen, ist es ratsam, beim öffnen des Userforms, die Zwischenablage zu löschen. Anschließend wird das Popup angelegt und Textboxen einer Klasse zugewiesen. Dazu gleich mehr.

Im QueryClose - Ereignis des Forms wird die Klasse wieder entladen und das Popup gelöscht.


Um nicht für jede Textbox das selbe Makro schreiben zu müssen, verweisen wir sie an eine neue Klasse. Fügen sie dem Projekt ein Klassenmodul mit dem Namen "clsTextBox" hinzu und kopieren sie in dieses den folgenden Code.

Option Explicit

Public WithEvents mtxtTextBox As MSForms.TextBox

Private Sub mtxtTextBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _
 ByVal Shift As Integer)
 If Shift = 2 Then
 Select Case KeyCode
  Case 67: Call prcCopy(False)
  Case 86: Call prcInsert(False)
  Case 88: Call prcCut(False)
 End Select
 End If
End Sub

Private Sub mtxtTextBox_MouseUp(ByVal Button As Integer, _
 ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single)
 If Button = 2 Then Call prcSetControl(mtxtTextBox.Tag, mtxtTextBox.Locked)
End Sub

Im Klassenmodul der Textboxen wird sowohl das Rechtsklickereignis, als auch die Benutzung der Tastenkombinationen Strg+x, Strg+c und Strg+v an normale Routinen weitergeleitet.


Den Code zum erstellen des Popups und der Copy & Paste - Funktion kopieren sie in ein Standardmodul.

Das Verfahren zum anlegen einer Commandbar kennen sie ja schon aus dem zweiten und dritten Teil. Dazu noch ein paar kleine Beispielroutinen, um den Buttons Funktionen zu verleihen.

In der letzten Routine, in der die Anzeige der verschiedenen Buttons gesteuert wird, sehen sie auch die Anwendung der ShowPopup - Methode, mit der das Popup angezeigt wird.

Option Explicit
Option Private Module

Public Const POPUP_NAME As String = "Private_Poup"

Public frmForm As UserForm

Private cmbmyPopup As CommandBar
Private bolCut As Boolean

Public Sub prcCreateCommandBar()
 Call prcDeleteCommandBar
 Set cmbmyPopup = Application.CommandBars.Add(Name:=POPUP_NAME, _
 Position:=msoBarPopup, MenuBar:=False, Temporary:=True)
 Call prcControlAdd(objParent:=cmbmyPopup, enumType:=msoControlButton, _
 varCaption:="Ausschneiden", varFaceId:=21, varOnAction:="prcCut", _
 enumStyle:=msoButtonIconAndCaption)
 Call prcControlAdd(objParent:=cmbmyPopup, enumType:=msoControlButton, _
 varCaption:="Kopieren", varFaceId:=19, varOnAction:="prcCopy", _
 enumStyle:=msoButtonIconAndCaption)
 Call prcControlAdd(objParent:=cmbmyPopup, enumType:=msoControlButton, _
 varCaption:="Einfügen", varFaceId:=22, varOnAction:="prcInsert", _
 enumStyle:=msoButtonIconAndCaption, bolEnabled:=False)
 Call prcControlAdd(objParent:=cmbmyPopup, enumType:=msoControlButton, _
 bolBeginGroup:=True, varCaption:="Datum eintragen", varFaceId:=1106, _
 varOnAction:="prcDate", enumStyle:=msoButtonIconAndCaption)
 Call prcControlAdd(objParent:=cmbmyPopup, enumType:=msoControlButton, _
 varCaption:="Uhrzeit eintragen", varFaceId:=33, varOnAction:="prcTime", _
 enumStyle:=msoButtonIconAndCaption)
 Call prcControlAdd(objParent:=cmbmyPopup, enumType:=msoControlButton, _
 varCaption:="Benutzer eintragen", varFaceId:=607, varOnAction:="prcUser", _
 enumStyle:=msoButtonIconAndCaption)
 Call prcControlAdd(objParent:=cmbmyPopup, enumType:=msoControlButton, _
 bolBeginGroup:=True, varCaption:="Rückgängig", varFaceId:=128, _
 varOnAction:="prcUndo", enumStyle:=msoButtonIconAndCaption)
 Call prcControlAdd(objParent:=cmbmyPopup, enumType:=msoControlButton, _
 varCaption:="Wiederholen", varFaceId:=129, varOnAction:="prcRedo", _
 enumStyle:=msoButtonIconAndCaption)
 Call prcControlAdd(objParent:=cmbmyPopup, enumType:=msoControlButton, _
 bolBeginGroup:=True, varCaption:="Text drehen", varFaceId:=1146, _
 varOnAction:="prcReverse", enumStyle:=msoButtonIconAndCaption)
End Sub

Public Sub prcDeleteCommandBar()
 Dim cmbCommandBar As CommandBar
 If Not cmbmyPopup Is Nothing Then
 cmbmyPopup.Delete
 Set cmbmyPopup = Nothing
 Else
 For Each cmbCommandBar In Application.CommandBars
  If cmbCommandBar.Name = POPUP_NAME Then cmbCommandBar.Delete
 Next
 End If
End Sub

Private Sub prcControlAdd( _
 ByRef objParent As Object, _
 Optional ByRef varControl As Variant, _
 Optional ByVal enumType As MsoControlType, _
 Optional ByVal varId As Variant, _
 Optional ByVal varBefore As Variant, _
 Optional ByVal varTemporary As Variant, _
 Optional ByVal bolBeginGroup As Boolean = False, _
 Optional ByVal varCaption As Variant, _
 Optional ByVal varFaceId As Variant, _
 Optional ByVal varOnAction As Variant, _
 Optional ByVal enumStyle As MsoButtonStyle, _
 Optional ByVal varTipText As Variant, _
 Optional ByVal enumState As MsoButtonState, _
 Optional ByVal varTag As Variant, _
 Optional ByVal enumLinkType As MsoCommandBarButtonHyperlinkType, _
 Optional ByVal bolEnabled As Boolean = True, _
 Optional ByVal bolVisible As Boolean = True)
 Dim cmbControl As CommandBarControl
 Select Case IIf(enumType, 1, 0) & IIf(IsMissing(varId), 0, 1) & _
 IIf(IsMissing(varBefore), 0, 1) & IIf(IsMissing(varTemporary), 0, 1)
 Case "0100": Set cmbControl = objParent.Controls.Add(ID:=varId)
 Case "0101": Set cmbControl = objParent.Controls.Add(ID:=varId, _
  Temporary:=varTemporary)
 Case "0110": Set cmbControl = objParent.Controls.Add(ID:=varId, _
  Before:=varBefore)
 Case "0111": Set cmbControl = objParent.Controls.Add(ID:=varId, _
  Before:=varBefore, Temporary:=varTemporary)
 Case "1000": Set cmbControl = objParent.Controls.Add(Type:=enumType)
 Case "1001": Set cmbControl = objParent.Controls.Add(Type:=enumType, _
  Temporary:=varTemporary)
 Case "1010": Set cmbControl = objParent.Controls.Add(Type:=enumType, _
  Before:=varBefore)
 Case "1011": Set cmbControl = objParent.Controls.Add(Type:=enumType, _
  Before:=varBefore, Temporary:=varTemporary)
 Case "1100": Set cmbControl = objParent.Controls.Add(Type:=enumType, _
  ID:=varId)
 Case "1101": Set cmbControl = objParent.Controls.Add(Type:=enumType, _
  ID:=varId, Temporary:=varTemporary)
 Case "1110": Set cmbControl = objParent.Controls.Add(Type:=enumType, _
  ID:=varId, Before:=varBefore)
 Case "1111": Set cmbControl = objParent.Controls.Add(Type:=enumType, _
  ID:=varId, Before:=varBefore, Temporary:=varTemporary)
 End Select
 With cmbControl
 .BeginGroup = bolBeginGroup
 If Not IsMissing(varCaption) Then .Caption = varCaption
 If Not IsMissing(varFaceId) Then .FaceId = varFaceId
 If Not IsMissing(varOnAction) Then .OnAction = varOnAction
 If enumStyle Then .Style = enumStyle
 If Not IsMissing(varTipText) Then .TooltipText = varTipText
 If enumState Then .State = enumState
 If Not IsMissing(varTag) Then .Tag = varTag
 If enumLinkType Then .HyperlinkType = enumLinkType
 .Enabled = bolEnabled
 .Visible = bolVisible
 End With
 If Not IsMissing(varControl) Then Set varControl = cmbControl
 Set cmbControl = Nothing
End Sub

Public Sub prcCut(Optional ByVal bolByCommandBar As Boolean = True)
 cmbmyPopup.Controls(3).Enabled = True
 bolCut = True
 If bolByCommandBar Then frmForm.ActiveControl.Cut
End Sub

Public Sub prcCopy(Optional ByVal bolByCommandBar As Boolean = True)
 cmbmyPopup.Controls(3).Enabled = True
 bolCut = False
 If bolByCommandBar Then frmForm.ActiveControl.Copy
End Sub

Public Sub prcInsert(Optional ByVal bolByCommandBar As Boolean = True)
 If bolCut Then
 cmbmyPopup.Controls(3).Enabled = False
 bolCut = False
 End If
 If bolByCommandBar Then frmForm.ActiveControl.Paste
End Sub

Private Sub prcDate()
 frmForm.ActiveControl.Value = CStr(Date)
End Sub

Private Sub prcTime()
 frmForm.ActiveControl.Value = CStr(Time)
End Sub

Private Sub prcUser()
 frmForm.ActiveControl.Value = Application.UserName
End Sub

Private Sub prcUndo()
 frmForm.UndoAction
End Sub

Private Sub prcRedo()
 frmForm.RedoAction
End Sub

Private Sub prcReverse()
 Dim intIndex As Integer
 Dim strBuffer As String, strTemp As String
 With frmForm.ActiveControl
 If Val(Application.Version) > 8 Then
  .Value = Left$(.Text, .SelStart) & _
  StrReverse$(Mid$(.Text, .SelStart + 1, .SelLength)) _
  & Right$(.Text, .TextLength - .SelStart - .SelLength)
 Else
  strTemp = Mid$(.Text, .SelStart + 1, .SelLength)
  For intIndex = Len(strTemp) To 1 Step -1
  strBuffer = strBuffer & Mid$(strTemp, intIndex, 1)
  Next
  .Value = Left$(.Text, .SelStart) & strBuffer _
  & Right$(.Text, .TextLength - .SelStart - .SelLength)
 End If
 End With
End Sub

Public Sub prcSetControl(ByVal strTag As String, bolLocked As Boolean)
 Dim intIndex As Integer
 With cmbmyPopup
 .Controls(1).Enabled = Not bolLocked
 .Controls(3).Enabled = Not bolLocked
 For intIndex = 4 To 6
  .Controls(intIndex).Visible = False
 Next
 Select Case strTag
  Case "1": .Controls(4).Visible = True
  Case "2": .Controls(5).Visible = True
  Case "3": .Controls(6).Visible = True
 End Select
 .Controls(7).Enabled = frmForm.CanUndo
 .Controls(8).Enabled = frmForm.CanRedo
 .ShowPopup
 End With
End Sub

Starten sie nun das Userform und spielen sie ein bisschen mit dem Popup. Dabei können sie sich Gedanken über eine wirklich vernünftige Anwendungsmöglichkeit machen.

Sie sehen, es geht immer leichter. Aber damit ihr Selbstwertgefühl nicht ins unermessliche steigt, wenn sie denken, das schlimmste hinter sich zu haben, dann täuschen sie sich.



Weitere Artikel der Gruppe: Tutorials Aus Excel VBA
Nach oben