martes, noviembre 16, 2010

Extraer las iniciales de un nombre con Excel

Uno de mis lectores me consulta cómo extraer las iniciales de un nombre. En la columna A tenemos una lista de nombres (empleados de una empresa, invitados a un acontecimiento, etc.) y en la columna B queremos obtener las iniciales



En esta nota presentaré dos soluciones, una basada en funciones y la segunda con una UDF (función definida por el usuario).

Solución con funciones

Empecemos por el final: la fórmulas es (respirar hondo) ésta

=ELEGIR(LARGO(A2)-LARGO(SUSTITUIR(A2," ",""))+1,IZQUIERDA(A2,1),IZQUIERDA(A2,1)&EXTRAE(A2,HALLAR("#",SUSTITUIR(A2," ","#",1))+1,1),IZQUIERDA(A2,1)&EXTRAE(A2,HALLAR("#",SUSTITUIR(A2," ","#",1))+1,1)&EXTRAE(A2,HALLAR("#",SUSTITUIR(A2," ","#",2))+1,1),IZQUIERDA(A2,1)&EXTRAE(A2,HALLAR("#",SUSTITUIR(A2," ","#",1))+1,1)&EXTRAE(A2,HALLAR("#",SUSTITUIR(A2," ","#",2))+1,1)&EXTRAE(A2,HALLAR("#",SUSTITUIR(A2," ","#",3))+1,1))



¿Cómo funciona esta fórmula?

La expresión

LARGO(A2)-LARGO(SUSTITUIR(A2," ",""))+1

calcula de cuantas palabras está compuesto el nombre. La primer función LARGO da la cantidad de caracteres en la celda, incluidos los espacios. La segunda función LARGO calcula la cantidad de caracteres sin los espacios. La diferencia entre ambas más 1, es el número de palabras.

De acuerdo a este valor, la función ELEGIR activa la expresión adecuada para extraer las iniciales.

La primer inicial será siempre la primer letra del nombre, lo que logramos con la fórmula IZQUIERDA(A2,1) . Este es el primer caso de la función ELEGIR.

Para encontrar la segunda inicial tenemos que encontrar donde comienza la segunda palabra. El truco aquí es reemplazar el primer espacio con un carácter especial (por ejemplo #). Para sustituir el primer espacio con el carácter # usamos

SUSTITUIR(A2," ","#",1)

Para hallar donde se encuentra este carácter en el nombre usamos

HALLAR("#",SUSTITUIR(A2," ","#",1))+1

Y finalmente, para extraer la inicial usamos

EXTRAE(A2,HALLAR("#",SUSTITUIR(A2," ","#",1))+1,1)

Ahora tenemos que concatenarlo con la primer inicial lo que hacemos con el operador &

IZQUIERDA(A2,1)&EXTRAE(A2,HALLAR("#",SUSTITUIR(A2," ","#",1))+1,1)

Para el caso que el nombre tenga tres palabras usamos la misma fórmula concatenando a la anterior la expresión

EXTRAE(A2,HALLAR("#",SUSTITUIR(A2," ","#",2))+1,1)

Quedando

IZQUIERDA(A2,1)&EXTRAE(A2,HALLAR("#",SUSTITUIR(A2," ","#",1))+1,1)&EXTRAE(A2,HALLAR("#",SUSTITUIR(A2," ","#",2))+1,1)

Para el caso de cuatro palabras en el nombre concatenamos a la expresión anterior

EXTRAE(A2,HALLAR("#",SUSTITUIR(A2," ","#",3))+1,1)

Esta fórmula tiene algunas serias limitaciones:

  • Puede extraer iniciales para nombres de hasta cuatro palabras (si bien podemos agregar otras expresiones y adaptarla para cinco o más palabras en el nombre)

  • En caso de nombres que incluyen "de", la función falla ya que no distingue entre minúsculas y mayúsculas



  • Otro problema surge si entre las palabras del nombre hay más de un espacio.

Una función definida por el usuario nos proporciona una solución más flexible (y elegante, en mi opinión).

Solución con una UDF

En un módulo común del editor de Vba (preferentemente en el Personal.xls) ponemos este código



Option Explicit

Function Iniciales(strText As String)
    Dim strLen As Long, iChr As Long
    Dim strTemp As String

    strLen = Len(strText)

    For iChr = 1 To strLen
        If Asc(Mid(strText, iChr, 1)) >= 65 And Asc(Mid(strText, iChr, 1))<= 90 Then
            strTemp = strTemp & Mid(strText, iChr, 1)
        End If
    Next iChr

    Iniciales = strTemp
    
End Function


Este código empieza por contar cuantos caracteres hay en la celda que contiene el nombre. Luego evalúa cada carácter y determina si es una letra mayúscula (Asc>=65 o Asc<=90). Si es mayúscula agrega el carácter a la variable strTemp. Al terminar la rutina, la función recibe el valor de strTemp.

17 comentarios:

  1. Sugiero crear una variable intermedia, por ejemplo: zChr = Mid(strText, iChr, 1), para simplificar el codigo.

    ResponderBorrar
  2. He copiado el código en personal.xls y en un libro aparte y en los casos me da el error #¿nombre?

    ResponderBorrar
  3. ¿Cómo estás introduciendo la función en la celda? Aparentemente estás usando un nombre distinto a "iniciales" o no estás usando el asistente de funciones.

    ResponderBorrar
  4. =Iniciales(celda) o =PERSONAL.XLS!Iniciales(Celda), y no funciona. En este último caso, el error es #¡VALOR!.

    ResponderBorrar
  5. Estimado,
    ¿estás poniendo "celda" o la referencia a la celda que contiene el nombre?
    En la barra de las fórmulas debería verse =Iniciales(A1), suponiendo que el nombre del cual se quiere extraer las iniciales está en la celda A1.
    También puedes mandarme el archivo para que pueda ver donde está el problema.

    ResponderBorrar
  6. Cada vez que leo este blog aprendo algo nuevo, y eso me agrada. Quisiera contribuir con lo que yo haría en este caso (con Excel 2003, que es el que uso).

    Usaría del menú "Datos" la opción "Texto en columnas", escogiendo la opción "Delimitados". Luego de marcar como el delimitador "espacios", esta opción me separaría cada nombre en 3 ó 4 columnas (dependiendo del nombre que más palabras tenga).

    Luego, en una columna adicional, usaría la fórmula =IZQUIERDA(A1,1) y copiaría según la cantidad de columnas y filas que sean requeridos, obteniendo así las iniciales en columnas separadas.

    Por último, uniría las 3 ó 4 columnas de iniciales (obtenidas en el paso previo) en una sola columna (con =& ó concatenar). Es el mismo resultado, sólo que no es automático (pero a mí me resulta en un dos por tres, y tal vez a alguien más le interese).

    Saludos desde Panamá,
    E.V.

    ResponderBorrar
  7. Jorge, gusto en saludarte.
    Te comento que me gustaria realizar dashboard con indicadores para medicion de variables, me han comentado de xcelsius como opcion de software, crees necesario dicho software para la graficación de variables o con excel se puede obtener algo parecido?.
    Saludos.

    ResponderBorrar
  8. No tengo experiencia con Xcelsius, pero si puedo decirte que se pueden hacer dashboards muy elaborados con Excel. Puedes fijarte en las pocas notas que he publicado sobre el tema apretando el enlace "Dashboards" en la nube de etiquetas.
    Tengo planificado publicar más notas en el futuro, tal vez una guía.

    ResponderBorrar
  9. Exelente ..!!!! gracias .!!!
    ayudo mucho ....!!!!
    pero me toco cambiar todas las ( , ) x ( ; ), tambien x la celda que deseo cojer el nombre eso fue lo de menos gracias ..!!!

    ResponderBorrar
  10. no funciona si todo esta en mayusculas


    Function Iniciales(strText As String)
    Dim strLen As Long, iChr As Long
    Dim strTemp As String
    strText = LTrim(RTrim(strText))
    strLen = Len(strText)
    strTemp = strTemp & Mid(strText, 1, 1)
    For iChr = 2 To strLen
    If Asc(Mid(strText, iChr, 1)) = 32 Then 'And Asc(Mid(strText, iChr, 1)) <= 90 Then
    strTemp = Trim(strTemp & Mid(strText, iChr + 1, 1))
    End If
    Next iChr

    Iniciales = strTemp

    End Function

    ResponderBorrar
  11. Y tampoco funciona si todas estan en minisculas

    Saludos

    ResponderBorrar
  12. recuerden que en algunos casos, no reconoce con coma, sugiero que le cambiae de Coma (,) a punto y coma (;)
    para que les pueda reconocer la formula, sino les saldra error,

    buen aporte de ante mano por estas formulas.

    ResponderBorrar
  13. Buenísimo!... sólo tengo una duda con respecto a la fórmula q colocaste : =Iniciales(A2) , puedes explicar eso please, yo lo coloco y no me sale ningún valor

    ResponderBorrar
  14. Hola, =INICIALES() es la función definida por el usuario (macro) que porpongo para la tarea. Antes de poder usarla tienes que poner el código en un módulo del editor de editor del Vb (en el cuaderno en uso o en el Personal.xlsb).

    ResponderBorrar
  15. Otra UDF

    Function Iniciales(texto As Range) As String

    Dim resultado As String
    Dim palabras() As String

    palabras = Split(AjustarEspacios(texto))

    For i = LBound(palabras) To UBound(palabras)
    resultado = resultado & Left(palabras(i), 1)
    Next

    Iniciales = resultado

    End Function

    Private Function AjustarEspacios(ByVal texto As String) As String

    Dim resultado As String

    resultado = Trim(texto)
    Do While InStr(resultado, " ")
    resultado = Replace(resultado, " ", " ")
    Loop

    AjustarEspacios = resultado

    End Function

    Pero que pasa si los nombres están en una celda y los apellidos en otra celda? Como se solucionaría? Si cualquiera puede responder le agradecería.

    ResponderBorrar
  16. En ese caso tendrías que unir los contenido de las dos celdas en una única cadena de texto. Se puede hacer en el código (etndrás que definir un parámetro más en la función), o manualmente en la hooja de Excel.

    ResponderBorrar

Nota: sólo los miembros de este blog pueden publicar comentarios.