Dividere le celle per caso (Microsoft Excel)
Manik ha un foglio di lavoro che, nella colonna A, ha valori di testo nel formato “mikeDAVIS”, dove il nome della persona è in minuscolo e il cognome è in maiuscolo. Vorrebbe suddividere i nomi in due colonne separate, secondo il caso del testo.
Ciò può essere ottenuto utilizzando una formula per una macro. Indipendentemente dall’approccio utilizzato, la chiave è capire dove il testo passa da minuscolo a maiuscolo. Questo può essere fatto solo esaminando ogni carattere nella stringa. Quindi, se vuoi usare un approccio formulato, dovrai usare una formula di matrice. La seguente formula di matrice restituisce il cognome di qualunque cosa si trovi nella cella A1:
=MID(A1,MATCH(1,(CODE(MID(A1,ROW($1:$255),1))>=65) * (CODE(MID(A1,ROW($2:$255),1))<90),)+1,255)
Ricorda, poiché questa è una formula di matrice, dovresti inserirla premendo Ctrl + Maiusc + Invio. Restituisce tutto nella cella a partire dalla prima lettera maiuscola che trova. Quindi, in “mikeDAVIS” ritornerebbe “DAVIS” e in “mikeDavis” tornerebbe “Davis”. Supponendo che si utilizzi la formula di matrice nella cella B1, è possibile quindi determinare il nome utilizzando quanto segue:
=SUBSTITUTE(A1,B1,"")
Questa è una formula normale, non una formula di matrice.
Esistono molte formule di matrice simili che possono svolgere più o meno la stessa operazione. Ad esempio, questa formula di matrice restituirà il nome (tutti i caratteri fino al primo carattere maiuscolo) di qualunque cosa si trovi nella cella A1:
=LEFT(A1,MAX((CODE(MID(A$1,ROW(INDIRECT("1:"& LEN(A1))),1))>96)*ROW(INDIRECT("1:"&LEN(A1)))))
È quindi possibile utilizzare la stessa formula regolare (quella che utilizza la funzione SOSTITUISCI) per derivare il cognome.
Se desideri utilizzare un approccio macro per trovare i nomi, tutto ciò che devi fare è trovare una formula che restituisca la posizione della prima lettera maiuscola nel testo. Il codice seguente restituisce questo “punto di cambio” nel testo:
Function GetFirstUpper(MyCell As Range) As Integer Dim sCellValue As String Dim i As Integer Application.Volatile 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
Per utilizzare la funzione, supponiamo che il nome sia nella cella A1. Potresti trovare il nome e il cognome usando queste formule nel tuo foglio di lavoro:
=LEFT(A1,GetFirstUpper(A1)-1) =MID(A1,GetFirstUpper(A1),LEN(TRIM(A1))-GetFirstUpper(A1)+1)
Se preferisci che la tua macro restituisca i nomi effettivi, potresti usare il seguente per restituire tutto prima della prima lettera maiuscola:
Function GetFirstName(MyCell As Range) As String Dim sCellValue As String Dim i As Integer Application.Volatile 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
Per utilizzare la macro, tutto ciò che devi fare è utilizzare quanto segue in una cella del foglio di lavoro. (Ciò presuppone che la stringa di testo da valutare sia nella cella A1.)
=GetFirstName(A1)
Una variazione minore della macro ti consentirà di recuperare in modo simile il cognome, che si presume sia tutto ciò che inizia con la prima lettera maiuscola incontrata.
Function GetLastName(MyCell As Range) As String Dim sCellValue As String Dim i As Integer Application.Volatile 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
Se preferisci, puoi combinare le macro in una singola funzione che, in base a ciò che specifichi, restituirà il nome o il cognome:
Function GetName(MyCell As Range, sWanted As String) As String Dim sCellValue As String Dim i As Integer Application.Volatile 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
Per usare questa funzione combinata devi semplicemente specificare quale nome vuoi:
=GetName(A1, "First")
La parola “Primo” passata come parametro in questo modo restituisce il nome (tutto prima della prima lettera maiuscola). Qualsiasi altra stringa passata come secondo parametro (come “Last” o “xxx” o “Rest” o anche “”) restituisce il cognome.
_Nota: _
Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.
ExcelTips è la tua fonte di formazione economica su Microsoft Excel.
Questo suggerimento (9089) si applica a Microsoft Excel 97, 2000, 2002 e 2003. Puoi trovare una versione di questo suggerimento per l’interfaccia a nastro di Excel (Excel 2007 e versioni successive) qui: