Aunque no recomiendo utilizar máscaras de entrada le dejo este ejemplo:

Asigno 8 ceros para que solo acepte números

Observe que estoy ingresando febrero 29 del año 2021, lo cual es FALSO. Si cambio por 28 obtengo:

CÓDIGO DEL EVENTO ANTES DE ACTUALIZAR
Private Sub ctlfecha_BeforeUpdate(Cancel As Integer)
On Error GoTo hay_err
Dim strPeriodo As Integer
Dim strMes As Integer
Dim strDia As Integer
Dim dfecha As Date
strPeriodo = Val(Mid(Me.ctlfecha, 1, 4))
strMes = Val(Mid(Me.ctlfecha, 5, 2))
strDia = Val(Mid(Me.ctlfecha, 7, 2))
dfecha = CDate(strPeriodo & "/" & strMes & "/" & strDia)
MsgBox "La fecha es " & Format(dfecha, "Long Date"), vbInformation, "CORRECTO"
hay_err_exit:
Exit Sub
hay_err:
MsgBox " Verifique la fecha, por favor ", vbCritical, "Error.."
Resume hay_err_exit
End Sub