Máscara de entrada para formato de fecha dd/mm/yyyy

Tengo un evento al cambiar el textbox que intenta poner el formato dd/mm/yyyy, funciona más o menos bien, lo que pasa es que da problemas si ya tiene un valor y trato de modificarlo y si salgo del campo por algún motivo, se pierde el formato y ya no se sabe cuál fecha tenía, tengo que limpiar y volver a cargar el form. Si fueran tan amables de revisar el código y darme alguna observación para optimizarlo o bien si ya tienen algo mas robusto que pueda utilizar. Gracias

Private Sub TextBox4_Change()

Dim Texto As Variant
Dim Caracter As Variant
Dim Largo As Integer

On Error Resume Next
Texto = Me.TextBox4.Value
Largo = Len(Me.TextBox4.Value)
For i = 1 To Largo
Caracter = Mid(Texto, i, 1)
If Caracter <> "" Then
If Caracter < Chr(47) Or Caracter > Chr(57) Then
Me.TextBox4.Value = Replace(Texto, Caracter, "")
Else
End If
End If
Next i
On Error GoTo 0
Caracter = 0
Caracter1 = 0
'seleccionamos de acuerdo a la longitud de los datos
'que estamos ingresando
Select Case Len(TextBox4.Value)
'len = largo o longitud
Case 2
'si el textbox tiene 2 caracteres
TextBox4.Value = TextBox4.Value & "/"
'se colocará automáticamente una "/" luego del segundo caracter

Case 5
'si el textbox tiene 5 caracteres
TextBox4.Value = TextBox4.Value & "/"
'se colocará automáticamente una "/" luego del quinto caracter
End Select

If Len(Me.TextBox4.Text) > 10 Or Len(Me.TextBox4.Text) < 10 Then
Me.TextBox4 = Left(Me.TextBox4.Text, 10)
Me.TextBox4.SelStart = 10

End If

End Sub

1 Respuesta

Respuesta
2

Lo mejor es que utilices un control para fecha, puede ser un Monthview o un DTPicker, de esa forma, te aparece un calendario y solamente tienes que hacer click en la fecha.

Para adicionar los controles, entra al menú de VBA, Herramientas, Controles adicionales y busca Microsoft Date a Time Picker Control o Microsoft Monthview Control, marca su casilla y presiona Aceptar.

Sal u dos

Esos controles no me salen en la lista de controles adicionaes.

¿Revisa qué tengas todas las actualizaciones de excel?

¿Qué versión de excel tienes?

Tienes que instalar los controles, sigue los pasos del siguiente enlace.
http://support.microsoft.com/kb/2676583/es
Si no tienes el archivo MSCOMCT2.OCX, deberás buscarlo en la red el apropiado para la versión de tu excel y descargarlo, después vuelve a intentar.

Excel 2016 64 bits

tengo el archivo en syswow64 pero no en system32, al cargaer desde syswow64 da mensaje de error

Aparentemente solo hay solución si se usa office 32 bits en windows 64 bits, pero si el office es 64 bits no se soluciona con la información del link.

El problema es que además de capturar números y las diagonales, tendrías que validar que sea una fecha válida.

Que pena no puedas tener los controles de fecha, te ahorrarías muchos problemas.

Puedes descargar un calendario desde este enlace:

https://sites.google.com/site/e90e50/calendar-control-class 


Lo mejor, para evitar errores de captura, sería tener 3 combos, en lugar de un textbox.

Un combo para los años, un combo para los meses y un combo para los días.

Te anexo un ejemplo de cómo serían los 3 combos

Private Sub ComboBox1_Change()
    ComboBox2 = ""
    ComboBox3 = ""
End Sub
'
Private Sub ComboBox2_Change()
'Por.Dante Amor
    ComboBox3 = ""
    If ComboBox2 = "" Or ComboBox2.ListIndex = -1 Then
        Exit Sub
    End If
    If ComboBox1 = "" Then
        ComboBox2 = ""
        MsgBox "Debes seleccionar el año"
        ComboBox1.SetFocus
        Exit Sub
    End If
    dia = Day(DateSerial(Year(Date), ComboBox2.ListIndex + 1 + 1, 1) - 1)
    For i = 1 To dia
        ComboBox3.AddItem i
    Next
End Sub
'
Private Sub ComboBox2_DropButtonClick()
'Por.Dante Amor
    If ComboBox1 = "" Then
        MsgBox "Debes seleccionar el año"
        ComboBox1.SetFocus
        Exit Sub
    End If
End Sub
'
Private Sub ComboBox3_Change()
    If ComboBox3.ListIndex = -1 Then Exit Sub
    TextBox1 = Format(ComboBox3, "00") & "/" & Format(ComboBox2.ListIndex + 1, "00") & "/" & ComboBox1
End Sub
'
Private Sub ComboBox3_DropButtonClick()
    If ComboBox2 = "" Or ComboBox2.ListIndex = -1 Then
        MsgBox "Debes seleccionar el mes"
        ComboBox2 = ""
        ComboBox2.SetFocus
        Exit Sub
    End If
End Sub
'
Private Sub UserForm_Activate()
'Por.Dante Amor
    año = Year(Date)
    For i = año - 20 To año + 20
        ComboBox1.AddItem i
    Next
    For i = 1 To 12
        ComboBox2.AddItem UCase(Format(DateSerial(Year(Date), i, 1), "Mmmm"))
    Next
End Sub

Primero tienes que capturar el año, después el mes y por último el día, en ese orden podrás saber si es año bisiesto y el número de días de cada mes. Después de seleccionar el día, en automático se llena el textbox1.


Entiendo que quisieras algo más simple, pero como te comenté lo más simples es un control de fecha, como no lo tienes entonces hay que crearlo; ya sea con combos, o de la forma en que lo estas haciendo, pero además de llevar la cuenta de las diagonales, también tienes que revisar si es una fecha válida.


Revisa las opciones.

Sal u dos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas