KEYASCII
Amigos, tenho o cód. abaixo para entrada de numéricos funciona legal só que preciso abilitar o Back Space no mesmo, onde devo mudar?
Private Sub TxtCPF_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case Index
Case Is = 0, 5, 7, 8
Select Case KeyAscii
Case Is = Asc("-"), Asc("."), Asc("0"), Asc("1"), Asc("2"), Asc("3"), Asc("4"), Asc("5"), Asc("6"), Asc("7"), Asc("8"), Asc("9"), Asc("10"), 8
Case Else
MsgBox "Este campo só aceita Números!", vbInformation, "Cadastros Amidy"
KeyAscii = 0
End Select
Case Is = 9, 10, 11, 12, 13, 14
Select Case KeyAscii
Case Is = Asc("-"), Asc("."), Asc("0"), Asc("1"), Asc("2"), Asc("3"), Asc("4"), Asc("5"), Asc("6"), Asc("7"), Asc("8"), Asc("9"), Asc("10"), 8
Case Else
MsgBox "Este campo só aceita Números!", vbInformation, "Cadastros Amidy"
KeyAscii = 0
End Select
End Select
End Sub
Estranho. Você incluiu o 8, que é o Ascii do backspace, e não funcionou? De qualquer maneira, achei seu código muito extenso pra essa rotina, já que você está identificando os números um a um. Já que os códigos para esses números estão em sequência, ficaria mais "elegante" assim:
Select Case KeyAscii
Case 48 To 57 'só aceita de 0 a 9
Case 8 'backspace
Case Else
KeyAscii = 0
End Select
Select Case KeyAscii
Case 48 To 57 'só aceita de 0 a 9
Case 8 'backspace
Case Else
KeyAscii = 0
End Select
Puxei sua rotina, testei e entendi seu problema: na hora que apaga, o "change" entra em ação, e a formatação fica doida, né? Eu odeio o Change por causa disso.
Eu colocaria a parte de formatação no próximo evento do seu projeto. Por exemplo: depois de formatar a string, você põe foco num botão. Então colocaria a rotina abaixo no GotFocus do botão. Como uma maneira genérica, vou colocar a rotina de formatação no lostfocus do txtcpf:
Private Sub txtcpf_LostFocus()
If Len(txtcpf) 11 Then MsgBox "Tá faltando número!!!!": Exit Sub
If Len(txtcpf) 11 Then MsgBox "Tá sobrando número!!!!": Exit Sub
txtcpf = Left(txtcpf, 3) & "." & Mid(txtcpf, 4, 3) & "." & Mid(txtcpf, 7, 3) & "-" & Right(txtcpf, 2)
End Sub
Não é a melhor saÃda, pois se o usuário tocar noutro objeto enquanto está digitando o CPF, vai aparecer a mensagem de erro. Colocaria no GotFocus do próximo objeto.
Eu colocaria a parte de formatação no próximo evento do seu projeto. Por exemplo: depois de formatar a string, você põe foco num botão. Então colocaria a rotina abaixo no GotFocus do botão. Como uma maneira genérica, vou colocar a rotina de formatação no lostfocus do txtcpf:
Private Sub txtcpf_LostFocus()
If Len(txtcpf) 11 Then MsgBox "Tá faltando número!!!!": Exit Sub
If Len(txtcpf) 11 Then MsgBox "Tá sobrando número!!!!": Exit Sub
txtcpf = Left(txtcpf, 3) & "." & Mid(txtcpf, 4, 3) & "." & Mid(txtcpf, 7, 3) & "-" & Right(txtcpf, 2)
End Sub
Não é a melhor saÃda, pois se o usuário tocar noutro objeto enquanto está digitando o CPF, vai aparecer a mensagem de erro. Colocaria no GotFocus do próximo objeto.
Opa! Mas é claro que tem algumas outras maneiras de se fazer isso. O uso de máscara é sempre citado aqui no site (não sei porque, não gosto), entre outros métodos. Deixe o tópico aberto, porque, como sempre digo: VB e Neston, são mil e uma maneiras de fazer!
Tópico encerrado , respostas não são mais permitidas