Extraire noms et prénoms d'une chaine de texte sans règle logique évidente

Bonsoir,

J'ai une série de lignes de doublets de type Qualité - NOM- Prénom - Qualité - NOM - Prénom que je souhaite pouvoir dissocier et assigner à des variables.
Jusque là rien de bien sorcier... je récupére les qualités sans problème.

Mais là où je sèche c'est que je peine à trouver une règle pour isoler mes noms et prénoms.
Les noms sont en majuscules, c'était une piste évidente de récupération, mais certains patronymes à particules ne le sont pas complètement, ex: "de LA PARTICULE"
Les prénoms sont tous sur le même modèle (première lettre en majuscule, le reste en minuscule) mais ce qui pose difficulté c'est la présence de certains prénoms composés sans tiret, ex: "Jean Baptiste".

Comment récupérer proprement mes qualite1, nom1, prenom1, qualité2, nom2, prenom2 ?

Est-ce même seulement possible ? J'ai tourné autour de plusieurs solutions (la casse, compter les espaces, etc.) mais je cale.

Merci à tou(te)s celles et ceux qui voudront bien se pencher sur mon fichier anonymisé pour tenter de m'aider!

Bonsoir,

Voilà raccourci, Ctrl+E et la fonction concaténer "" pour espace entre les noms

Bien à toi

Bonjour à tous,

une autre façon ;

bonsoir,

une autre autre façon,

Bonjour à tous

Une version PowerQuery, peut-être simplifiable, qui découpe bien en Titre, Nom et Prénom X2

Bonjour guillaumeplougoulm , à tous ,

Une autre fonction personnalisée VBA à trois arguments : =TitreNomPrenom(monTexte, Lequel, Quoi) où :

  • monTexte est le texte source
  • Lequel est le rang de l’individu dont on veut extraire les informations (1 => première personne, 2 => 2ème personne, N => Nème personne...)
  • Quoi est l'information à extraire (1 => titre, 2 => Nom, 3 => Prénom)

Le code de la fonction dans module1:

Function TitreNomPrenom$(monTexte$, Lequel&, Quoi&)
Dim x$, nbr&, t, res, y, i&, j&, k&, n&

   If Quoi < 1 Or Quoi > 3 Then Exit Function
   x = Application.Trim(Replace(Replace(monTexte, "M. ", Chr(255) & "M. "), "Mme ", Chr(255) & "Mme "))
   If x = "" Then Exit Function
   nbr = Len(x) - Len(Replace(x, Chr(255), ""))
   If nbr < 1 Then Exit Function
   If Lequel < 1 Or Lequel > nbr Then Exit Function
   t = Split(Trim(x), Chr(255)): ReDim res(1 To 3 * nbr)
   For i = 1 To UBound(t)
      y = Split(Trim(t(i)))
      res(3 * n + 1) = y(0)
      For j = UBound(y) To 1 Step -1
         If UCase(y(j)) = y(j) Then Exit For
      Next j
      If j >= 1 Then
         For k = 1 To j: res(3 * n + 2) = res(3 * n + 2) & " " & y(k): Next k
         For k = j + 1 To UBound(y): res(3 * n + 3) = res(3 * n + 3) & " " & y(k): Next k
         res(3 * n + 2) = Trim(res(3 * n + 2)): res(3 * n + 3) = Trim(res(3 * n + 3))
      End If
      n = n + 1
   Next i
   TitreNomPrenom = res(3 * (Lequel - 1) + Quoi)
End Function

Bonjour à tous,

Merci à tous pour votre intérêt et pour votre aide!

Toutes vos approches sont intéressantes et je vais regarder cela de près.

Je retiens particulièrement les réponses de BsAlv et de Jeune Fraise qui, à première vue, cochent toutes les cases (VBA, séparation de Q-N-P-Q2-N2-P2, conservation des particules, conservation des prénom composés sans tiret).

Ca va me permettre d'avancer, j'étais bien coincé merci!

Avec un peu de chance en me plongeant dans votre code je réussirai à comprendre la logique pour progresser mais dans tous les cas, vous me donnez déjà le résultat qui va me permettre d'avancer!

C'est parfait!

Bon week-end,

Guillaume

Rechercher des sujets similaires à "extraire noms prenoms chaine texte regle logique evidente"