División de celdas por caso (Microsoft Excel)
Manik tiene una hoja de trabajo que, en la columna A, tiene valores de texto en el formato «mikeDAVIS», donde el nombre de la persona está en minúsculas y el apellido en mayúsculas. Le gustaría dividir los nombres en dos columnas separadas, según el caso del texto.
Esto se puede lograr utilizando una fórmula o una macro. Independientemente del enfoque que utilice, la clave es averiguar dónde cambia el texto de minúsculas a mayúsculas. Esto solo se puede hacer examinando cada carácter de la cadena. Por lo tanto, si desea utilizar un enfoque de fórmula, deberá utilizar una fórmula de matriz. La siguiente fórmula de matriz devuelve el apellido de lo que esté en la celda A1:
=MID(A1,MATCH(1,(CODE(MID(A1,ROW($1:$255),1))>=65) * (CODE(MID(A1,ROW($2:$255),1))<90),)+1,255)
Recuerde, dado que esta es una fórmula de matriz, debe ingresar presionando Ctrl + Shift + Enter. Devuelve todo en la celda comenzando con la primera letra mayúscula que encuentra. Así, en «mikeDAVIS» devolvería «DAVIS» y en «mikeDavis» devolvería «Davis». Suponiendo que usa la fórmula matricial en la celda B1, podría determinar el primer nombre usando lo siguiente:
=SUBSTITUTE(A1,B1,"")
Esta es una fórmula regular, no una fórmula de matriz.
Hay muchas fórmulas de matriz similares que pueden realizar la misma tarea. Por ejemplo, esta fórmula de matriz devolverá el primer nombre (todos los caracteres hasta el primer carácter en mayúscula) de lo que esté en la celda A1:
=LEFT(A1,MAX((CODE(MID(A$1,ROW(INDIRECT("1:"& LEN(A1))),1))>96)*ROW(INDIRECT("1:"&LEN(A1)))))
Luego puede usar la misma fórmula regular (la que usa la función SUSTITUIR) para derivar el apellido.
Si desea utilizar un enfoque macro para encontrar los nombres, todo lo que necesita hacer es crear una fórmula que devuelva la ubicación de la primera letra mayúscula en el texto. El siguiente código devuelve este «punto de cambio» en el texto:
Function GetFirstUpper(MyCell As Range) As Integer Dim sCellValue As String Dim i As Integer sCellValue = Trim(MyCell.Value) i = 1 Do While (Asc(Mid(sCellValue, i, 1)) > 90 _ Or Asc(Mid(sCellValue, i, 1)) < 65) _ And i < Len(sCellValue) + 1 i = i + 1 Loop If i > Len(sCellValue) Then GetFirstUpper = 99 Else GetFirstUpper = i End If End Function
Para usar la función, supongamos que el nombre está en la celda A1. Puede encontrar el nombre y apellido usando estas fórmulas en su hoja de trabajo:
=LEFT(A1,GetFirstUpper(A1)-1) =MID(A1,GetFirstUpper(A1),LEN(TRIM(A1))-GetFirstUpper(A1)+1)
Si prefiere que su macro devuelva los nombres reales, puede usar la siguiente para devolver todo antes de la primera letra mayúscula:
Function GetFirstName(MyCell As Range) As String Dim sCellValue As String Dim i As Integer sCellValue = Trim(MyCell.Value) i = 1 Do While (Asc(Mid(sCellValue, i, 1)) > 90 _ Or Asc(Mid(sCellValue, i, 1)) < 65) _ And i < Len(sCellValue) + 1 i = i + 1 Loop If i > Len(sCellValue) Then GetFirstName = sCellValue Else GetFirstName = Left(sCellValue, i - 1) End If End Function
Para usar la macro, todo lo que necesita hacer es usar lo siguiente en una celda de la hoja de trabajo. (Esto supone que la cadena de texto a evaluar está en la celda A1.)
=GetFirstName(A1)
Una pequeña variación en la macro le permitirá buscar de manera similar el apellido, que se supone que es todo lo que comienza con la primera letra mayúscula encontrada.
Function GetLastName(MyCell As Range) As String Dim sCellValue As String Dim i As Integer sCellValue = Trim(MyCell.Value) i = 1 Do While (Asc(Mid(sCellValue, i, 1)) > 90 _ Or Asc(Mid(sCellValue, i, 1)) < 65) _ And i < Len(sCellValue) + 1 i = i + 1 Loop If i > Len(sCellValue) Then GetLastName = sCellValue Else GetLastName = Mid(sCellValue, i) End If End Function
Si lo prefiere, puede combinar las macros en una única función que, según lo que especifique, devolverá el nombre o el apellido:
Function GetName(MyCell As Range, sWanted As String) As String Dim sCellValue As String Dim i As Integer sCellValue = Trim(MyCell.Value) i = 1 Do While (Asc(Mid(sCellValue, i, 1)) > 90 _ Or Asc(Mid(sCellValue, i, 1)) < 65) _ And i < Len(sCellValue) + 1 i = i + 1 Loop If i > Len(sCellValue) Then GetName = sCellValue Else If LCase(sWanted) = "first" Then GetName = Left(sCellValue, i - 1) Else GetName = Mid(sCellValue, i) End If End If End Function
Para usar esta función combinada, simplemente necesita especificar el nombre que desea:
=GetName(A1, "First")
La palabra «Primero» pasada como parámetro de esta manera devuelve el nombre (todo antes de la primera letra mayúscula). Cualquier otra cadena pasada como segundo parámetro (como «Último» o «xxx» o «Resto» o incluso «») da como resultado que se devuelva el apellido.
_Nota: _
Si desea saber cómo usar las macros descritas en esta página (o en cualquier otra página de los sitios ExcelTips), he preparado una página especial que incluye información útil.
link: / excelribbon-ExcelTipsMacros [Haga clic aquí para abrir esa página especial en una nueva pestaña del navegador]
.
ExcelTips es su fuente de formación rentable en Microsoft Excel.
Este consejo (9091) se aplica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 y Excel en Office 365. Puede encontrar una versión de este consejo para la interfaz de menú anterior de Excel aquí:
enlace: / excel-Splitting_Cells_by_Case [División de celdas por caso]
.