Clever-Excel-Forum

Normale Version: Commandbutton überlagert Userform Events
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo Leute,

ein kleines Experiment auf der Userform:

Gegeben, absolut leere Userform einzigste Prozedur:

Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
MsgBox Chr(KeyCode)
End Sub

Ihr clickt auf die Form und bekommt das entsprechende Zeichen angezeigt. So weit so gut.

Jetzt das Problem:

Ihr installiert noch einen CommandButton darauf:

Private Sub CommandButton1_Click()
CommandButton1.TakeFocusOnClick = False
End Sub

(Den Fokus habe ich schon mal versucht vom Commandbutton wegzunehmen, hat aber sonst nicht viel zu bedeuten!)

Und jetzt mein Problem: Ich möchte weiterhin das entsprechende KeyCode - Zeichen angezeigt bekommen, wenn ich irgendeine Taste drücke.

Der "CommandButton"  überlagert aber die Userform Events.

Wie kriege ich so etwas hin?
Frage ist natürlich, wofür das gut sein soll, denn ich vermute hier ein XY Problem.

Ansonsten geht das IMO nicht, außer Du klinkst Dich ins Keyboard ein, Ansatz hier
Hallöchen,

sollte funktionieren - ein Commandbutton hat auch ein Keydown - musst es nur nutzen Smile
Das würde ich nicht so sehen, denn dann muss er bei jedem Control das KeyDown nutzen.

Die Frage ist, was der TO wirklich will, dasher mein Hinweis: XY-Problem

Das KeyDown der Userform wird nicht mehr getriggert, sobald ein Control auf der Form ist.
Andererseits möchte der TO, so habe ich es verstanden (also das Y-Problem), zunächst jeden Tastendruck abfangen und z.B. einen Hinweis ausgeben.

Ein anderer Ansatz wäre evtl. alle Controls zu sammeln und das Keydown Event in einer Klasse abzufangen. Aber ob das so ohne weiteres geht ...

Aber nochmal: Wozu soll das gut sein? Was ist das X-Problem?
Hallöchen,

schauen wir mal was der TE braucht Smile

Zum Punkt Klassenmodule:

Mit den Klassen könnte funktionieren. Ich habe mal fix Peter Haserodt's Beispiel genommen
www.online-excel.de/excel/singsel_vba.php?f=57
--> erzeugt dynamisch die CommandButtons

und in das Klassenmodul noch ein KeyDown gepackt:
Private Sub DerCmd_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
MsgBox "Down"
End Sub
Hallo Algor,

wie André in #3 schrieb, müsstest Du für jedes Control das jeweilige KeyDown-Ereignis auswerten.
Willst Du immer auf das UserForm_KeyDown-Ereignis zugreifen, reicht eine "Weiterleitung" auf dieses.
Hier ein Beispiel:
Private Sub CommandButton1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 UserForm_KeyDown KeyCode, Shift
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 UserForm_KeyDown KeyCode, Shift
End Sub

Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 Dim strControl As String
 If Not ActiveControl Is Nothing Then
   strControl = ActiveControl.Name
 Else
   strControl = Me.Name
 End If
 MsgBox "Das Tasterunterdrückereignis wurde durch die Taste """ & Chr(KeyCode) & """" & vbNewLine _
 & "im Element """ & strControl & """ ausgelöst."
End Sub
Gruß Uwe
Danke für den Code und die großartige Hilfe! Das hilft mir um einiges weiter.