Probleem met Keydown event

Status
Niet open voor verdere reacties.

DutchOirs

Gebruiker
Lid geworden
30 sep 2009
Berichten
720
Goedenavond allen,

Zit weer met een vraagje en dacht stel hem hier.

Heb een UserForm met meerdere TextBoxen en één ComboBox genaamd: AchterNaamCB.

Deze AchterNaamCB is de zoeknaam en met

Code:
Private Sub AchterNaamCB_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  
  If KeyCode = 9 Or KeyCode = 13 Then             ' Tab & Enter
    Hier je opdrachten
  End if

End Sub
geef ik bepaalde opdrachten.

Dus na een Enter in deze ZoekNaamCB voert hij dus die opdrachten uit en gaat vervolgens naar de volgende TextBox.
Het probleem zit hem hierin, als hij dus bepaalde dingen verkeerd doet, hij dus in deze ComboBox moet blijven maar niet naar de volgende TextBox moet springen.

Hoe kan ik dit onderbouwen om te voorkomen dat hij toch naar de volgende TextBox springt?

Many thanks bij boorbaat.

Vr. Gr.

Dutch
 
Dat kan dan zo:
Code:
Private Sub AchternaamCB_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If ControleerOpFout Then Cancel = True
End Sub

Die ControleerOpFout is dan een stukje dat je even zelf moet maken en helemaal afhankelijk van wat je zei: "als hij dus bepaalde dingen verkeerd doet"
 
hoi Edmoor,

Thanks voor je reactie, ff getest maar geeft een foutmelding :-(

Gebruik het volgende voor foutmeldingen:

Code:
    For i = 1 To Len(AchterNaamCB)
      If Mid(AchterNaamCB, i, 1) = "," Then
        For e = i + 1 To Len(AchterNaamCB)
          If Mid(AchterNaamCB, e, 1) = "," Then MsgBox ("U heeft meerdere komma's ingevoerd! Dit mag niet" & vbNewLine & vbNewLine & "Alleen een komma achter de Achternaam!" & vbNewLine & vbNewLine & vbNewLine & "Fout #032"): Leegmaken: Exit Sub
        Next e
        If Mid(AchterNaamCB, i - 1, 1) = " " Then MsgBox ("U heeft een spatie voor de komma gezet! Deze moet achter de komma komen!" & vbNewLine & vbNewLine & "Fout #033"): Leegmaken: Exit Sub
        If Mid(AchterNaamCB, i + 1, 1) <> " " Then MsgBox ("U heeft geen spatie na de komma ingevoerd!" & vbNewLine & vbNewLine & "Fout #034"): Leegmaken: Exit Sub
        If Mid(AchterNaamCB, i + 1, 1) = " " Then GoTo Door
      End If
      If i = Len(AchterNaamCB) Then
        MsgBox ("U heeft of geen Voornaam of geen komma met spatie ingevoerd" & vbNewLine & vbNewLine & "tussen Achternaam en Voornaam!!!" & vbNewLine & vbNewLine & vbNewLine & "Fout #035"): Leegmaken: Exit Sub
      End If
    Next i
Door:

Heb het ff getest op het onderste nl.

Code:
      If i = Len(AchterNaamCB) Then Cancel = True
maar geeft als foutmelding "variabele niet gedefinieerd.
moet dus op een andere manier, maar welke?
 
Laatst bewerkt:
Heb je Option Explicit aan staan? Dan moet je i definiëren. In dit geval zelfs buiten de Subs omdat je hem kennelijk in meerdere Subs wilt gebruiken en de waarde overdraagbaar moet zijn. Verder heb je alleen die ene regel geplaatst en niet de hele sub. Ik zie dat vaker en vraag me af waarom men dat doet. De kopregel van een Sub is wel degelijk van belang. Ik ga er dus vanuit dat je dit hebt staan:
Code:
Private Sub AchternaamCB_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If i = Len(AchterNaamCB) Then Cancel = True
End Sub
 
Laatst bewerkt:
hoi Edmoor,

Ja option explicit staat aan en had niet alles neergezet, daar het nogal lang is vandaar.

ff dan het stukje van de kop tot en met bovenstaande..

Code:
Private Sub AchterNaamCB_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

  Dim stZoekenLinks As String, stZoekenRechts As String, stTussenvoegselTB As String, MyRange As Variant, c As Range, i As Long, HfdLVnaam As String, e As Integer, TmpSofiNr As String, TmpVoornaam As String

  If KeyCode = 9 Or KeyCode = 13 Then             ' Tab & Enter
    
    If VarKeuze = "Inv" And AchterNaamCB = "" Then
      VARWik = 1
      Text1 = " U moet wel een Achternaam en een Voornaam invoeren!      Achternaam gevolgd door een komma"
      Text2 = " met spatie en dan Voornaam en eventueel spatie met Tussenvoegsel.            Overnieuw invoeren!!!"
      Text3 = " Info #017"
      WIKUserForm.Show

      Exit Sub
    End If
    
    If Signal.BackColor = RGB(62, 196, 129) Then MsgBox ("Uit via Color II KeyDown!"): Signal.BackColor = RGB(249, 221, 187): Exit Sub       ' groen-geel nodig voor signal bij invoeren nwe bestaande naam
  
    For i = 1 To Len(AchterNaamCB)
      If Mid(AchterNaamCB, i, 1) = "," Then
        For e = i + 1 To Len(AchterNaamCB)
          If Mid(AchterNaamCB, e, 1) = "," Then MsgBox ("U heeft meerdere komma's ingevoerd! Dit mag niet" & vbNewLine & vbNewLine & "Alleen een komma achter de Achternaam!" & vbNewLine & vbNewLine & vbNewLine & "Fout #032"): Leegmaken: Exit Sub
        Next e
        If Mid(AchterNaamCB, i - 1, 1) = " " Then MsgBox ("U heeft een spatie voor de komma gezet! Deze moet achter de komma komen!" & vbNewLine & vbNewLine & "Fout #033"): Leegmaken: Exit Sub
        If Mid(AchterNaamCB, i + 1, 1) <> " " Then MsgBox ("U heeft geen spatie na de komma ingevoerd!" & vbNewLine & vbNewLine & "Fout #034"): Leegmaken: Exit Sub
        If Mid(AchterNaamCB, i + 1, 1) = " " Then GoTo Door
      End If
      If i = Len(AchterNaamCB) Then
        MsgBox ("U heeft of geen Voornaam of geen komma met spatie ingevoerd" & vbNewLine & vbNewLine & "tussen Achternaam en Voornaam!!!" & vbNewLine & vbNewLine & vbNewLine & "Fout #035"): Leegmaken: Exit Sub
      End If
    Next i
Door:

Had als test de onderstaande regel vervangen

Code:
      If i = Len(AchterNaamCB) Then
        MsgBox ("U heeft of geen Voornaam of geen komma met spatie ingevoerd" & vbNewLine & vbNewLine & "tussen Achternaam en Voornaam!!!" & vbNewLine & vbNewLine & vbNewLine & "Fout #035"): Leegmaken: Exit Sub
      End If

door

Code:
If i = Len(AchterNaamCB) Then Cancel = True

met option explicit geeft ie een foutmelding dat cancel niet gedefineerd is

en zonder option explicit reageert ie niet en gaat gewoon door, met gevolg een foutmelding verderop in het programma

De bedoeling is dat de uitvoer hier stopt omdat men geen voornaam had ingevoerd of komma-spatie ertussen.
 
Laatst bewerkt:
Daarin heb je dus nogal wat variabelen niet gedeclareerd.
 
Alle variabelen zijn gedeclareerd, daar ik option explicit gebruik..

Het probleem zit hem dat ik een Enter geef in de ComboBox,
door die enter gaat hij de opdrachten uitvoeren in de KeyDown event,
vervolgens springt hij naar de volgende TabIndex dus een andere TextBox

Tot dusver werkt alles prima, maar als er een verkeerde invoer komt is het de bedoeling dat de uitvoer stopt en dat de cursor in de ComboBox blijft.

Had gedacht dit met een exit sub te bereiken, maar helaas werkt dat niet en springt hij gewoon naar de volgende TextBox

Hoi Edmoor,

nog ff aan het stoeien en deze sub aangemaakt
 
Laatst bewerkt:
Dat moet je doen zoals ik eerder al zei. Daarvan gaf je aan dat er een foutmelding komt dat een variabele niet is gedeclareerd.
 
ja sorry, had dit over het hoofd gezien,

dacht dat het in dezelfde event was..

heb met een variabele deze exit event aangestuurd en het werkt prima...

nu nog ff verder testen, daar er zoveel valkuilen zijn :-(

Heb het als volg opgelost:

Bij een foutmelding geeft ie een Label (signal) een rode kleur,
Code:
    For i = 1 To Len(AchterNaamCB)
      If Mid(AchterNaamCB, i, 1) = "," Then
        For e = i + 1 To Len(AchterNaamCB)
          If Mid(AchterNaamCB, e, 1) = "," Then MsgBox ("U heeft meerdere komma's ingevoerd! Dit mag niet" & vbNewLine & vbNewLine & "Alleen een komma achter de Achternaam!" & vbNewLine & vbNewLine & vbNewLine & "Fout #032"): Leegmaken: Signal.BackColor = RGB(255, 0, 0): Exit Sub
        Next e
        If Mid(AchterNaamCB, i - 1, 1) = " " Then MsgBox ("U heeft een spatie voor de komma gezet! Deze moet achter de komma komen!" & vbNewLine & vbNewLine & "Fout #033"): Leegmaken: Signal.BackColor = RGB(255, 0, 0): Exit Sub
        If Mid(AchterNaamCB, i + 1, 1) <> " " Then MsgBox ("U heeft geen spatie na de komma ingevoerd!" & vbNewLine & vbNewLine & "Fout #034"): Leegmaken: Signal.BackColor = RGB(255, 0, 0): Exit Sub
        If Mid(AchterNaamCB, i + 1, 1) = " " Then GoTo Door
      End If
      If i = Len(AchterNaamCB) Then
        MsgBox ("U heeft of geen Voornaam of geen komma met spatie ingevoerd" & vbNewLine & vbNewLine & "tussen Achternaam en Voornaam!!!" & vbNewLine & vbNewLine & vbNewLine & "Fout #035"): Leegmaken: Signal.BackColor = RGB(255, 0, 0): Exit Sub
      End If
    Next i

vervolgens in de Exit event als Signal rood is "Cancel = True"

Code:
Private Sub AchternaamCB_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  If Signal.BackColor = RGB(255, 0, 0) Then Cancel = True
End Sub

Werkt perfect, maar met een kanttekening.
Als er dus een fout optreed, blijft de cursor netjes in de ComboBox staan en kan dan ook veranderingen aanbrengen, maar wat me wel opvalt is dat alles geblokkeerd is. Dus kan niet meer Annuleren (terug gaan)

Maar ga vanmiddag er nog ff verder mee stoeien..
Hartstikke bedankt voor de moeite en bij deze weer wat geleerd Thanks
 
Waarom zou je de gebruiker een komma (en een spatie) laten invoeren, die je veel beter met VBA kunt toevoegen aan de door de gebruiker ingevoerde gegevens.
Laat de gebruiker alleen invoeren wat automatisering niet kan.
 
Hoi SNB,

Begrijp ik, maar linksom of rechtsom, beidde moet je beveiligen

logisch is (in mijn belevening) dat als je Achternaam, Voornaam en tussenvoegsel neer moet zetten dat je de achternaam scheid v/d voornaam.

kan wel zeggen alles achter elkaar invoeren zonder komma en spaties, ten eerste moet je gaan uitvissen wat dan de Achternaam wordt en wat als iemand wel een komma of spatie invoerd!

Dus nogmaals, linksom of rechtsom
 
niet als je een apart vak heb voor voornaam, tussenvoegsel en achternaam (3 in totaal dus).
 
ok snb, maar als je een nieuwe naam wilt invoeren en je wilt weten tijdens het invoeren of deze naam al voorkomt, heb je een ComboBox nodig

en betreft zowel achternaam - voornaam en tussenvoegsel...

kijk als je dat doet met een TextBox, kan je pas naderhand laten checken of die naam al voorkomt..

zo had ik het eerst maar verving het toch door een ComboBox
 
Edmoor, ben aan het testen geweest en deze mogelijkheid werkt perfect..

Deze "Private Sub AchternaamCB_Exit(ByVal Cancel As MSForms.ReturnBoolean)" event kon ik nog niet.

Bedankt nogmaals voor het meedenken en helpen.

Vr. Gr.

Dutch
 
Een andere kijk op de zaak:
 

Bijlagen

  • __die niet snb.xlsb
    15,7 KB · Weergaven: 33
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan