Hola
Pondré como ejemplo algunas máscaras corrientes de entrada
Admitir solo números
sub text1_keypress(keyascii as integer)
if keyascii = 13 then 'caso enter
exit sub
endif
if keyascii=8 (caso backspace)
exit sub
endif
if not isnumeric(chr(keyascii)) then
keyascii=0 'anular tecla
endif
end sub
caso aceptar solo mayúsculas
sub text1_keypress(keyascii as integer)
if keyascii = 13 then 'caso enter
exit sub
endif
if keyascii=8 (caso backspace)
exit sub
endif
keyascii=asc(ucase(chr(keyascii))) 'pasar a mayúscula
if keyascii<asc("A") or keyascii>asc("Z") then
keyascii=0 'anular tecla
endif
end sub
admitir fechas (formato DD/MM/AA)
sub text1_keypress(keyascii as integer)
if keyascii = 13 then 'caso enter
exit sub
endif
if keyascii=8 (caso backspace)
exit sub
endif
if at(chr(keyascii),"/0123456789")=0 then 'si no está entre estos caracteres
keyascii=0
endif
end sub
Este caso garantiza que no se escriban caracteres que no sean números o /, pero no garantiza que sea una fecha válida.
Para ello
sub text1_lostfocus()
if not isdate(text1) then
beep
text1.setfocus
endif
end sub
Admitir un dni (formato 99999999-L)
sub keypress(keyascii as integer)
if keyascii = 13 then 'caso enter
exit sub
endif
if keyascii=8 (caso backspace)
exit sub
endif
keyascii=asc(ucase(chr(keyascii))) 'pasar a mayúsculas
if at(chr(keyascii),"-0123456789")=0 then
keyascii=0
endif
end sub
Así se controlan las teclas válidas. Para saber si es un dni válido hace falta el evento lostfocus
sub text1_lostfocus
if len(text1)<>10 then 'si la longitud es distinta de 10
beep
text1.setfocus
endif
if not isnumeric(left(text1,8)) then 'saber si las 8 primeras posiciones son numéricas
beep
text1.setfocus
endif
if mid(text1,9,1)<>"-" then 'saber si el guión está en su sitio
beep
text1.setfocus
endif
letra$=asc(right(text1,1)) 'en letra queda la letra final
if letra$<asc("A") or letra$>asc("Z") then
beep
text1.setfocus
endif
end sub
Un saludo