Los programas de hoja de cálculo, como LibreOffice, Numbers o Excel, cuentan con funciones que van más allá del cálculo numérico con operaciones básicas y otras fórmulas más complejas. Podemos simular funciones de bases de datos, definir funciones lógicas, realizar conversiones entre unidades de medida o procesar fechas. De este último tipo, incluso podemos encontrar aplicaciones de lo más extrañas, como conocer el día en el que cae el Domingo de Pascua. Todas ellas vienen «de serie». El usuario, por su cuenta, puede definir sus propias funciones. Y este es el tema que ocupa esta entrada.
Personalmente, no hay curso en el que no me encuentre con el problema de analizar una lista de nombres (de alumnos, lógicamente). Los listados que exportan algunas bases de datos nunca tienen el formato adecuado para los programas que necesitan importarlos. Uno se plantea siempre si merece la pena modificarlos manualmente. Pensándolo un par de veces, está claro: mejor procesar los datos con algún programa. El tiempo invertido compensará; y quizá podamos reutilizar el «programita» en años posteriores.
En cualquier caso nos enfrentamos al problema de procesar cadenas de texto. Podríamos programar unas pocas líneas de código en cualquier lenguaje de script y ejecutarlo; pero es una opción demasiado técnica. También podemos optar por utilizar un programa de hoja de cálculo, que incorporan funciones para el tratamiento de texto. Con paciencia y en varios pasos, podemos lograr la conversión que necesitamos.
El problema que se presenta año tras año es el mismo: llega un listado de nombres de personas con este formato.
Apellido1 Apellido2, Nombre
Apellidos y nombre en la misma columna de una hoja de cálculo. Y uno sencillamente necesita los apellidos en una columna y el nombre en otra. Probablemente exista alguna función (muy escondida supongo) que esté diseñada precisamente para este propósito. Sin embargo, una solución más entretenida puede ser combinar funciones de texto ya definidas en la hoja de cálculo. De hecho, puede ser un modo interesante de introducir el concepto de función a los alumnos. Puede ser incluso ser un primer paso en el mundo de la programación.
Volvamos al problema. Para separar apellidos de nombre bastaría con combinar adecuadamente las funciones de texto IZQUIERDA, ENCONTRAR, DERECHA y LARGO. Suponiendo que el nombre completo está almacenado en la celda A1, en la celda contigua (B1) definimos la siguiente fórmula, que nos devolverá los apellidos de la persona:
=IZQUIERDA(A1;ENCONTRAR(",";A1)-1)
En otra celda (C1) definimos esta fórmula, que nos devolverá el nombre de la persona:
=DERECHA(A1;LARGO(A1)-ENCONTRAR(",";A1)-1)
Es cierto que si necesitamos aplicar esta conversión varias veces en el mismo documento de hoja de cálculo, la definición de las funciones puede resultar un poco tedioso. En este caso, el usuario podría definir su propia función programando una «macro»; un conjunto de instrucciones que hacen exactamente lo mismo que la combinación de funciones anterior. En el programa de hoja de cálculo se accede a esta opción a través del menú: «Herramientas – Macros – Organizar macros». Quizá dedique futuras entradas a este tema. De momento, si alguno ha definido alguna vez (o ha copiado y pegado) alguna macro, un posible fragmento de código sería el siguiente:
REM * Funciones LosApellidos & ElNombre *
Function LosApellidos(NombreCompleto As String)
Dim Apellidos As String
Dim Pos As Integer
Pos = InStr(NombreCompleto,",")-1
Apellidos = Left(NombreCompleto, Pos)
LosApellidos = Apellidos
End Function
Function ElNombre(NombreCompleto As String)
Dim Nombre As String
Dim Pos As Integer
Dim LNC As Integer
lNC = Len(NombreCompleto)
lAP = Len(LosApellidos(NombreCompleto))
Pos = lNC-lAP-2
Nombre = Right(NombreCompleto, Pos)
ElNombre = Nombre
End Function
Con esta definición, suponiendo que el nombre completo de la persona está almacenado en A1, bastaría con utilizar las funciones de este modo en cualquier celda.
Para obtener los apellidos:
=LosApellidos(A1)
Y para obtener el nombre:
=ElNombre(A1)
Podéis encontrar algunos detalles sobre estas funciones en la wiki de reciente creación que comenté hace unos días.
One Comment
El mismo problema al que me he enfrentado más veces de las que me gustaría, resulta sencillo cuando existe una coma que divide apellidos y nombres, ¿y si esa coma no existiera? Problema que he resuelto con éxito.