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 o 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

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

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

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

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 (9091) si applica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 ed Excel in Office 365. Puoi trovare una versione di questo suggerimento per l’interfaccia del menu precedente di Excel qui: