Tu "inocente" pregunta daría para escribir un libro... je, je...
Vamos a ver... te explico cómo lo solucionaría yo. Pero para ello debemos dividir el problema en dos partes:
- Primera parte: uso de guiones (y otros símbolos)
La manera más sencilla y efectiva para evitar la introducción de guiones u otros símbolos "extraños" es utilizar una máscara de entrada. La máscara de entrada la puedes definir directamente sobre las propiedades del campo, en la tabla en vista diseño.
¿En tu caso parece que la máscara de entrada más efectiva es utilizando?
Es decir, ¿si suponemos que la longitud del campo es de diez caracteres tu máscara de entrada sería? diez veces; esto es:?
Esta máscara te permite escribir letras y espacios, pero no te deja escribir guiones.
Si me dices que el campo también puede contener números, además de letras, la máscara de entrada debería utilizar el carácter a
Es decir, si seguimos con el ejemplo de los diez caracteres, tu máscara debería ser:
Aaaaaaaaaa
Simple y efectivo.
- Segunda parte: acentos
Para solventar este "problema" debemos recurrir a código VB. Lo que se debería hacer sería:
1.- Con el formulario en vista diseño, seleccionar el campo [nombre] y sacar sus propiedades.
2.- Nos vamos a pestaña Eventos -> Después de actualizar, y le generamos el siguiente código:
...
Private Sub Nombre_AfterUpdate()
'Declaramos las variables
Const carConAc As String = "áéíóú"
Const carSinAc As String = "aeiou"
Dim vTexto As String
Dim i As Integer, largoTexto As Integer
Dim mtzConAc(Len(carConAc))
Dim mtzSinAc(Len(carSinAc))
'Rellenamos la primera matriz con acentos
For i = 1 To Len(carConAc)
mtzConAc(i) = Mid(carConAc, i, 1)
Next
'Rellenamos la segunda matriz sin acentos
For i = 1 To Len(carConAc)
mtzSinAc(i) = Mid(carSinAc, i, 1)
Next
'Asignamos valor a las variables
vTexto = Nz(Me.Nombre.Value, "")
'Si no se ha escrito nada no se ejecuta nada
If vTexto = "" Then Exit Sub
'Cogemos la longitud del texto
largoTexto = Len(vTexto)
'Iniciamos el proceso de reemplazo
For i = 1 To Len(carConAc)
vTexto = Replace(vTexto, mtzConAc(i), mtzSinAc(i))
Next i
'Reescribimos el texto sin acentos
Me.Nombre.Value = vTexto
End Sub
...
Fíjate en las dos constantes del principio: carConAc y carSinAc. Verás rápidamente que hay una correspondencia entre carácter acentuado y no acentuado en función de su posición (es decir, la posición 1 es la a; la posición 2 es la e, etc.).
Si te interesara incluir mayúsculas acentuadas deberías respetar la correlación entre letras y posición. ¿Hablo raro? (Je, je...). Te pongo un ejemplo:
- Esta modificación estaría bien:
Const carConAc As String = "áéíóúÁÉ"
Const carSinAc As String = "aeiouAE"
- Esta modificación estaría mal
Const carConAc As String = "áéíóúÁÉ"
Const carSinAc As String = "aeiouEA"
Porque lo que haría sería cambiarte Á por E, y É por A.
Y eso es todo. Ya me dirás qué tal te ha ido.