Access - Obtener iniciales de nombre y apellidos

 
Vista:

Obtener iniciales de nombre y apellidos

Publicado por David (23 intervenciones) el 28/04/2019 09:57:08
buenos días
Estoy buscando por la web y google y sólo encuentro resultados parciales.
Mi consulta es la siguiente:
Tengo dos campos: Apellidos, Nombre y quiero obtener otro campo calculado con las iniciales. El problema está en que las soluciones que he encontrado se refieren sólo a un apellido o un nombre, pero tanto en un campo como en el otro puede haber varias palabras y no sólo una.
Por ejemplo: [Apellidos]= Pérez López [Nombre]= José María ---> [Iniciales]= JMPL
También podría ser que hubiera más de dos palabras en cada campo. P. ej: María del Carmen López-Camino Pérez del Rosal ---> MDCLCPDR (aquí he añadido la complicación de un guión) Los nombres tan largos son una excepción, pero prefiero un solución que me sirva para todos los casos.
Muchas gracias de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Norberto
Val: 1.094
Oro
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Obtener iniciales de nombre y apellidos

Publicado por Norberto (753 intervenciones) el 29/04/2019 13:51:40
Hola:

Añade esta función en un módulo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Public Function Iniciales(Nombre As String, Optional Excluir As Boolean = False) As String
    Dim i As Integer, j As Integer, Resultado As String, Palabra As String
    Const Separadores = " -" 'Aquí ponemos los caracteres que delimitan las partes del nombre
    Const Exclusiones = "/de/del/el/la/las/los/do/dos/da/das/"
 
    Resultado = Left(Nombre, 1) 'Añadimos el primer carácter
    For i = 2 To Len(Nombre)
        If InStr(1, Separadores, Mid(Nombre, i - 1, 1)) > 0 Then
            'si el caracter anterior es un separador
            If Not Excluir Then
                'añadimos el actual.
                Resultado = Resultado & Mid(Nombre, i, 1)
            Else
                'si hay que excluir
                j = i
                Palabra = ""
                'Buscamos la palabra entera
                Do
                   Palabra = Palabra & Mid(Nombre, j, 1)
                   j = j + 1
                Loop While InStr(1, Separadores, Mid(Nombre, j, 1)) = 0 And j <= Len(Nombre)
                'Si la palabra no está en la lista de exclusiones
                If InStr(1, Exclusiones, Palabra) = 0 Then
                    'Agregamos la inicial
                    Resultado = Resultado & Left(Palabra, 1)
                End If
            End If
        End If
    Next
    Iniciales = UCase(Resultado)
 
End Function

Como tienes los apellidos y el nombre en campos distintos, deberás usarla tal que así: ... = Iniciales([Nombre] & " " & [Apellidos])

Un saludo,

Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Obtener iniciales de nombre y apellidos

Publicado por David (23 intervenciones) el 29/04/2019 19:36:19
Hola Norberto
Gracias por la respuesta tan completa.
No obstante, mis nociones de Access no son como me gustaría.
Intentaré adaptarlo, pero quizás tenga problemas con algún término.
Por ejemplo, "Nombre" hace referencia a ¿? (Por ejemplo en la línea If InStr(1, Separadores, Mid(Nombre, i - 1, 1)) > 0 Then y en otras.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Norberto
Val: 1.094
Oro
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Obtener iniciales de nombre y apellidos

Publicado por Norberto (753 intervenciones) el 30/04/2019 11:22:33
Hola.

Nombre en la expresión que indicas hace referencia a lo que entre dentro de la función. Me explico:

1
Public Function Iniciales(Nombre As String, Optional Excluir As Boolean = False) As String

Esta línea definie una función llamada Iniciales. Esta función adminte dos parámetros (entrada de datos) uno, de texto, al que he llamado Nombre (pero podría haberlo llamado Name para hacerlo más chic), recibe una cadena de texto de la cual queremos obtener las iniciales. El otro, llamado Excluir y que es opcional, permite indicar a la función si queremos que excluya las preposiciones, artículos, etc.

A partir de ese momento, dentro de la función, Nombre hace referencia al texto que le ha llegado y no entra en conflicto con el campo [Nombre] de tu tabla ya que la función "no ve" lo que hay fuera de ella. De hecho, si usaramos el término Apellidos se produciría un error.

Dicho esto, ¿cómo debemos de usar la función? En tu caso, al tener el nombre y los apellidos en dos campos diferentes, debemos pasar esa información a la función de la siguiente manera: Nombre & " " & Apellidos. Lo que estamos haciendo es uniendo ambos campos separados entre sí por un espacio en blanco. Si Nombre es José Luis y Apellidos es Las Heras De Las Puertas, el resultado de esa expresión es José Luis Las Heras De Las Puertas. Este texto entrará en la función y esta obtendrá las iniciales JLLHDLP o JLHP dependiendo de si le indicamos o no la opción Excluir.

La expresión completa sería Iniciales(Nombre & " " & Apellidos) para el primer caso e Iniciales(Nombre & " " & Apellidos, True) para el segundo.

¿Puedo poner la expresión tal que así en algún sitio? No. La función devuelve un valor y ese valor debe de ser recogido en algún lugar (que no indicas en tu post inicial). Vamos a suponer. Si fuese en VBA y quisieramos meterlo en una variable llamada Inic, la cosa sería así:

1
Inic = Iniciales(Nombre & " " & Apellidos, True)

Si queremos que se muestren en un cuadro de texto de un informe o formulario, deberíamos poner la expresión en el Origen del control tal que así:

Captura

Si queremos usarlo en una consulta:

Captura

Captura

Espero haber aclarado todas tus dudas.

Un saludo,

Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Norberto
Val: 1.094
Oro
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Obtener iniciales de nombre y apellidos

Publicado por Norberto (753 intervenciones) el 01/05/2019 17:12:04
Hola de nuevo.

1. Prueba a cambiarle el nombre al módulo (modIniciales, p.e.).

2. Prueba la función en el editor de VBA. En la Ventana de inmediato pones:
1
Print Iniciales("José Luis Pérez García")
Y pulsas Enter, a ver si la reconoce.

Si no te aparece la Ventana de inmediato, ve al menú Ver y la activas.

Si ahí funciona, debería hacerlo en cualquier parte su la base de datos.

Un saludo,

Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 25
Ha disminuido 1 puesto en Access (en relación al último mes)
Gráfica de Access

Obtener iniciales de nombre y apellidos

Publicado por David (65 intervenciones) el 01/05/2019 17:26:36



Parece ser que funciona (hasta que yo lo estropee)

Muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Norberto
Val: 1.094
Oro
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Obtener iniciales de nombre y apellidos

Publicado por Norberto (753 intervenciones) el 01/05/2019 18:15:08
Me alegro. No estaba seguro del todo pero me sonaba que ni un procedimiento ni una función se podían llamar igual que un módulo.

Un saludo,

Norberto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar