OVH Cloud OVH Cloud

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

2 3 4 5 6
Avatar
Modeste
Bonsour® Daniel.M,

-----Message d'origine-----
GD,===
Je ne vois pas le problème avec O'Connors
(que par ailleurs NOMPROPRE traitait correctement ;o))))


il n'y a pas de problême !!! ;o))
c'était juste pour faire mousser le pestou !!!
;o)))

Avatar
Modeste
Bonsour ®, Jean-Paul
-----Message d'origine-----
:-)))))
sacré daniel
je me charge de la vendre dans le monde entier ; rassure-
toi, je me contenterai, en guise de rémunération,de

conserver le fruit des dix premières ventes (ce chiffre
n'est pas un hasard : c'est le barême applicable pour ce
genre d'action commerciale,n'est-ce pas FS?)...

"Monde Entier" ???
méfie-toi quand même de ne pas refaire le coût? (Coup)
du "recordatorio",
soigne tes acquintances Vietnamiennes ou Laotiennes !!!!

as-tu vérifié le fonctionnement pour les :
n'Guyen et Min t'Hueng etc... ????
;o)))

Avatar
twinley
Bonjour

Bravo Clément, bravo à tous, c'est impressionnant quand le MPFE
phosphore...j'avais jamais vécu cela en direct.

D'ailleurs à propos de phosphore, il faudra prévoir une légère
adaptation dès que la Turquie entrera en Europe !

à+twinley


jps wrote:
je me lève en effet, clément, et c'est toi qui à ton réveil, trouveras ces
nouveaux remerciements pour ces commentaires...
merci encore
jps

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

Bonjour,

Au moment où tu te lèves, je suis sur le point d'aller me coucher à
mon tour. Finalement, tu as le choix entre deux approches.

1) La procédure finale de Daniel est plus "compacte" et peut-être plus
efficace, mais, l'utilisation de la formule de feuille de calcul
"match" la rend difficilement utilisable en dehors d'Excel.

2) D'autre part, la procédure initiale de Daniel que j'ai modifiée est
plus longue et peut-être un peu moins performante. Mais elle reste
plus facilement exportable à l'extérieur d'Excel.

Donc conclusion, le choix final dépend un peu des besoins de
l'utilisateur. Mais si tu restes dans Excel, la procédure finale de
Daniel est joliment astucieuse.








Avatar
jps
:-))))))
jps

"Modeste" a écrit dans le message de
news:a9ef01c4d6bc$84f6f7b0$
Bonsour ®, Jean-Paul
-----Message d'origine-----
:-)))))
sacré daniel
je me charge de la vendre dans le monde entier ; rassure-
toi, je me contenterai, en guise de rémunération,de

conserver le fruit des dix premières ventes (ce chiffre
n'est pas un hasard : c'est le barême applicable pour ce
genre d'action commerciale,n'est-ce pas FS?)...

"Monde Entier" ???
méfie-toi quand même de ne pas refaire le coût? (Coup)
du "recordatorio",
soigne tes acquintances Vietnamiennes ou Laotiennes !!!!

as-tu vérifié le fonctionnement pour les :
n'Guyen et Min t'Hueng etc... ????
;o)))

Avatar
jps
et dès que le mpfe ne sera plus qu'un vulgaire champ de patates aussi...
jps

"twinley" a écrit dans le message de
news:
D'ailleurs à propos de phosphore, il faudra prévoir une légère
adaptation dès que la Turquie entrera en Europe !


Avatar
Jacquouille
Salut la foule
J'admire, une fois de plus le nombrilisme des Français lorsqu'ils s'écrient
"au diable les Van, les Von et autres..."
Avez-vous seulement pensé à moi?
jacques-eugène de la rue des bruyères de beaufays ????
Egoïstes, va ! -))))
Ceci dit, lusage du tableau me parait plus simple et plus exportable dans
les autres pays européens NON français.
Encore un grand bravo pour ce travail en commun.

--
Bien amicalmement,
Vivement conseillé >> http://www.excelabo.net
Jacquouille.

"jps" a écrit dans le message de
news:
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
twinley
:-D

jps wrote:
et dès que le mpfe ne sera plus qu'un vulgaire champ de patates aussi...
jps

"twinley" a écrit dans le message de
news:

D'ailleurs à propos de phosphore, il faudra prévoir une légère
adaptation dès que la Turquie entrera en Europe !






Avatar
jps wrote:
et dès que le mpfe ne sera plus qu'un vulgaire champ
de patates aussi...



;o)))
Des mauvaises langues oseraient même : "chant de patate"
mais ce serait de mauvaises langues...
JPS, tes exhibitions vocales ne sont jamais vulgaires !

et puis de toutes façons, je serai épargné cette fois-ci !
ce ne sera pas le cas de Bobby !!!
;o)))
® © ¿

-----Message d'origine-----

:-D

jps

"twinley" a écrit dans le
message de


news:

D'ailleurs à propos de phosphore, il faudra prévoir
une légère



adaptation dès que la Turquie entrera en Europe !



.






Avatar
Daniel.M
Salut Clément, JPS, GD

1. J'ai fait une erreur dans l'indice du SubMatches (doit être 0 au lieu de 1).
Il calculera mal le 'decale' s'il y a plusieurs espaces avant un mot.
La nouvelle (et dernière) routine PremLettre avec les corrections est copiée
ci-dessous.

2. Je crois qu'on s'est compliqué la vie un peu trop pour identifier les mots à
exclure.
J'ai simplifié le code et j'en ai également copié une version (sans
Application.Match())
Je l'ai nommée PremLettre_v2 ici pour la différencier.

Bon, ça devrait être suffisant et rendre l'ajout d'autres mots particuliers
(SansMaj) assez aisée.

Salutations,

Daniel M.

'Met en majuscule la première lettre des mots de la cellule
'sauf quelques mots (SansMaj), un caprice de JPS et sa cour :-)
'
Function PremLettre(LeTexte As String) As String

Dim RE As Object, Matches As Object, UnMatch As Object
Dim s As String, decale As Integer
Dim SansMaj()

SansMaj = Array("du", "de", "d", "des", "van", "von", "di", "del")

Set RE = CreateObject("VBScript.RegExp")
RE.Global = True 'Recherche toutes les correspondances
RE.IgnoreCase = True 'Ignore les différences maj/min

' Le pattern:
' De 0 à plusieurs caractères suivants: espace ou apostrophe ou tiret
' PUIS
' une suite de 1 à plusieurs lettres reconnues
RE.Pattern = "((s|'|-)*)" & _
"([A-ZßÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ]+)"

Set Matches = RE.Execute(LeTexte)

For Each UnMatch In Matches
With UnMatch
s = .SubMatches(2) ' le mot SANS les espaces/tirets/apostr situés avant
If Left(s, 2) = "mc" Then ' De mcdonald vers mcDonald
decale = .FirstIndex + 1 + Len(.SubMatches(0)) + 2
Mid(LeTexte, decale, 1) = UCase(Mid(LeTexte, decale, 1))
End If

'met 1 lettre en maj sauf pour quelques mots SansMaj
If IsError(Application.Match(s, SansMaj, 0)) Then
' le mot s n'est pas dans la liste SansMaj
' donc, on met sa première lettre en maj
decale = .FirstIndex + 1 + Len(.SubMatches(0))
Mid(LeTexte, decale, 1) = UCase(Mid(LeTexte, decale, 1))
End If
End With
Next UnMatch

PremLettre = LeTexte
End Function



'Met en majuscule la première lettre des mots de la cellule
'sauf quelques mots (SansMaj), un caprice de JPS et sa cour :-)
'
Function PremLettre_v2(LeTexte As String) As String

Dim RE As Object, Matches As Object, UnMatch As Object
Dim s As String, decale As Integer

Set RE = CreateObject("VBScript.RegExp")
RE.Global = True 'Recherche toutes les correspondances
RE.IgnoreCase = True 'Ignore les différences maj/min

' Le pattern:
' De 0 à plusieurs caractères suivants: espace ou apostrophe ou tiret
' PUIS
' une suite de 1 à plusieurs lettres reconnues
RE.Pattern = "((s|'|-)*)" & _
"([A-ZßÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ]+)"

Set Matches = RE.Execute(LeTexte)

For Each UnMatch In Matches
With UnMatch
s = .SubMatches(2) ' le mot SANS les espaces/tirets/apostr situés avant
If Left(s, 2) = "mc" Then ' De mcdonald vers mcDonald
decale = .FirstIndex + 1 + Len(.SubMatches(0)) + 2
Mid(LeTexte, decale, 1) = UCase(Mid(LeTexte, decale, 1))
End If

'met 1 lettre en maj sauf pour quelques mots particuliers
If Not (s = "du" Or s = "de" Or s = "d" Or s = "des" Or _
s = "van" Or s = "di" Or s = "del") Then
' le mot s n'est pas un mot spécial
' donc, on met sa première lettre en maj
decale = .FirstIndex + 1 + Len(.SubMatches(0))
Mid(LeTexte, decale, 1) = UCase(Mid(LeTexte, decale, 1))
End If
End With
Next UnMatch

PremLettre_v2 = LeTexte
End Function
Avatar
jps
salut daniel
puis-je faire remarquer à Votre Seigneurie que pour que ça marche chez moi
(XL 97 pour l'heure), il a fallu que je supprime les () dans Dim SansMaj...
j'avoue que ma puce à l'oreille s'est manifestée car -elle me l'a avoué par
la suite- c'était la première fois qu'elle voyait des parenthèses en bout de
Dim (ce qui ne veut pas dire à la pointe de la chaussette) ; les puces
québécoises n'auraient-elles pas la même perception ?
mais une fois de plus, merci, daniel, pour cet immense travail dont il ne
fait aucun doute qu'il va trôner au panthéon de misangeville...
jps

"Daniel.M" a écrit dans le message de
news:uDK%
Salut Clément, JPS, GD

1. J'ai fait une erreur dans l'indice du SubMatches (doit être 0 au lieu
de 1).

Il calculera mal le 'decale' s'il y a plusieurs espaces avant un mot.
La nouvelle (et dernière) routine PremLettre avec les corrections est
copiée

ci-dessous.

2. Je crois qu'on s'est compliqué la vie un peu trop pour identifier les
mots à

exclure.
J'ai simplifié le code et j'en ai également copié une version (sans
Application.Match())
Je l'ai nommée PremLettre_v2 ici pour la différencier.

Bon, ça devrait être suffisant et rendre l'ajout d'autres mots
particuliers

(SansMaj) assez aisée.

Salutations,

Daniel M.

'Met en majuscule la première lettre des mots de la cellule
'sauf quelques mots (SansMaj), un caprice de JPS et sa cour :-)
'
Function PremLettre(LeTexte As String) As String

Dim RE As Object, Matches As Object, UnMatch As Object
Dim s As String, decale As Integer
Dim SansMaj()

SansMaj = Array("du", "de", "d", "des", "van", "von", "di", "del")

Set RE = CreateObject("VBScript.RegExp")
RE.Global = True 'Recherche toutes les correspondances
RE.IgnoreCase = True 'Ignore les différences maj/min

' Le pattern:
' De 0 à plusieurs caractères suivants: espace ou apostrophe ou tiret
' PUIS
' une suite de 1 à plusieurs lettres reconnues
RE.Pattern = "((s|'|-)*)" & _
"([A-ZßÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ]+)"

Set Matches = RE.Execute(LeTexte)

For Each UnMatch In Matches
With UnMatch
s = .SubMatches(2) ' le mot SANS les espaces/tirets/apostr situés
avant

If Left(s, 2) = "mc" Then ' De mcdonald vers mcDonald
decale = .FirstIndex + 1 + Len(.SubMatches(0)) + 2
Mid(LeTexte, decale, 1) = UCase(Mid(LeTexte, decale, 1))
End If

'met 1 lettre en maj sauf pour quelques mots SansMaj
If IsError(Application.Match(s, SansMaj, 0)) Then
' le mot s n'est pas dans la liste SansMaj
' donc, on met sa première lettre en maj
decale = .FirstIndex + 1 + Len(.SubMatches(0))
Mid(LeTexte, decale, 1) = UCase(Mid(LeTexte, decale, 1))
End If
End With
Next UnMatch

PremLettre = LeTexte
End Function



'Met en majuscule la première lettre des mots de la cellule
'sauf quelques mots (SansMaj), un caprice de JPS et sa cour :-)
'
Function PremLettre_v2(LeTexte As String) As String

Dim RE As Object, Matches As Object, UnMatch As Object
Dim s As String, decale As Integer

Set RE = CreateObject("VBScript.RegExp")
RE.Global = True 'Recherche toutes les correspondances
RE.IgnoreCase = True 'Ignore les différences maj/min

' Le pattern:
' De 0 à plusieurs caractères suivants: espace ou apostrophe ou tiret
' PUIS
' une suite de 1 à plusieurs lettres reconnues
RE.Pattern = "((s|'|-)*)" & _
"([A-ZßÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ]+)"

Set Matches = RE.Execute(LeTexte)

For Each UnMatch In Matches
With UnMatch
s = .SubMatches(2) ' le mot SANS les espaces/tirets/apostr situés
avant

If Left(s, 2) = "mc" Then ' De mcdonald vers mcDonald
decale = .FirstIndex + 1 + Len(.SubMatches(0)) + 2
Mid(LeTexte, decale, 1) = UCase(Mid(LeTexte, decale, 1))
End If

'met 1 lettre en maj sauf pour quelques mots particuliers
If Not (s = "du" Or s = "de" Or s = "d" Or s = "des" Or _
s = "van" Or s = "di" Or s = "del") Then
' le mot s n'est pas un mot spécial
' donc, on met sa première lettre en maj
decale = .FirstIndex + 1 + Len(.SubMatches(0))
Mid(LeTexte, decale, 1) = UCase(Mid(LeTexte, decale, 1))
End If
End With
Next UnMatch

PremLettre_v2 = LeTexte
End Function




2 3 4 5 6