Clever-Excel-Forum

Normale Version: Doppelclick und Einfachclick bei CommandButton
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo liebe VBA Tüftler und Experten,

habe mich an folgendem Problem festgebissen. Gibt es eine Möglichkeit das ein CommandButton sowohl auf Click als auch auf Doppelclick in einer UserForm reagiert?

Da so etwas sich gegenseitig ausschließt:

Sub CommandButton1_Click()
Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

habe ich bisher alles an Tricks versucht.  Stichworte: Application.Wait, Sleep, MouseUp, MouseDown etc.

Nichts hat funktioniert. Geht so etwas überhaupt? Auch wenns nicht geht, schreibt mir das bitte.
Wofür soll das gut sein?
Habe bisher nie geschaut, aber es gibt tatsächlich das DblClick-Event 


Zitat:Wenn Sie auf eine Befehlsschaltfläche doppelklicken, treten die folgenden Ereignisse in der angegebenen Reihenfolge ein:
MouseDown ? MouseUp ? Click ? DblClick ? MouseUp ? Click
Der zweite Klick hat möglicherweise keine Auswirkung (z. B. wenn das Click -Makro oder die Ereignisprozedur als Reaktion auf das erste Auftreten des Click -Ereignisses ein gebundenes Dialogfeld öffnet). Um zu verhindern, dass das zweite Click -Makro oder die Ereignisprozedur ausgeführt wird, fügen Sie eine CancelEvent -Aktion in das DblClick -Makro ein, oder verwenden Sie in der DblClick -Ereignisprozedur das Cancel-Argument. Im Allgemeinen sollte ein Doppelklicken auf eine Befehlsschaltfläche unterbunden werden.
Mit anderen Worten, es geht, aber hat möglicherweise keinen Effekt. Und wenn Du doppelt klickst, werden beide Ereignisse ausgelöst.


Folgendes geht z.B.
Code:
Private Sub CommandButton1_Click()
   Debug.Print "Klick"
End Sub

Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
   Debug.Print "Doppel-Klick"
End Sub
Besonders sinnvoll ist das nicht, denn wenn Du auf die Schaltfläche doppelt klickst, hast Du als Ergebnis
Klick
Doppel-Klick
@Storax.
Na dann versuch mal damit  ein Doppelclick Ereignis auszulösen. Genau dieses Problem hatte ich ja geschildert.
Schrieb er ja im ersten Zitat, der Storax.
Möglich wäre, eine modulweite Boolean-Variable zu füllen, die "abwartet", ob nach dem ersten Klick betriebssystemabhängig ein zweiter Klick, der als Doubleclick interpretiert wird, erfolgt und dann kein Click-Event zu befeuern.

Hat einer Lust und kennt den Eintrag der Registry, in dem dies gespeichert ist?

Jedenfalls imo Kanonen auf Spatzen.
Gut, dann hast Du ja eine Antwort. Es ist möglich, nur reagiert es nicht so wie Du es gerne hättest.
Denn beim Doppelklick werden folgende Ereignisse ausgelöst:MouseDown ? MouseUp ? Click ? DblClick ? MouseUp ? Click
Ja nach dem was im Ereignis programmiert ist, hat der zweite Klick möglicherweise keine Auswirkung oder sie werden hintereinader abgefeuert.

Nochmal die Frage: Wofür soll das gut sein?
Hallo Wulfi,

nö. Du hast geschrieben
Gibt es eine Möglichkeit das ein CommandButton sowohl auf Click als auch auf Doppelclick in einer UserForm reagiert?

Bei Klick gibt es Klick und bei Doppelklick gibt es Klick und Doppelklick, hast also sogar eine Variante mehr als gewollt.

Spaß beiseite, hier mal ein Ansatz:

im Userform:
Code:
Private Sub CommandButton1_Click()
Application.OnTime Now + TimeValue("00:00:01"), "'debaggen ""Click""'"
End Sub

Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
WartsAb = True
Call debaggen("DblClick")
End Sub
In einem Modul:
Code:
Public WartsAb As Boolean

Sub debaggen(ByVal strGliggor As String)
Dim strTru
If WartsAb Then strTru = "TRUE" Else strTru = "FALSE"
Debug.Print strTru & vbTab & strGliggor
If WartsAb = True And strGliggor = "Click" Then Exit Sub
MsgBox strGliggor
Application.OnTime Now + TimeValue("00:00:01"), "HoerAuf"
End Sub

Sub HoerAuf()
Dim strTru
WartsAb = False
If WartsAb Then strTru = "TRUE" Else strTru = "FALSE"
Debug.Print strTru
End Sub
Hallo Wulfi,

hier auch noch was:


' **************************************************************
'  Modul:  UserForm1  Typ = Userform
' **************************************************************


Option Explicit

Private Sub CommandButton1_Click()
 Application.OnTime Now + TimeValue("0:00:01"), "CommandButton1Clicking"
End Sub

Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
 bolDblClick = True
End Sub


' **************************************************************
'  Modul:  Modul2  Typ = Allgemeines Modul
' **************************************************************


Option Explicit

Public bolDblClick As Boolean

Sub CommandButton1Clicking()
 If bolDblClick Then
   bolDblClick = False
   MsgBox "Doppelklick"
 Else
   MsgBox "Klick"
 End If
End Sub

Gruß Uwe
Betr:
Application.OnTime Now + TimeValue("0:00:01"), "CommandButton1Clicking" 'Aufruf aus Userform
+
Sub CommandButton1Clicking() 'steht in irgendeinem Modul

Hallo,

schaue ich mir den Code von Uwe an wird  ja mit "CommandButton1Clicking"
praktisch eine "Funktion" , die irgendwo in einem Modul liegt aufgerufen.
Die macht dann irgendwas. Nun wäre es ganz schön, wenn ich den Aufruf
"CommandButton1Clicking" das die UserForm - weiß nicht ob ich mich da richtig
ausdrücke - gleich mit übergeben wird.

Also praktisch so etwas:

Application.OnTime Now + TimeValue("0:00:01"),  CommandButton1Clicking (Me) ' Aufruf aus Userform heraus

Sub CommandButton1Clicking(UF as UserForm)  'Empfang im Modul


dann weiß ich von welcher UserForm ich  aufgerufen wurde und  welche
Schalter und Methoden mir zur Verfügung stehen und ich kann besser damit arbeiten.
Wie kann ich so etwas umsetzen?
Hallo Wulfi,

z.B. mit einer weiteren Variable:


' **************************************************************
'  Modul:  Modul1  Typ = Allgemeines Modul
' **************************************************************


Option Explicit

Public bolDblClick As Boolean
Public oUF As MSForms.UserForm

Sub CommandButton1Clicking()
 If bolDblClick Then
   bolDblClick = False
   Unload oUF
   MsgBox "Doppelklick: Userform wurde geschlossen."
 Else
   MsgBox "Klick"
 End If
End Sub


' **************************************************************
'  Modul:  UserForm1  Typ = Userform
' **************************************************************


Option Explicit

Private Sub CommandButton1_Click()
 Set oUF = Me
 Application.OnTime Now + TimeValue("0:00:01"), "CommandButton1Clicking"
End Sub

Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
 bolDblClick = True
End Sub

Gruß Uwe