VBA – Máscara de Data no TextBox (atualizado)

Máscara de data (e uma pequena homenagem)

Para quem navega no blog e no fórum há algum tempo, já deve ter usado essa dica:

https://www.tomasvasquez.com.br/blog/microsoft-office/vba-fomatar-textbox-data-telefone-cpf-nos-eventos-keypress-e-change

Ela funciona bem. Só tem um problema, que é quando você começa limpar o campo usando a tecla backspace, ele trava quando encontra um separador de datas ( “/”), obrigando o usuário a selecionar todo o texto para conseguir alterá-lo. Depois de precisar de código e bater um pouco a cabeça, cheguei num resultado satisfatório:

Private KeyCodeToAvoid As MSForms.ReturnInteger
 
Private Sub TextBoxData_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Set KeyCodeToAvoid = KeyCode
End Sub
 
Private Sub TextBoxData_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    'Limita a Qde de caracteres
    TextBoxData.MaxLength = 10
 
    'para permitir que apenas números sejam digitados
    If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then
        KeyAscii = 0
    End If
 
End Sub
 
Private Sub TextBoxData_Change()
'Formata : dd/mm/aaaa
'não avalia se for backspace ou delete
    If Not (KeyCodeToAvoid = KeyCodeConstants.vbKeyBack Or KeyCodeToAvoid = KeyCodeConstants.vbKeyDelete) Then
        If Len(TextBoxData) = 2 Or Len(TextBoxData) = 5 Then
            TextBoxData.Text = TextBoxData.Text & "/"
            SendKeys "{End}", True
        End If
    End If
    'zera o keycode
    KeyCodeToAvoid = KeyCodeConstants.vbKey0
End Sub

É isso. Bom proveito!

Comentários

comentários