Generar columna con iniciales a partir del nombre y apellidos
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.
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
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.
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
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!
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
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
Hola de nuevo, Luysess
Donde prefieras. O en el foro, o nos lo envías en un correo.
Saludos
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