Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Info - Un autre petit exercice avec des expressions régulières

53 réponses
Avatar
Clément Marcotte
Bonjour,

Dans ma volonté d'expérimenter le plus possible les expressions
régulières, et devant la question qui revient quand même assez
souvent, j'ai bricolé la fonction suivante, laquelle va vous faire des
transformations selon les modèles suivants:

si vous avez un nom du genre "clément marcotte" dans une cellule, la
fonction va retourner "Clément Marcotte"

Si vous avec un nom du genre "jean-robert gauthier", la fonction va
retourner "Jean-Robert Gauthier"

Si vous avez un nom du genre "clément robert marcotte", la fonction va
retourner "Clément Robert Marcotte"

Si vous avez un nom du genre "clément robert de marcotte" la fonction
va retourner, ma paresse aidant, "Clément Robert De Marcotte"

Si vous avez un nom du genre "antoine de la rochefoucauld" (en
supposant que c'est bien Antoine), la fonction va retourner, toujours
ma paresse aidant, "Antoine De La Rochefoucauld"

Function PremiereLettreEnMajuscule(parametre As Variant) As Variant
Dim letexte As String, RE As Object, Matches As Object, match
letexte = CStr(parametre)
Set RE = New RegExp
'Recherche toutes les correspondances
RE.Global = True
'Ignore les différences majuscules/minuscules
RE.IgnoreCase = False
'Recherche le second prénom d'un prénom composé
RE.Pattern = "(-\w+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
'Met en majuscule l'initiale du second prénom
'd'un prénom composé
Mid(letexte, match.FirstIndex + 2, 1) = UCase(Mid(letexte,
match.FirstIndex + 2, 1))
Next
'Recherche les espaces et met en majuscules
'l'initiale du mot qui suit; même pour "de la"
'dans de la Rochefoucauld
RE.Pattern = "(\s\w+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
Mid(letexte, match.FirstIndex + 2, 1) = UCase(Mid(letexte,
match.FirstIndex + 2, 1))
Next
'met en majuscule, l'initiale du
'premier mot de la cellule
RE.Pattern = "(\w+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
Mid(letexte, 1, 1) = UCase(Mid(letexte, 1, 1))
Next
PremiereLettreEnMajuscule = letexte
End Function

10 réponses

1 2 3 4 5
Avatar
Patrick Fredin
Bonjour,

Tu sais que cette fonction existe dans Excel ?

NOMPROPRE ou PROPER.

Mais c'est toujours bon de chercher à inventer de nouvelles fonctions.

--
Patrick

"Clément Marcotte" wrote in message
news:
Bonjour,

Dans ma volonté d'expérimenter le plus possible les expressions
régulières, et devant la question qui revient quand même assez
souvent, j'ai bricolé la fonction suivante, laquelle va vous faire des
transformations selon les modèles suivants:

si vous avez un nom du genre "clément marcotte" dans une cellule, la
fonction va retourner "Clément Marcotte"

Si vous avec un nom du genre "jean-robert gauthier", la fonction va
retourner "Jean-Robert Gauthier"

Si vous avez un nom du genre "clément robert marcotte", la fonction va
retourner "Clément Robert Marcotte"

Si vous avez un nom du genre "clément robert de marcotte" la fonction
va retourner, ma paresse aidant, "Clément Robert De Marcotte"

Si vous avez un nom du genre "antoine de la rochefoucauld" (en
supposant que c'est bien Antoine), la fonction va retourner, toujours
ma paresse aidant, "Antoine De La Rochefoucauld"

Function PremiereLettreEnMajuscule(parametre As Variant) As Variant
Dim letexte As String, RE As Object, Matches As Object, match
letexte = CStr(parametre)
Set RE = New RegExp
'Recherche toutes les correspondances
RE.Global = True
'Ignore les différences majuscules/minuscules
RE.IgnoreCase = False
'Recherche le second prénom d'un prénom composé
RE.Pattern = "(-w+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
'Met en majuscule l'initiale du second prénom
'd'un prénom composé
Mid(letexte, match.FirstIndex + 2, 1) = UCase(Mid(letexte,
match.FirstIndex + 2, 1))
Next
'Recherche les espaces et met en majuscules
'l'initiale du mot qui suit; même pour "de la"
'dans de la Rochefoucauld
RE.Pattern = "(sw+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
Mid(letexte, match.FirstIndex + 2, 1) = UCase(Mid(letexte,
match.FirstIndex + 2, 1))
Next
'met en majuscule, l'initiale du
'premier mot de la cellule
RE.Pattern = "(w+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
Mid(letexte, 1, 1) = UCase(Mid(letexte, 1, 1))
Next
PremiereLettreEnMajuscule = letexte
End Function



Avatar
Clément Marcotte
Bonjour,

Tu sais que cette fonction existe dans Excel ?

NOMPROPRE ou PROPER.


Mais si, mais si ;-)

Dans une feuille de calcul, cette fonction ne sert pas à grand chose.
Pour une macro Excel, on peut sans doute s'en tirer avec
application.proper. Mais, comme je disais, c'est pour
l'expérimentation des expressions régulières.

D'un autre côté, VBA est devenu le langage de macros de plusieurs
applications, office et non Office, Microsoft et non Microsoft. VBA
n'a pas, en natif de fonction nompropre. Cette fonction peut être
facilement utilisée avec toute autre application qui supporte VBA,
sans devoir créer une aautre instance d'Excel, juste pour utiliser
nompropre.

Avatar
Patrick Fredin
Je suis absolument d'accord avec toi. Ne t'inquiète pas, je ne te prenais
pas pour un débutant dans Excel.

--
Patrick

"Clément Marcotte" wrote in message
news:
Bonjour,

Tu sais que cette fonction existe dans Excel ?

NOMPROPRE ou PROPER.


Mais si, mais si ;-)

Dans une feuille de calcul, cette fonction ne sert pas à grand chose.
Pour une macro Excel, on peut sans doute s'en tirer avec
application.proper. Mais, comme je disais, c'est pour
l'expérimentation des expressions régulières.

D'un autre côté, VBA est devenu le langage de macros de plusieurs
applications, office et non Office, Microsoft et non Microsoft. VBA
n'a pas, en natif de fonction nompropre. Cette fonction peut être
facilement utilisée avec toute autre application qui supporte VBA,
sans devoir créer une aautre instance d'Excel, juste pour utiliser
nompropre.





Avatar
jps
même que chez moi, je ne parviens pas à la faire marcher la Function de
clément....que doit-on mettre dans paramètre? la référence de la cellule qui
contient le texte à modifier? dans ce cas, j'ai erreur de compilation et
dans VBE, le mot NewRegExp qui se drape d'un joli bleu.....but
whyyyyyyyy????
jps

"Patrick Fredin" a écrit dans le
message de news:
Bonjour,

Tu sais que cette fonction existe dans Excel ?

NOMPROPRE ou PROPER.

Mais c'est toujours bon de chercher à inventer de nouvelles fonctions.

--
Patrick

"Clément Marcotte" wrote in message
news:
Bonjour,

Dans ma volonté d'expérimenter le plus possible les expressions
régulières, et devant la question qui revient quand même assez
souvent, j'ai bricolé la fonction suivante, laquelle va vous faire des
transformations selon les modèles suivants:

si vous avez un nom du genre "clément marcotte" dans une cellule, la
fonction va retourner "Clément Marcotte"

Si vous avec un nom du genre "jean-robert gauthier", la fonction va
retourner "Jean-Robert Gauthier"

Si vous avez un nom du genre "clément robert marcotte", la fonction va
retourner "Clément Robert Marcotte"

Si vous avez un nom du genre "clément robert de marcotte" la fonction
va retourner, ma paresse aidant, "Clément Robert De Marcotte"

Si vous avez un nom du genre "antoine de la rochefoucauld" (en
supposant que c'est bien Antoine), la fonction va retourner, toujours
ma paresse aidant, "Antoine De La Rochefoucauld"

Function PremiereLettreEnMajuscule(parametre As Variant) As Variant
Dim letexte As String, RE As Object, Matches As Object, match
letexte = CStr(parametre)
Set RE = New RegExp
'Recherche toutes les correspondances
RE.Global = True
'Ignore les différences majuscules/minuscules
RE.IgnoreCase = False
'Recherche le second prénom d'un prénom composé
RE.Pattern = "(-w+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
'Met en majuscule l'initiale du second prénom
'd'un prénom composé
Mid(letexte, match.FirstIndex + 2, 1) = UCase(Mid(letexte,
match.FirstIndex + 2, 1))
Next
'Recherche les espaces et met en majuscules
'l'initiale du mot qui suit; même pour "de la"
'dans de la Rochefoucauld
RE.Pattern = "(sw+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
Mid(letexte, match.FirstIndex + 2, 1) = UCase(Mid(letexte,
match.FirstIndex + 2, 1))
Next
'met en majuscule, l'initiale du
'premier mot de la cellule
RE.Pattern = "(w+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
Mid(letexte, 1, 1) = UCase(Mid(letexte, 1, 1))
Next
PremiereLettreEnMajuscule = letexte
End Function







Avatar
Daniel.M
Salut Clément,

Depuis Excel 2000 (je crois), il y a StrConv(LeTexte, vbProperCase) qui permet
de mettre la première lettre en majuscule mais ce n'est pas un traitement qui
traite adéquatement les O'Connor de ce monde.

Ton exercice est d'autant plus apprécié qu'il permet de mettre en lumière deux
philosophies dans l'application des expressions régulières :
1.Il y a les tenants de l'approche qui consiste à 'tout mettre dans les
patterns' de façon à minimiser les appels à plusieurs RE.Execute. Ainsi, un seul
appel à RE.Execute permet de compartimenter le texte de la façon désirée.
2.D'autre part, il y a ceux qui prétendent que plusieurs boucles n'ont jamais
tué personne et qu'on y gagner en lisibilité

J'appartiens à la première école ;-)

Si tu es intéressé, fais-moi signe et je copierai une version qui fait un seul
appel à RE.Execute (le pattern est à l'avenant, mais j'ai annoncé mes
couleurs...) et qui traite les O'Connor et McDonald avec respect :-)
Elle utilise aussi un peu les SubMatches; un aspect intéressant dans le
traitement des expressions régulières.

Salutations,

Daniel M.

"Clément Marcotte" wrote in message
news:
Bonjour,

Dans ma volonté d'expérimenter le plus possible les expressions
régulières, et devant la question qui revient quand même assez
souvent, j'ai bricolé la fonction suivante, laquelle va vous faire des
transformations selon les modèles suivants:

si vous avez un nom du genre "clément marcotte" dans une cellule, la
fonction va retourner "Clément Marcotte"

Si vous avec un nom du genre "jean-robert gauthier", la fonction va
retourner "Jean-Robert Gauthier"

Si vous avez un nom du genre "clément robert marcotte", la fonction va
retourner "Clément Robert Marcotte"

Si vous avez un nom du genre "clément robert de marcotte" la fonction
va retourner, ma paresse aidant, "Clément Robert De Marcotte"

Si vous avez un nom du genre "antoine de la rochefoucauld" (en
supposant que c'est bien Antoine), la fonction va retourner, toujours
ma paresse aidant, "Antoine De La Rochefoucauld"

Function PremiereLettreEnMajuscule(parametre As Variant) As Variant
Dim letexte As String, RE As Object, Matches As Object, match
letexte = CStr(parametre)
Set RE = New RegExp
'Recherche toutes les correspondances
RE.Global = True
'Ignore les différences majuscules/minuscules
RE.IgnoreCase = False
'Recherche le second prénom d'un prénom composé
RE.Pattern = "(-w+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
'Met en majuscule l'initiale du second prénom
'd'un prénom composé
Mid(letexte, match.FirstIndex + 2, 1) = UCase(Mid(letexte,
match.FirstIndex + 2, 1))
Next
'Recherche les espaces et met en majuscules
'l'initiale du mot qui suit; même pour "de la"
'dans de la Rochefoucauld
RE.Pattern = "(sw+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
Mid(letexte, match.FirstIndex + 2, 1) = UCase(Mid(letexte,
match.FirstIndex + 2, 1))
Next
'met en majuscule, l'initiale du
'premier mot de la cellule
RE.Pattern = "(w+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
Mid(letexte, 1, 1) = UCase(Mid(letexte, 1, 1))
Next
PremiereLettreEnMajuscule = letexte
End Function



Avatar
Daniel.M
Bonjour JPS,

"jps" wrote in message
news:
même que chez moi, je ne parviens pas à la faire marcher la Function de
clément....que doit-on mettre dans paramètre? la référence de la cellule qui
contient le texte à modifier?


Oui. Exemple, en B1
=PremiereLettreEnMajuscule(A1)

dans ce cas, j'ai erreur de compilation et
dans VBE, le mot NewRegExp qui se drape d'un joli bleu.....but


VBE. Menu Outils/Références, coche la libraire Microsoft VBScript Regular
Expressions 5.x

Salutations,

Daniel M.

Avatar
jps
waouh!!! merci daniel
pourrait quand même le dire ce joalvert de clément.....
en tous cas, une fois cette références cochée (mais que j'aurais bien été
incapable d'aller chercher tout seul), c'est une affaire qui tourne...
et quand notre québécois saura qu'en mettant seulement "jps" en A1, sa
Function m'a retourné "Jean Paul Sabatier Des Granges Basses De Chatillon
D'Azergues En Beaujolais MVP HS"...
ça correspond très exactement au tatouage que j'ai sur le torse : en
position de repos, c'est "jps" et quand je gonfle mes pectoraux, c'est ce
que la Function m'a retourné....
jps

"Daniel.M" a écrit dans le message de
news:%
Bonjour JPS,

"jps" wrote in message
news:
même que chez moi, je ne parviens pas à la faire marcher la Function de
clément....que doit-on mettre dans paramètre? la référence de la cellule
qui


contient le texte à modifier?


Oui. Exemple, en B1
=PremiereLettreEnMajuscule(A1)

dans ce cas, j'ai erreur de compilation et
dans VBE, le mot NewRegExp qui se drape d'un joli bleu.....but


VBE. Menu Outils/Références, coche la libraire Microsoft VBScript Regular
Expressions 5.x

Salutations,

Daniel M.





Avatar
jps
juste un mot, clément
je pense qu'il est inexact de mettre une majuscule à la particule "de"...
jps

"Clément Marcotte" a écrit dans le message
de news:
Bonjour,

Dans ma volonté d'expérimenter le plus possible les expressions
régulières, et devant la question qui revient quand même assez
souvent, j'ai bricolé la fonction suivante, laquelle va vous faire des
transformations selon les modèles suivants:

si vous avez un nom du genre "clément marcotte" dans une cellule, la
fonction va retourner "Clément Marcotte"

Si vous avec un nom du genre "jean-robert gauthier", la fonction va
retourner "Jean-Robert Gauthier"

Si vous avez un nom du genre "clément robert marcotte", la fonction va
retourner "Clément Robert Marcotte"

Si vous avez un nom du genre "clément robert de marcotte" la fonction
va retourner, ma paresse aidant, "Clément Robert De Marcotte"

Si vous avez un nom du genre "antoine de la rochefoucauld" (en
supposant que c'est bien Antoine), la fonction va retourner, toujours
ma paresse aidant, "Antoine De La Rochefoucauld"

Function PremiereLettreEnMajuscule(parametre As Variant) As Variant
Dim letexte As String, RE As Object, Matches As Object, match
letexte = CStr(parametre)
Set RE = New RegExp
'Recherche toutes les correspondances
RE.Global = True
'Ignore les différences majuscules/minuscules
RE.IgnoreCase = False
'Recherche le second prénom d'un prénom composé
RE.Pattern = "(-w+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
'Met en majuscule l'initiale du second prénom
'd'un prénom composé
Mid(letexte, match.FirstIndex + 2, 1) = UCase(Mid(letexte,
match.FirstIndex + 2, 1))
Next
'Recherche les espaces et met en majuscules
'l'initiale du mot qui suit; même pour "de la"
'dans de la Rochefoucauld
RE.Pattern = "(sw+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
Mid(letexte, match.FirstIndex + 2, 1) = UCase(Mid(letexte,
match.FirstIndex + 2, 1))
Next
'met en majuscule, l'initiale du
'premier mot de la cellule
RE.Pattern = "(w+)"
Set Matches = RE.Execute(letexte)
For Each match In Matches
Mid(letexte, 1, 1) = UCase(Mid(letexte, 1, 1))
Next
PremiereLettreEnMajuscule = letexte
End Function



Avatar
Eric
"jps" écrivait

et quand notre québécois saura qu'en mettant seulement "jps"
en A1, sa Function m'a retourné "Jean Paul Sabatier Des Granges Basses
De Chatillon D'Azergues En Beaujolais MVP HS"...
ça correspond très exactement au tatouage que j'ai sur le torse : en
position de repos, c'est "jps" et quand je gonfle mes pectoraux, c'est
ce que la Function m'a retourné....



Ah grand Age, quand tu nous tiens !!!
Suis pas sûr que les pectoraux gonflent encore ... mais la voix
rocailleuse, apparemment à lire le NG ;-))

Amicalement

Un autre papy

Eric

Avatar
Clément Marcotte
Bonjour,

waouh!!! merci daniel
pourrait quand même le dire ce joalvert de clément.....
en tous cas, une fois cette références cochée (mais que j'aurais
bien été

incapable d'aller chercher tout seul), c'est une affaire qui
tourne...


Mille excuses, j'ai oublié.

1 2 3 4 5