souci avec les prénoms

Sylvie64

XLDnaute Occasionnel
Bonjour,

j'ai un souci avec les prénoms, quand je mets mes formules tout va bien, mais le
problème c'est quand il ni a pas de majuscule au prénom et bien la dernière lettre du nom
ce mets avec les prénoms (voir en PJ, colonne E)

Y a t-il une solution ?
Se sont des fichiers que j'ai repris et cela me pose un vrai problème !!!

Merci pour votre aide.

Sylvie
 

JNP

XLDnaute Barbatruc
Re : souci avec les prénoms

Re :),
JNP
Ne reste plus que ce pauvre
illisible Fils
qui resiste
Il ne peut que resister, il n'est pas en majuscule :p...
De même que le N car 1 seule majuscule :D.
Si on veux vraiment faire tomber le petit village gaulois
Code:
"(^(([-A-ZÈÉÊËÄÇÆŒ\.\?]{2,}) ?)+)|(\b[-A-ZÈÉÊËÄÇÆŒ]\b)|(Illisible)"
fonctionnera :eek:.
En attendant d'autre cas particuliers :rolleyes:...
J'aimerais savoir quelle solution Sylvie a retenu :).
Bonne journée :cool:
 

CISCO

XLDnaute Barbatruc
Re : souci avec les prénoms

Bonjour à tous

Dans le cas des noms composés de trois parties, il faut utiliser la formule du fichier ci-joint.

J'espère qu'il ni a pas de noms composés de 5 ou 6 parties :rolleyes:

@ plus
 

Pièces jointes

  • Sylvie64 2.xlsm
    20.4 KB · Affichages: 144

Magic_Doctor

XLDnaute Barbatruc
Bonsoir,

M'exerçant avec les expressions régulières, je m'immisce dans ce fil.
J'ai réussi à résoudre en grande partie le problème de Sylvie64 avec des expressions régulières.
J'ai laissé tomber les "...", "?" et autres "illisible", mais les rajouter ne devrait pas poser grand problème.
Dans la chaîne il peut y avoir un nom composé (en MAJUSCULES) "long comme un trombonne" (comme dirait Boris Vian) suivi d'un nombre quelconque de prénoms (tous commençant par une majuscule suivie de minuscules).
Peut-être plus aisé à manipuler que d'interminables formules intriquées qui finissent par être comprises que par celui qui les a rédigées.
VB:
Option Explicit
Dim regEx As Object 'mémorisation pour gagner du temps dans la création de l'objet ("VBScript.RegExp") 'job75

Function DissectNP(NP As String, x As Byte) As String
'- NP : la chaîne contenant le ou les NOMS + le ou les prénoms
'- x : si x = 1 --> NOMS
'      si x = 2 --> Prénoms
'Magic_Doctor

Dim strPattern As String, LongueurNBNomsMaj As Integer, LongueurNBNomsFirstMaj As Integer
Dim PatternNoms As String, PatternPreNoms As String
   
    Set regEx = CreateObject("VBScript.RegExp")

    LongueurNBNomsMaj = NB_MotsMmFirstM(NP, 1, 2) 'somme des longueurs de tous les NOMS cherchés avec les espaces qui les sépare
    LongueurNBNomsFirstMaj = NB_MotsMmFirstM(NP, 3, 2) 'somme des longueurs de tous les Prénoms cherchés avec les espaces qui les sépare
   
    PatternNoms = "([A-ZÈÉÊËÄÇÆŒÁÍÓÚÂÊÎÔÛÄËÏÜÑ\.\-\?\s]{" & LongueurNBNomsMaj + 1 & "})" 'pattern des NOMS
    PatternPreNoms = "([a-zçæéèíóúâêîôûäëïöüñA-ZÈÉÊËÄÇÆŒÁÍÓÚÂÊÎÔÛÄËÏÜÑ\.\-\?\s]{" & LongueurNBNomsFirstMaj & "})" 'pattern des Prénoms
    strPattern = PatternNoms & PatternPreNoms
   
    With regEx
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .Pattern = strPattern
    End With
       
    If regEx.test(NP) Then
        Select Case x
            Case 1 'NOMS
                DissectNP = regEx.Replace(NP, "$1")
            Case 2 'Prénoms
                DissectNP = regEx.Replace(NP, "$2")
        End Select
    Else
        DissectNP = "Not matched"
    End If
End Function
'

Function NB_MotsMmFirstM(phrase As String, x As Byte, Optional longueur As Byte = 0) As Integer
'Renvoie le nombre de mots, en MAJUSCULES ou en minuscules ou commençant par une MAJUSCULE suivie de minuscules, d'une phrase
'Magic_Doctor
'- phrase : la chaîne de caractères étudiée
'- x :  si = 1 --> mots en MAJUSCULES
'      si = 2 --> mots en minuscules
'      si = 3 --> mots commençant par une MAJUSCULE suivie de minuscules
'- longueur : optionnel: "0" par défaut ---> nombre de types de mots cherchés
'                           si longueur = 1 ---> somme de la longueur de tous les types de mots cherchés (sans espaces)
'                           si longueur = 2 ---> somme de la longueur de tous les types de mots cherchés (avec espaces)

Dim tmp, nbmots As Integer, mot() As String, i As Integer, lemot As String, n As Byte, nbmm As Integer
Dim longword As Byte, longallwords As Byte

    tmp = Split(phrase, " ")
    nbmots = UBound(tmp) + 1 'nombre total de mots (quels qu'ils soient) dans la phrase
    mot = Split(phrase)
   
    For i = 1 To nbmots
        lemot = mot(i - 1) 'Option Base 0
        Select Case x
            Case 1 'mots en MAJUSCULES
                n = IIf(UCase(lemot) = lemot, 1, 0)
                longword = IIf(UCase(lemot) = lemot, Len(lemot), 0)
            Case 2 'mots en minuscules
                n = IIf(LCase(lemot) = lemot, 1, 0)
                longword = IIf(LCase(lemot) = lemot, Len(lemot), 0)
            Case 3 'mots commençant par une MAJUSCULE suivie de minuscules
                n = IIf(Left(lemot, 1) = UCase(Left(lemot, 1)) And Mid(lemot, 2, 1) = LCase(Mid(lemot, 2, 1)), 1, 0)
                longword = IIf(Left(lemot, 1) = UCase(Left(lemot, 1)) And Mid(lemot, 2, 1) = LCase(Mid(lemot, 2, 1)), Len(lemot), 0)
        End Select
        nbmm = nbmm + n 'nombre de mots
        longallwords = longallwords + longword 'somme des longueurs de tous les mots cherchés
    Next
   
    NB_MotsMmFirstM = IIf(longueur = 0, nbmm, IIf(longueur = 1, longallwords, longallwords + nbmm - 1))
End Function
 

Pièces jointes

  • Sylvie64(Forum1).xlsm
    26.7 KB · Affichages: 19
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour le fil, le forum

@Magic_Doctor
C'est avec plaisir que je vois que tu mets le nez dans RegExp ;)
Bienvenue au club.

Du coup, ci-dessous un petit Kdo en guise d'apéro du dimanche midi ;)
(fournie avec la poussière de mes archives)
VB:
Sub test()
Dim Chaine$
Chaine = "Magic se Plonge Dans REGEXP COOL!"
MsgBox CountUppercaseWords(Chaine) 'test Ok
MsgBox CountProperWords(Chaine) ' test Ok
MsgBox CountWords(Chaine) ' test Ok
MsgBox CountWords(Chaine, False) ' test Ok
End Sub
Function CountUppercaseWords(Expression As String) As Integer
    Dim vArr() As String
    Dim I%, Count%, Mot$
    vArr = Split(Expression)
    Count = 0
    For I = LBound(vArr) To UBound(vArr)
        Mot = vArr(I)
        If Mot = UCase(Mot) And Len(Mot) >= 2 Then
            Count = Count + 1
        End If
    Next
    CountUppercaseWords = Count
End Function
Function CountProperWords(Expression As String) As Integer
    Dim vArr() As String
    Dim I%, Count%, Mot$
    vArr = Split(Expression)
    Count = 0
    For I = LBound(vArr) To UBound(vArr)
        Mot = vArr(I)
        If Mot = StrConv(Mot, vbProperCase) And Len(Mot) >= 2 Then
            Count = Count + 1
        End If
    Next
    CountProperWords = Count
End Function
Function CountWords(Expression As String, Optional Casse As Boolean = True) As Integer
    Dim vArr() As String
    Dim I%, Count%, Mot$
    vArr = Split(Expression)
    Count = 0
    For I = LBound(vArr) To UBound(vArr)
        Mot = vArr(I)
        If Mot = IIf(Casse, UCase(Mot), StrConv(Mot, vbProperCase)) And Len(Mot) >= 2 Then
            Count = Count + 1
        End If
    Next
    CountWords = Count
End Function
 

Magic_Doctor

XLDnaute Barbatruc
Re,

Merci Staple pour tes fonctions, moi qui adore les fonctions. C'est tellement plus simple d'utiliser une fonction qu'une intrication de formules. Et quoi qu'en penseront certains, la puissance des UDF est sans commune mesure avec celle des formules intriquées. Mais, attention, je ne dénigre aucunement les formules, puisqu il m'arrive assez souvent de les utiliser. Mais mes intrications restent toujours calmes...
Quant aux "RegExp", certainement l'un des outils de VBA (bien que cette "méthodologie" soit issue, si j'ai bien compris, d'autres langages) les plus intéressants que j'ai pu découvrir depuis longtemps. Elles sont encore trop méconnues. Elles permettent de résoudre fort élégamment des problèmes simples ou très sophistiqués de chaînes.
Prenons l'exemple du problème de Sylvie64 exposé dans ce fil. Regardons la formule intriquée épatante de CISCO pour pouvoir récupérer des NOMS composés comprenant 3 éléments. Le quidam qui essaie de la déchiffrer commence à y perdre son latin. Maintenant imaginons une formule qui puisse récupérer des NOMS composés constitués de 6 éléments (ce qui peut se voir chez certains aristocrates quand ils "étalent" leur nom au complet, mais qui est relativement fréquent chez les hispaniques de pure souche, où vient aussi s'intercaler dans le nom les références de la mère...), et bien là, je pense qu'on sombre dans les abysses de la schizophrénie. Alors qu'avec les expressions régulières, clairement, concisément et en un tournemain (sans passer par 36 boucles...) , le problème est réglé pour des NOMS composés constitués, pourquoi pas, d'une infinité d'éléments.
Mais le truc c'est de trouver le bon "Pattern", ce qui est loin d'être toujours évident.
On s'aperçoit rapidement que fatalement, à un moment ou à un autre, le bon programmateur a intérêt à utiliser les RegExp quand c'est nécessaire.
Dommage que ça ne passionne pas davantage la foule excelienne...

PS : il semblerait qu'on ne peut pas les utiliser sur Mac. Je comprends encore mieux pourquoi les "bêtes" de programmation en VBA préfèrent définitivement travailler sur Windows.
Le problème majeur du Mac (en dépit que c'est bô, de bonne qualité, fiable, avec moins de risques de chopper un virus...), c'est que c'est un monde qui a toujours été fermé. Donc limité. C'est le monde Mac ! On y adhère ou pas... Et pourtant j'en ai eu un il y a fort longtemps. Et en Uruguay, ils vous attendent avec un fusil chargé de balles doum-doum : 200 US$ un chargeur pour le Mac de ma femme... :cool: Ils sont bons... :p
 
Dernière édition:

CISCO

XLDnaute Barbatruc
Bonjour à tous, bonjour Magic_Doctor, Staple1600

@ Magic_Doctor : Le VBA est nettement plus puissant que les formules... et possède certaines finesses que je ne maitrise absolument pas. Je fais avec mes compétences du moment... Actuellement, entre Revit, et Pléiades... j'ai de quoi faire. Le VBA, j'aimerai bien, mais les journées n'ont que 24 h...

@plus
 

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, le forum

Petites précisions en passant.
RegExp n'est pas forcément liè à Windows
et RegExp "n'appartient" pas à VBA.
Mais on peut utiliser RegExp dans VBA en cochant cette référence:
Microsoft VBScript Regular Expressions 5.5
C'est donc une librairie Microsoft.
Normal donc qu'on ne la retrouve pas chez la concurrence. ;)

Et pour ceux qui préfèrent utiliser un Excel non bancal, voilà qui finira de les convaincre qu'Excel se porte mieux sur un PC ;)
https://www.rondebruin.nl/mac/mac027.htm
 

Magic_Doctor

XLDnaute Barbatruc
Bonjour,

Je reviens sur ce fil. Après tout, c'est intéressant.
Quelques questions pour ceux qui manient bien RegExp.
Dans mes recherches, à droite, à gauche, j'ai découvert que pour le pattern correspondant à n'importe quelle lettre en MAJUSCULE, plutôt que d'écrire l'interminable :
[A-ZÈÉÊËÄÇÆŒÁÍÓÚÂÊÎÔÛÄËÏÜÑ]
plus concésiment on peut écrire :
[A-ZÀ-ÿ] qui tient compte en plus de plein d'autres lettres.
Pour mieux comprendre cette histoire, ce lien peut être intéressant :

https://montrezvous.net/developpement-web/controles-de-formulaires-en-html5.html

Mais si je suis la logique, pour des lettres uniquement en MAJUSCULES, on devrait plutôt écrire :
[A-ZÀ-Ÿ]
même si dans le tableau du lien on ne voit curieusement pas la lettre "Ÿ".
Or, que je mette [A-ZÀ-ÿ] ou [A-ZÀ-Ÿ], seuls les mots en MAJUSCULES sont reconnus.
Toujours en suivant la logique du tableau, pour [A-ZÀ-ÿ], le nom (bidon) GARANDANä devrait être reconnu, puisque "ä" est inclus dans l'ensemble "À-ÿ". Et bien non !
Bizarre...
Ensuite, si je veux que les traits d'union soient reconnu, j'écris : [A-ZÀ-ÿ-] --> ça marche
Mais en suivant la logique du tableau, comme "-" est considéré comme un caractère spécial, on devrait écrire : [A-ZÀ-ÿ\-] --> ça marche aussi
Bizarre...
Maintenant, puisqu'il peut s'agir de noms composés avec un espace entre les différentes unités du nom, j'écris : [A-ZÀ-ÿ-\s] --> ça marche
Enfin, pour tenir compte d'un maximum de nom occidentaux, il ne faut pas oublier les Irlandais : O'CONNOR | O'BRIAN...
Donc je veux que l'apostrophe soit reconnue. J'écris logiquement : [A-ZÀ-ÿ-'\s] --> ça ne marche pas !
Bizarre...
Et j'ai pourtant essayé toutes les combinaisons, sauf une : la bonne !
Quelqu'un la connaîtrait-il ?
 

Pièces jointes

  • Sylvie64(Forum3).xlsm
    25.3 KB · Affichages: 15

Staple1600

XLDnaute Barbatruc
Bonsoir le fil, le forum

@Magic_Doctor
En guise de coup main
VB:
Sub test()
Chaine = "STAPLE1600 aka Jm XLDnaute depuis l'AN 2005"
MsgBox XMAJS(Chaine)
MsgBox XMAJS("toto titi GARANDANä")
End Sub
Private Function XMAJS(ByVal str$) As String
With CreateObject("VBScript.RegExp")
.Pattern = "[^A-ZÀ-ÿ]": .Global = -1: XMAJS = .Replace(str, "")
End With
End Function
 

Discussions similaires

Statistiques des forums

Discussions
312 195
Messages
2 086 083
Membres
103 114
dernier inscrit
sylvainb6969