16. maj 2007 - 10:32Der er
6 kommentarer og 1 løsning
Kun pos./neg. tal i textbox - userform (KeyAscii - godt/skidt?)
Har lavet følgende kode, som også virker som den skal.
Kan man slå de to sub'er sammen?
Ved godt den sidste egentlig kunne være rigeligt idet den fanger alle andre indtastninger, men ved at bruge Ascii så vil man som bruger ikke kunne bruge tid på at taste forkert.
Kan jeg være sikker på man kan bruge macroen over hele verden, når jeg indsnævre indtasningsmulighederne ved brug af Ascii i sub KeyPress?
Ved negative tal må man kun kunne indtaste minus på den første position, bruger jeg ikke "Not IsNumeric(.Text)" i exit sub så vil sub KeyPress ikke fange denne fejl.
Så lige nu fanger jeg fejlen i exit subben, når man forlader textboxen. Kan dette laves i sub KeyPress?
Min kode er som følgende: Private Sub txtMaximum_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) On Error Resume Next If (KeyAscii >= vbKey0 And KeyAscii <= vbKey9) Or KeyAscii = vbKeyBack _ Or KeyAscii = 45 Then Exit Sub Else: KeyAscii = 0 Beep End If End Sub
Private Sub txtMaximum_Exit(ByVal Cancel As MSForms.ReturnBoolean) On Error Resume Next With Me.txtMaximum If Not IsNumeric(.Text) Or Len(.Text) > 23 Then MsgBox "Amount is too long. " _ & "Please try again", vbExclamation, "" Cancel = True .SetFocus .SelStart = 0 .SelLength = Len(.Text) End If End With Me.txtMaximum.Value = Format((Me.txtMaximum.Value), "#,###0;(#,###0)") End Sub
Her er et forslag. Jeg har flyttet din kode til keyup eventen.
Private Sub txtMaximum_KeyUp(ByVal Keycode As MSForms.ReturnInteger, ByVal Shift As Integer) 'If Keycode <> 13 Then MsgBox Keycode On Error Resume Next If Len(txtMaximum) > 23 Then txtMaximum = Left(txtMaximum, 23) MsgBox "Amount is too long. " _ & "Please try again", vbExclamation, "" Cancel = True txtMaximum.SetFocus txtMaximum.SelStart = 0 txtMaximum.SelLength = Len(txtMaximum) End If Select Case Keycode Case 48 To 57, 96 To 105, 8, 13, 36, 110, 188 Exit Sub Case 109, 189 If Len(txtMaximum) > 1 Then txtMaximum = "-" & Left(txtMaximum, Len(txtMaximum) - 1) End If Case Else txtMaximum = Left(txtMaximum, Len(txtMaximum) - 1) End Select txtMaximum.Value = Format((txtMaximum.Value), "#,###0;(#,###0)") End Sub
Mikker - tak for forsøget, men din kode virker ikke hensigtmæssigt. For det første er det ikke nogen god ide at bruge keyup, da man så skal trykke et tilfældigt sted efter indtasning af en kode. For det andet har jeg flytte selve funktionen fra txtMaximum til min enterknap, så tallene først kontrolleres i det øjeblik man trykker på enter istedet efter selve indtastningen. Og det virker meget bedre end min første løsning og din løsning. Så derfor trækker jeg spørgsmålet tilbage igen.
Hej olehen Ja, jeg vil da gerne se din løsning. :o)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.