Generar columna con iniciales a partir del nombre y apellidos

Macro en OpenOffice/LibreOffice Calc Generar iniciales

Necesitas generar una columna con las iniciales de los nombres de determinadas personas; por ejemplo, Felipe Calleja Altomonte tendría como iniciales FCA.

Como la lista de nombres es muy grande, has pensado que quizás puedas resuelverlo con Calc.

Pero no has encontrado ninguna función que lo haga. ¿Cómo resolverlo? Quizas una compleja fórmula pueda permitirlo, así que te pones manos al asunto.

Tras mucho trabajar terminamos con una función que ocupa media página. Total, para darnos cuenta de que algunas personas incorporan partículas como y o de, de las, del, que no queremos que intervengan en las iniciales (por ejemplo, si el nombre fuera Felipe de Calleja y Altomonte), y que harán que nuestra fórmula tenga que ser todavía más compleja, si es que conseguimos hacer que funcione.

Planteamos una solución más técnica pero más sencilla, mediante la creación de una UDF, o función definida por el usuario, en la que tomaremos el valor de la celda donde se muestra el nombre, y los valores de un segundo rango de celdas, donde definiremos aquellas partículas que no queremos que formen parte de las iniciales.

La función del usuario la hemos bautizado como INICIALES. Precisa dos argumentos para funcionar; la celda donde se encuentra el nombre del cual queremos extraer las iniciales, y un rango de celdas donde escribiremos las partículas que no queremos intervengan en ellas, que vamos a llamar excepciones.

Así, si en la celda C5 tenemos el nombre y en el rango G2:G6 tenemos las excepciones y en D5 quiero que se muestren las iniciales, puedo insertar en D5 la fórmula

=INICIALES( C5; G2:G6 )

La macro con la que hemos implementado la función del usuario la puedes encontrar a continuación, o descargarla en el libro de Calc que verás al final de este artículo:

Function INICIALES( cTexto, rExcluir ) As String
Dim x As String, t As String, n As Integer
' eliminamos del texto las exclusiones
For Each x In rExcluir
cTexto=Replace(cTexto, x, "")
Next
' Generamos las iniciales examinando el resto del texto
For n=1 To Len(cTexto)
c=Mid(cTexto,n,1)
If InStr(1,"ABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚÀÈÌÒÙÄËÏÖÜÂÊÎÔÛÇ",c,0)>0 Then t = t & c
Next
INICIALES = t
End Function

Como se puede ver, se han incluído todas las letras mayúsculas, y las vocales con todos los acentos posibles, así como la Ñ y la Ç, como carácteres aceptados para las iniciales.

Un compañero que responde al álias de fornelasa, voluntario en el Foro Oficial en Español, nos hizo algunas observaciones, como por ejemplo que la macro mostrada no detectaba las iniciales si el nombre estaba todo en minúscula o que si estaba todo en mayúscula mostraba el nombre completo, sin detectar nada. También comentó que las excepciones no sirven si el nombre está en mayúsculas y éstas en minúsculas, o viceversa, o se mezclan mayúsculas con minúsculas.

Así que publicamos una segunda versión de nuestra macro; ésta funciona detectando la primera letra tras un espacio en blanco, y descartando previamente las excepciones. Funciona con cualquier combinación de mayúsculas y minúsculas tanto en los nombres como en las excepciones.

 

Function INICIALES( cTexto, rExcluir ) As String
   Dim x As String, t As String, n As Integer
   ' cTexto es una celda; si está vacía, Calc entrega un 0
   ' rExcluir es un rango de celdas; si alguna está vacía, Calc entrega un 0
   ' El rango de celdas se entrega como una matriz de matrices bidimensionales

   ' Si la celda no está vacía
   If cTexto<>0 Then
      ' sustituimos en el texto las exclusiones por espacio
      ' (exclusiones siempre con espacios antes y después)
      For Each x In rExcluir
         If x<>0 Then cTexto=Replace(cTexto, " " & x & " ", " ")
      Next

      ' La primera inicial es la primera letra
      t = Left(cTexto, 1)

      ' Buscamos recursivamente el primer espacio en blanco;
      ' la letra justo a continuación será la inicial
      n=2                ' empezamos desde la segunda letra
      Do While n>1
         n=InStr(n,cTexto, " ")+1
         If n>1 Then t = t & Mid(cTexto, n,1)
      Loop
   EndIf
   INICIALES = UCase(t)
End Function

 

Los nombres de las UDF y la detección automática de etiquetas en Calc

En el ejemplo (y en la imagen) se puede ver que se ha etiquetado la columna con la palabra  I n i c i a l e s (separando con espacios las letras) en lugar de con la palabra  Iniciales.

Si lo hubiéramos hecho así, experimentaríamos que la fórmula deja de funcionar. Incluso se modifica automáticamente, y se muestra como ='Iniciales'(B3;E3:E15), tal como podemos apreciar en la imagen.

Macro UDF generar iniciales y referencias naturales

 

Esto ocurre por la conjunción de varios hechos:

  • la función que estamos utilizando tiene el mismo nombre que hemos puesto en la celda
  • la celda con la etiqueta está formando encabezado de fila o columna de la celda con la fórmula
  • Calc tiene activada la búsqueda automática de etiquetas en las filas y columnas de encabezamiento

 

Por tanto, lo que ocurre no es un error ni un mal funcionamiento. En esta situación, Calc interpreta que la palabra INICIALES utilizada en la fórmula hace referencia a la celda que contiene esa misma palabra, y que está actuando como etiqueta de la columna. Esa característica que nos permite introducir fórmulas con referencias naturales en Calc viene activada por defecto.

Para desactivar la opción, deberemos desmarcar Buscar automáticamente las etiquetas de filas y columnas desde el menú Herramientas > Opciones > OpenOffice/LibreOffice Calc >Calcular. También se puede llenar con un texto distinto el encabezado de la columna (como hemos hecho en el ejemplo), pues si está activada esta opción dispondremos de un sistema muy interesante, sencillo y natural para formular.

Para descargarte el documento con el ejemplo, y la macro, haz clic en el siguiente enlace

Descargar Detectar Iniciales.ods


Editado el 16-09-2015:


Detectar Iniciales o Nombres Compuestos.ods

Se ha agregado a este nuevo documento una macro llamada COMPUESTOS que utilizando el mismo principio, extrae de un nombre compuesto las partículas que le indiquemos:

Function COMPUESTOS( cTexto, rExcluir ) As String
Dim x As String
' cTexto es una celda; si está vacía, Calc entrega un 0
' rExcluir es un rango de celdas; si alguna está vacía, Calc entrega un 0
' El rango de celdas se entrega como una matriz de matrices bidimensionales

' Si la celda no está vacía
If cTexto<>0 Then
' sustituimos en el texto las exclusiones por espacio
' (exclusiones siempre con espacios antes y después)
For Each x In rExcluir
If x<>0 Then cTexto=Replace(cTexto, " " & x & " ", " ")
Next
EndIf
COMPUESTOS = cTexto
End Function

7 comentarios

Comentario De: LuySees [Visitante]

Un comentario... "No siempre se puede complacer a todos". Lo dijo por esto: Habría que poner más reglas de definición de los nombres por lo siguiente: Dado el nombre Ana Yadisney Linares Yamarte, si este se introdujera asÍ: Ana Y Linares Yamarte (sin punto acompañando la Y) el resultado en las iniciales sería ALY, que no es correcto.

13.04.15 @ 23:10
Comentario De: [Miembro]

Hola LuySees.

Por supuesto que cualquier mejora es bienvenida. Si quieres que publiquemos otra versión mejorada, ampliada, o simplemente tomada desde otro punto de vista, por favor, envíanosla.

No pretendemos sentar cátedra; sólo pretendemos ofrecer un punto de partida. Por supuesto, todo es mejorable :)

En cuanto a la regla de la Y sin punto, no se me ocurre cómo distinguir una Y que se debe de eliminar de una Y que no. Por lo tanto, no veo la forma de crear una regla distinta para ese particular.

Saludos

14.04.15 @ 19:02
Comentario De: luysess [Visitante]

Buenos días!

Ante todo, felicitarlos por el tremendo esfuerzo que realizan en los foros para antender a tantos usuarios e inquitudes!

SLV-es, mis comentarios no pretenden ser negativos, son para contribuir a mejorar, o por lo menos, tener una alternativa, hacerle saber al usuario que siempre es posible que pueda existir otra visión y versión!

He estado pensando en el uso de la función split(), pero aun no tengo una proyecto desarrollado en AOO; esta función yo la he usado en visual basic, por eso conozco su utilidad.

Lo de distingir la "Y" es para pensar (es una de las razones por las cuales opino que las compus jamás llegarán a ser superiores a la mente humana!!).

Yo creo que para distinguir si debe ser tomada como inicial de nombre o como conjunción una alternativa podría ser evaluar la posición en la que aparece en la estructura del nombre, o sea, en mi ejemplo está ubicada entre la primera palabra y la siguiente, en el caso de la función split() sería el segundo índice del array.

Yo soy latinoamericano y no conozco (que no quiere decir que sea así) que en la estructura de nuestros nombres una "Y" después del primer nombre sea una conjunción, por lo tanto, desde este punto de vista debería considerarse como inicial de nombre (aunque con las nuevas invensiones de nombres... que es lo que no permite "complacer a todos"!!). Esta podría ser una regla a aplicar a posteriori.

Con lo de "Reglas de definición de los nombres" me refería a reglas a priori sobre la escritura del nombre en la celda, a acatar por parte del usuario de la función, es decir, si la "Y" es inicial, entonces, tener la obligación de ponerle el punto para que vuestra función pueda distinguir correctamente, es decir, sería una advertencia para el usuario de la función.

Gracias por la atención!

Saludos, luysess!

15.04.15 @ 16:44
Comentario De: [Miembro]

Hola de nuevo, LuySess

Nadie se toma tu comentarios como negativos, todo lo contrario.

En cuando a lo de distinguir la Y, debemos tener en cuenta que no contamos con un analizador sintáctico; Tan sólo tenemos una Y entre dos palabras, que suelen ser nombre y apellidos, que tampoco suelen formar parte de un diccionario, por lo que determinar si es una conjunción o una abreviatura es imposible. Además, seguro sería bastante complicado implementar algo que ni por asomo se aproximase.

Por eso necesitamos de la mente humana, y de usuarios que nos faciliten el trabajo, que debe teclear la abreviatura con un punto, y la conjunción sin él. Sin su ayuda, no tenemos una solución sencilla, y dudo que la tengamos por compleja que resulte.

Por otro lado, la función Split convierte una cadena de texto en un array, utilizando un carácter (o más) como separador. Copia y pega este código en tu editor OOo Basic, y ejecútalo

sub main()
  Dim miArray() As string
  Dim cCadena As String
  Dim cSeparador As String
  cCadena = "Alicante,Castellón,Valencia,Murcia"
  cSeparador = ","
  miArray = Split( cCadena, cSeparador )
  msgbox miArray(2)
end sub

Obtenemos una matriz de 4 elementos, cada uno con el nombre de una provincia

15.04.15 @ 19:31
Comentario De: luysess [Visitante]

Saludos nuevamente!!

Coincidimos completamente SLV-es.

Animado por este "contrapunteo" :) y la sugerencia, me he puesto a hacer el proyecto de extraer las iniciales usando la función split. Ya lo tengo algo adelantado, pero estoy trabajando en eso de los chequeos (verdaderamente la tarea duuuura!!).

Lo que he notado es que, quizá, de esta forma se necesiten mayores recursos que con vuestra versión.

En cuanto lo termine lo compartiré con ustedes para que lo evaluen y corrijan si es de su agrado.

Lo que no se, y por eso lo pregunto, para compartirlo... ¿es por el foro, creando un nuevo tema?

Gracias de antemano!!!

luysess

16.04.15 @ 02:16
Comentario De: [Miembro]

Hola de nuevo, Luysess

Donde prefieras. O en el foro, o nos lo envías en un correo.

Saludos

16.04.15 @ 04:24
Comentario De: luysess [Visitante]

Saludos SLV-es!

Ya he terminado el proyecto!

Me dispongo a compartirlo... voy a subirlo al foro debido a que no se cuál es la dirección de email a la que te refieres.

Estoy pensando titular el tema: "Extaer iniciales de nombres usando la función SPLIT()" .

LuySess

Editado por SLV-es
Podeis encontrarlo en este enlace al foro
Fin edición

16.04.15 @ 23:17


Form is loading...