KeyDown Ereignisse auch als Doppelklick möglich?
#1
Hallo Leute,
habe folgendes Problem. Wenn ich hier z.B. die Taste A in einer Textbox1 drücke wird irgendeine Funktion aufgerufen. Anbei mein Codefragement:

Code:
Public Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Select Case (KeyCode)
Case (65) 'Taste A  
Call IrgendeineFunktion

End Select
End Sub

So weit so gut. Ich möchte aber nun eine Funktionserweiterung der gesamten Geschichte haben. Drücke ich die Taste A normal soll weiterhin IrgendeineFunktion ausgeführt werden, drücke ich die Taste A schnell hintereinander (wie beim Doppelklick mit der Maustaste) soll eine völlige andere Funktion aufgerufen werden. Wie bekomme ich es mittels VBA Programmierung hin, dass der Code zwischen einfachem und schnellem Doppelklick unterscheidet? - Sollte die ganze Angelegheit nicht möglich sein, bitte ich einen von unseren üblichen bekannten VBA Großmeistern hier im Forum mir auch das kurz zu posten.

Danke.
Top
#2
Hallo,

das mit dem schnellen Klick dürfte nicht gehen. Als Alternative könntest Du eventuell es mal so versuchen (ist jetzt nur so hingeschrieben und daher auch nicht getestet). Bei jeder zweiten Eingabe eines A wird eine andere Funktion ausgeführt ansonsten die normale.

Code:
Public Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

Static bolZweiterKlick as Boolean

Select Case (KeyCode)
Case (65) 'Taste A
If bolZweiterKlick then bolZweiterKlick = True Else bolZweiterKlick = False

If bolZweiterKlick Then  
Call IrgendeineFunktion
else
Call IrgendeineandereFunktion
End If

End Select
End Sub
Gruß Stefan
Win 10 / Office 2016
Top
#3
Hallo Stefan,
danke schon mal für deinen Lösungsvorschlag. Werde ihn kurzfristig ausprobieren. Ich mache mir auch so meine Gedanken und kann mir nicht vorstellen, dass es nicht gehen sollte.
Man könnte z.B. irgendwie so einen kleinen Zeitschalter einbauen der dann wartet ob das 2. Ereignis kommt oder nicht. Mal sehen was noch so an Vorschlägen kommt.
Top
#4
Hallo Kathrin,

das Thema hatten wir dieser Tage. Siehe meine Antwort hier:

http://www.clever-excel-forum.de/thread-...ml#pid9740

Eine Beispielmappe dazu hatte ich später in diesem Thread eingestellt.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#5
Hallo Experten,

die Unterscheidung ob die Taste A einmal oder doppelklickmäßig zweimal schnelle hintereinander gedrückt wurde, habe ich folgendermassen umgesetzt:
Code:
Dim gx 'globale Variable

Public Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
TextBox1.Value = "" 'Textbox1 wieder leermachen

Dim sTime As Single
isEvent = True
sTime = Timer

Select Case (KeyCode)
Case (65) 'Taste A
gx = gx + 1

Do
DoEvents
If Not isEvent Then Exit Sub
Loop Until Timer > sTime + 0.5 Or Timer < sTime

If gx = 1 Then Er1
If gx = 2 Then Er2
End Select
End Sub

Public Function Er1()
TextBox1.Text = "" 'Textbox1 wieder leermachen
TextBox2.Value = "Einfachklick" 'Anzeige in einer 2. Textbox um welche Art Klick es sich handelt
gx = 0
End Function

Public Function Er2()
TextBox1.Text = "" 'Textbox1 wieder leermachen
TextBox2.Value = "Doppelklick" 'Anzeige in einer 2. Textbox um welche Art Klick es sich handelt
gx = 0
End Function

Sub UserForm_Initialize()
gx = 0 'globale Variable initiieren
End Sub
Die Unterscheidung ob die Taste A einfach oder doppelt geklickt wurde ist nicht das Problem. Das funktioniert hier. Was mich aber in den Wahnsinn treibt,
ist, dass ich die Textbox1 nicht leer bekomme. Drücke ich die die Taste a, zeigt mir die Textbox1 auch immer schön wieder den Buchstaben a an. obwohl ich Codemäßig alles getan
habe um die Textbox1 wieder leer zu bekommen. Wie ist das möglich, dass der Buchstabe a sich in der Textbox1 so festfrisst? Wo liegt mein Fehler? Das "a" klebt einfach!
Top
#6
Hallo,

setze mal einen Haltepunkt im KeyDown-Ereignis deiner Textbox und schaue, wie Excel die Codes abarbeitet.
Gruß Stefan
Win 10 / Office 2016
Top
#7
Hallo Stefan,

habe alle möglichen Variationen ausprobiert. Krieg das blöde a nicht weg.
Das beste Ergebnis bekomme ich noch, wenn einfach nur TextBox1.Value = "" in die
Do Loop Schleife schreibe. Dann habe ich wenigstens kein Doppel - a mehr in der TextBox stehen.
Würde mich mal wirklich interessieren welcher Teufel diesen Code denn reitet.
Top
#8
Hallo,

verwende ich ein KeyUp statt KeyDown habe ich das Problem nicht. Allerdings funktioniert
dann auch der Code nicht. Das Problem liegt also ganz allgemein zwischen KeyUp und KeyDown.
Doch wie löst man so etwas?
Top
#9
Hallo Kathrin,

KeyCode auf Null setzen und das eingegebene Zeichen ist weg.

Code:
Select Case KeyCode
Case (65) 'Taste A
gx = gx + 1
KeyCode = 0

Gruß Uwe
Top
#10
Hallo Kathrin,

ich habe mal ein wenig gekürzt aufgebaut:

Code:
Option Explicit
Dim gx 'globale Variable

Private Sub TextBox1_Keydown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

   Select Case (KeyCode)
      Case (65) 'Taste A
      If CDbl(TextBox1.Tag) < Timer - 0.5 Then
         gx = 1
      Else
         gx = 2
      End If
   End Select
  
   If gx = 1 Then Er1
   If gx = 2 Then Er2
  
   TextBox1.Tag = Timer
   KeyCode = 0
  
End Sub

Public Function Er1()
   'TextBox1.Text = "" 'Textbox1 wieder leermachen
   TextBox2.Value = "Einfachklick" 'Anzeige in einer 2. Textbox um welche Art Klick es sich handelt
   'gx = 0
End Function

Public Function Er2()
   'TextBox1.Text = "" 'Textbox1 wieder leermachen
   TextBox2.Value = "Doppelklick" 'Anzeige in einer 2. Textbox um welche Art Klick es sich handelt
End Function


Private Sub UserForm_Initialize()
   TextBox1.Tag = 0
End Sub

Falls bei Einfach Klick der Wert drin bleiben soll, dann müsste das KeyUp Ereignis genaommen werden.
Vielleicht ist es sowieso das geeignetere Ereignis in diesem Fall.

Schau mal:

Code:
Option Explicit
Dim gx 'globale Variable

Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

   Select Case (KeyCode)
      Case (65) 'Taste A
      If CDbl(TextBox1.Tag) < Timer - 0.5 Then
         gx = 1
      Else
         gx = 2
      End If
   End Select
  
   If gx = 1 Then Er1
   If gx = 2 Then Er2
  
   TextBox1.Tag = Timer

End Sub

Public Function Er1()
   'TextBox1.Text = "" 'Textbox1 wieder leermachen
   TextBox2.Value = "Einfachklick" 'Anzeige in einer 2. Textbox um welche Art Klick es sich handelt
End Function

Public Function Er2()
   TextBox1.Text = "" 'Textbox1 wieder leermachen
   TextBox2.Value = "Doppelklick" 'Anzeige in einer 2. Textbox um welche Art Klick es sich handelt
End Function

Private Sub UserForm_Initialize()
   TextBox1.Tag = 0
End Sub
Gruß Atilla
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste