Extraire les noms d'un text

Il s'agit d'un exemple de données contenues dans une cellule:

2014/08/19 12:59 John Doe
append [email protected]

Je dois extraire le nom dans le text. Je sais qu'il est toujours placé après le timbre date-date.

Mon idée est de find la position de ":" et d'append 4 en obtenant ainsi la position de la première lettre du prénom:

colonLoc = InStr(sampleData, ":") firstLetterLoc = colonLoc + 4 

Comment puis-je get le prénom et le nom de famille après cela?

Cela fonctionne même pour les noms avec des espaces:

 Function ExtractName(str As Ssortingng) As Ssortingng Dim i As Long Dim splitStr() As Ssortingng Dim nameParts() As Ssortingng splitStr = Split(str, " ") ReDim nameParts(LBound(splitStr) To UBound(splitStr) - 4) For i = LBound(nameParts) To UBound(nameParts) nameParts(i) = splitStr(i + 2) Next i ExtractName = Join(nameParts, " ") End Function 

Ce que cela fait efficacement, c'est supprimer quatre sous-strings: la date, l'heure, le bit d' add et l'adresse e-mail. Tout le rest au milieu est supposé faire partie du nom.

Exemple d'utilisation:

 Debug.Print ExtractName("2014/08/19 12:59 John Doe add [email protected]") Debug.Print ExtractName("2014/08/19 12:59 Johan Sebastian Bach add [email protected]") Debug.Print ExtractName("2014/08/19 12:59 Fuh Wei Guo Tang add [email protected]") Debug.Print ExtractName("2014/08/19 12:59 Jens von dem Hagen add [email protected]") Debug.Print ExtractName("2014/08/19 12:59 José Manuel de Santiago Itthuralde add [email protected]") 

EDIT Maintenant, vous dites que votre string de saisie est divisée sur deux lignes … Cela fonctionne pour moi avec l'input que vous avez spécifiée:

 Function ExtractName(str As Ssortingng) As Ssortingng Dim i As Long Dim splitStr() As Ssortingng Dim nameParts() As Ssortingng splitStr = Split(Split(str, vbLf)(0), " ") ReDim nameParts(LBound(splitStr) To UBound(splitStr) - 2) For i = LBound(nameParts) To UBound(nameParts) nameParts(i) = splitStr(i + 2) Next i ExtractName = Join(nameParts, " ") End Function 

Voici une ligne pour get ce que vous voulez.

 debug.print Mid(Split(Split(Range("A1").Value, Chr(10))(0), ":")(1), 3) 

entrez la description de l'image ici

MODIFIER:

En réalité, vous n'avez pas besoin de VBA pour cela. Vous pouvez également utiliser des formules Excel

 =MID(A1,FIND(":",A1)+3,FIND(CHAR(10),A1)-(FIND(":",A1)+3)) 

entrez la description de l'image ici

C'est comme ça:

 Option Explicit Public Sub Playground() Const SampleData As Ssortingng = "2014/08/19 12:59 John Doe add [email protected]" Dim Parts() As Ssortingng Dim FirstName As Ssortingng Dim LastName As Ssortingng Parts = Split(SampleData) FirstName = Parts(2) LastName = Parts(3) Debug.Print FirstName Debug.Print LastName End Sub 

Pour des cas plus compliqués (p. Ex. Les espaces dans les noms), vous devrez peut-être le modifier un peu.

Cela vous donnera le prénom (en supposant qu'il n'y ait que 1), le nom de famille (tous les autres noms) et le courrier électronique dans un set variant

 Option Explicit Public Function Name(source As Ssortingng) As Variant Dim breakup As Variant breakup = Split(source, ":") breakup = Split(Mid(breakup(1), 4), " ") Dim i As Integer Dim FirstName As Ssortingng FirstName = breakup(0) Dim LastName As Ssortingng For i = 1 To UBound(breakup) - 2 LastName = LastName & " " & breakup(i) Next LastName = Mid(LastName, 2) Dim Email As Ssortingng Email = breakup(UBound(breakup)) Name = Array(FirstName, LastName, Email) End Function 
 sampleData = "2014/08/19 12:59 John Doe add [email protected]" New_Ssortingng = Split(sampleData) sName = New_Ssortingng(2) & " " & New_Ssortingng(3) Debug.Print sName 

Facile comme ça 🙂