chaine de caractere a separer

  • Initiateur de la discussion Initiateur de la discussion MAGIC93
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

MAGIC93

XLDnaute Nouveau
Bonjour et meilleurs voeux,

j ai dans une meme cellule (exemple A1) le nom + le prenom de la personne je veux les separer pour avoir le nom dans une cellule (exemple B1) et le prenom dans une autre cellule (exemple C1)

la fonction convertir me permet de separer 2 mots
par exemple separer philippe MULLER en 2 cellules une avec philippe et l autre avec muller

mais cette fonction n'est pas adaptée a ce que je veux faire car dasn les noms et prenom j ai plein de cas particulier
ce n'est pas tjs un mot pour le prenom et un mot pour le nom
exemple
Jean louis MICHEL (2 mots pour le prenom et 1 mot pour le nom)
Jose FERREIRA RUA (1 mot pour le prenom et 2 mots pour le nom)

la particularite de ma base c'est que mes prenoms sont tjs en minuscule sauf la premiere lettre et les nom de famille en majuscule

donc quelle technique utiliser pour separer le mots en majuscule des mots en minuscule (en tenant pas compte de la premiere lettre)


j ai cellule A1 : Philippe MULLER
je veux cellule B1 : Philippe et cellule C1 : MULLER

j ai cellule A2 : Jean louis MICHEL
je veux cellule B2 : Jean louis et cellule C2 : MICHEL

j ai cellule A3 : Jose FERREIRA RUA
je veux cellule B3 : Jose et cellule C3 : FERREIRA RUA

une idee ?

Magic93
 
Dernière édition:
Re : chaine de caractere a separer

Bonsoir Magic, bonsoir le forum,

je te propose la macro suivante :

Code:
Sub Macro1()
Dim cel As Range 'déclare la variable cel
Dim x As Integer 'décalre la variable x
 
'boucle 1 sir toutes les cellules éditées de la colonne A
For Each cel In Range("A1:A" & Range("A65536").End(xlUp).Row)
 
    'boucle 2 sur tous les caractères de la cellule
    For x = 1 To Len(cel.Value)
        'condition : si le caractère est une majuscule (voir code des caractères)
        If Asc(Mid(cel.Value, x, 1)) > 65 And Asc(Mid(cel.Value, x, 1)) < 91 Then
            cel.Offset(0, 1).Value = Left(cel.Value, x - 2) 'écrit le prénom en colonne B
            cel.Offset(0, 2).Value = Mid(cel.Value, x) 'écrit le nom en colonne C
            Exit For 'sort de la boucle 2
        End If 'fin de la condition
    Next x 'prochain caractère de la boucle 2
Next cel 'prochaine cellule de la boucle 1
End Sub
 
Re : chaine de caractere a separer

Bonjour apprement je me suis fais devancer par Robert pour la réponse néamoins voici le bout de code que j'ai réussi à concocter



Code:
Sub prenoms()
Dim a As Range

For Each a In Selection
longueur_chaine = a.Characters.Count
    Do While UCase(Mid(a, longueur_chaine)) = Mid(a, longueur_chaine)
    longueur_chaine = longueur_chaine - 1
    Loop

a.Offset(0, 1).Value = Mid(a, longueur_chaine + 2)
a.Value = Mid(a, 1, a.Characters.Count - longueur_chaine)

Next

End Sub

Xavier
 
Dernière édition:
Re : chaine de caractere a separer

C
Bonsoir à tous

Si je ne me suis pas trompé, et si tes noms sont formés au max de 3 termes, en utilisant les majuscules comme tu le dis, on peut aussi utiliser les formules, le nom étant en A1 :
en B1 : =SUBSTITUE(A1;D1;"")
en C1 : =SI(CODE(STXT(A1;CHERCHE(" ";A1)+1;1))<=90;DROITE(A1;NBCAR(A1)-CHERCHE(" ";A1));DROITE(A1;NBCAR(A1)-CHERCHE(" ";A1;CHERCHE(" ";A1)+1)))

On peut aussi faire une version avec la fonction gauche, mais bon, pour ce soir cela sera suffisant 😉

@ plus
 

Pièces jointes

Re : chaine de caractere a separer

Bonjour

J'ai exactement le même problème pour extraire des noms et prénoms (noms en majuscule et prénoms en "minuscule" enfin, plutôt format "nompropre").

Les macros proposées ont visiblement parfaitement répondu à la demande initiale, mais moi ça me renvoie toujours le message "Erreur d'exécution '5' :Argument ou appel de procédure incorrecte".
Y a rien à faire, je comprends rien 🙁

Que dois-je faire exactement ?

merci d'avance pour votre aide !!!
 
Re : chaine de caractere a separer

Bonjour

Merci déjà pour votre réponse.
Voici donc un extrait de mon fichier (plus de 320.000 lignes au total ! 😱)
Sur les premières lignes j'ai fait la manip à la main pour que l'on puisse imaginer le résultat que je souhaite.
Ce que je n'arrive pas à comprendre, c'est qu'il me semble qu'il s'agisse exactement de la même demande que ce post initial, mais pour moi, pas moyen, les macros sortent avec le message d'erreur sus-dit.
Merci beaucoup de votre aide en tout cas !!!!
 

Pièces jointes

Re : chaine de caractere a separer

bonjour le fil, choupi11,

voici une solution :
Code:
Public Function GetPrenom(zone As Range)
Application.Volatile
Dim tmpStr() As String, i As Long
    GetPrenom = ""
    tmpStr = Split(zone(1, 1).Text, " ")
    For i = LBound(tmpStr) To UBound(tmpStr)
        If WorksheetFunction.Proper(tmpStr(i)) = tmpStr(i) Then GetPrenom = GetPrenom & tmpStr(i) & " "
    Next i
    If Len(GetPrenom) <> 0 Then GetPrenom = Left(GetPrenom, Len(GetPrenom) - 1)
End Function

Public Function GetNom(zone As Range)
Application.Volatile
Dim tmpStr() As String, i As Long
    GetNom = ""
    tmpStr = Split(zone(1, 1).Text, " ")
    For i = LBound(tmpStr) To UBound(tmpStr)
        If UCase(tmpStr(i)) = tmpStr(i) Then GetNom = GetNom & tmpStr(i) & " "
    Next i
    If Len(GetNom) <> 0 Then GetNom = Left(GetNom, Len(GetNom) - 1)
End Function

a+
 
Re : chaine de caractere a separer

Bonjour,

Code:
Function Nom(chaine)
   Application.Volatile
   a = Split(chaine, " ")
   i = UBound(a)
   Do While UCase(a(i)) = a(i) And i > LBound(a):  i = i - 1: Loop
   For k = i + 1 To UBound(a): temp = temp & a(k) & " ": Next
   Nom = Trim(temp)
End Function

Function PreNom(chaine)
   Application.Volatile
   a = Split(chaine, " ")
   i = UBound(a)
   Do While UCase(a(i)) = a(i) And i > LBound(a):  i = i - 1: Loop
   For k = LBound(a) To i: temp = temp & a(k) & " ": Next
   PreNom = Trim(temp)
End Function

JB
 
Re : chaine de caractere a separer

Merci beaucoup pour ces deux réponses ! je suis impressionnée par votre rapidité, autant que par mon ignorance.....
euh... j'ai collé le code dans "module" de ma feuille de calcul, et il me demande le nom d'une macro... Argh, honte sur moi 🙁... je comprends rien

Merci des quelques minutes encore de votre temps pour m'expliquer où exactement je dois coller vos formules magiques, et comment je dois procéder aux "incantations" 😛

Laurence
 
Re : chaine de caractere a separer

Merci BOISGONTIER ! en effet, c'est plus instructif avec l'exemple. Je comprends la fonction dans la cellule ! parfait ! merci !

Je ne sais pas si ça peut aider, mais voici mon avis : la méthode de BOISGONTIER fonctionne parfaitement, à ceci près que j'aurai voulu conserver "LE RESPONSABLE" dans la seule cellule "Nom" et ne pas le spliter en "LE" dans Prénom et "RESPONSABLE" dans NOM... mais il n'y a pas mort d'homme, ce n'est pas très grave.
Pour info, la méthode de MROMAIN conserve "LE RESPONSABLE" dans la seule cellule "Nom" (ce que je préfère), mais ne fait rien apparaitre dans la colonne "Prenom" pour les prénoms composés incluant un "tiret" (ce qui ne m'arrange pas du tout !).

Merci encore pour tout, et surtout pour votre patience.
300.000 lignes à faire à la main, vous me sauvez la journée (voire la semaine 😀).

Merci
Laurence
 
Re : chaine de caractere a separer

re bonjour le fil,

à tester :
Code:
Public Function GetPrenom(zone As Range)
Application.Volatile
Dim tmpStr() As String, i As Long
    GetPrenom = ""
    tmpStr = Split(zone(1, 1).Text, " ")
    For i = LBound(tmpStr) To UBound(tmpStr)
        If UCase(tmpStr(i)) <> tmpStr(i) Then GetPrenom = GetPrenom & tmpStr(i) & " "
    Next i
    If Len(GetPrenom) <> 0 Then GetPrenom = Left(GetPrenom, Len(GetPrenom) - 1)
End Function

Public Function GetNom(zone As Range)
Application.Volatile
Dim tmpStr() As String, i As Long
    GetNom = ""
    tmpStr = Split(zone(1, 1).Text, " ")
    For i = LBound(tmpStr) To UBound(tmpStr)
        If UCase(tmpStr(i)) = tmpStr(i) Then GetNom = GetNom & tmpStr(i) & " "
    Next i
    If Len(GetNom) <> 0 Then GetNom = Left(GetNom, Len(GetNom) - 1)
End Function

a+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour