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.
Sugiero crear una variable intermedia, por ejemplo: zChr = Mid(strText, iChr, 1), para simplificar el codigo.
ResponderBorrarHe copiado el código en personal.xls y en un libro aparte y en los casos me da el error #¿nombre?
ResponderBorrar¿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=Iniciales(celda) o =PERSONAL.XLS!Iniciales(Celda), y no funciona. En este último caso, el error es #¡VALOR!.
ResponderBorrarEstimado,
ResponderBorrar¿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.
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).
ResponderBorrarUsarí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.
Jorge, gusto en saludarte.
ResponderBorrarTe 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.
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.
ResponderBorrarTengo planificado publicar más notas en el futuro, tal vez una guía.
Exelente ..!!!! gracias .!!!
ResponderBorrarayudo mucho ....!!!!
pero me toco cambiar todas las ( , ) x ( ; ), tambien x la celda que deseo cojer el nombre eso fue lo de menos gracias ..!!!
no funciona si todo esta en mayusculas
ResponderBorrarFunction 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
Gracias por aportar
ResponderBorrarY tampoco funciona si todas estan en minisculas
ResponderBorrarSaludos
recuerden que en algunos casos, no reconoce con coma, sugiero que le cambiae de Coma (,) a punto y coma (;)
ResponderBorrarpara que les pueda reconocer la formula, sino les saldra error,
buen aporte de ante mano por estas formulas.
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
ResponderBorrarHola, =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).
ResponderBorrarOtra UDF
ResponderBorrarFunction 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.
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