Mettre quelques mots d'une chaine en majuscule

  • Initiateur de la discussion Initiateur de la discussion apt
  • 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 !

apt

XLDnaute Impliqué
Bonjour à tous,

J’aimerais par une fonction, ne mettre le contenu d’une cellule en majuscule, que certain mots et éviter certains d’autres.

Par exemple, si j’ai cette phrase :

boite à conserve 115 g

Elle devient :

Boite à Conserve 115 g

On peut remarquer que le a accentué "à" et la lettre g après le chiffre 115, ne sont pas concernés par la mise en majuscule.

Ca veut dire que l’ensemble de lettres suivantes :

à, â, ä, é, è, ê, de, des, le, la, les, d’, l’ ...

et toute lettre après un chiffre ne devra pas être mise en majuscule.

Merci d’avance.
 
Re : Mettre quelques mots d'une chaine en majuscule

une petite dernière avant d'aller se coucher,

je viens d'essayer la solution de David84, effectivement ça fonctionne impec !
alors pour rappel, Apt, si tu veux reprendre et essayer la routine de David84 !
je l'ai renommée pour toi ne pas avoir à modifier tes cellules !

Code:
Function MajusculeSpeciale(Chaine As String) As String
'si tu enlèves la rem devant Application.Volatile
'   tu enlèves la rem devant If ActiveWorkbook.Name ...
'If ActiveWorkbook.Name <> ThisWorkbook.Name Then Exit Function
'Application.Volatile

Dim oRegExp As Object, Matches As Object, I As Byte
Chaine = LCase(Chaine)
Set oRegExp = CreateObject("vbscript.regexp")
With oRegExp
  .Global = True
  .Pattern = "[a-zéèàëöôûüîï]{3,}"
   Set Matches = .Execute(Chaine)
End With
For I = 0 To Matches.Count - 1
 Chaine = Replace(Chaine, Matches.Item(I), Application.WorksheetFunction.Proper(Matches.Item(I)))
Next I
MajusculeSpeciale = Trim(Chaine)
Set oRegExp = Nothing: Set Matches = Nothing
End Function

Bonne nuit à tous !
 
Re : Mettre quelques mots d'une chaine en majuscule

Re Bruno et Rolland
je viens d'essayer la solution de David84, effectivement ça fonctionne impec !
Ta proposition d'utilisation d'expression régulière est impécable
Mais tu sais que le commun des mortels, c'est plutôt compliquer à comprendre
Je le sais que ce n'est pas facile mais les expressions rationnelles sont vraiment efficaces pour ce type de cas.
Ceci-dit, comme apt a l'air de snober ma proposition, je vais le laisser entre vos deux (bonnes) mains.
Au plaisir de vous croiser et d'échanger sur d'autres discussions.
A+
 
Re : Mettre quelques mots d'une chaine en majuscule

bonjour,

comment ça tu n'as rien obtenu !? c’est impossible !

c'est parceque ta fonction est nommée Function MajusculeSpeciale(...
est que dans tes cellules tu as =MajusculeSpeciale(A1) ......

David84 c’est
Function Maj(…

pour essayer tu n’as certainement pas renommé tes cellules pour l’essai !
Maj(A1) ......

moi je t’ai mis cette fonction toute prête, renommée est-ce que tu l’as essayé ?
 
Re : Mettre quelques mots d'une chaine en majuscule

re

à corriger !!!!
Target.Value = MajusculeSpeciale(Target.Value)
sinon aucune affectation !

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Target.Column = 2 Or Target.Column = 3 Then
        Target.Value = MajusculeSpeciale(Target.Value)
    End If
End Sub
 
Re : Mettre quelques mots d'une chaine en majuscule

re

comme tu l'utilises, ceci serait aussi simple (en supprimant bien sûr le module1)
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Not (Target.Column = 2 Or Target.Column = 3) Then Exit Sub
Dim oRegExp As Object, Matches As Object, I As Byte
Chaine = LCase(Target.Value)
Set oRegExp = CreateObject("vbscript.regexp")
With oRegExp
  .Global = True
  .Pattern = "[a-zéèàëöôûüîï]{3,}"
   Set Matches = .Execute(Chaine)
End With
For I = 0 To Matches.Count - 1
 Chaine = Replace(Chaine, Matches.Item(I), Application.WorksheetFunction.Proper(Matches.Item(I)))
Next I
Target.Value = Trim(Chaine)
Set oRegExp = Nothing: Set Matches = Nothing
End Sub

EDIT
bien entendu, sur ta feuille, tu dois faire F2 sur tes cellules pour les éditer et enter pour la fonction s'exécute !
 
Dernière édition:
Re : Mettre quelques mots d'une chaine en majuscule

Bonsoir Roland, Bruno, david84,

comme apt a l'air de snober ma proposition

Désolé pour ma réponse tardive, mais je n'ai pas négligé ta proposition, par contre je l’admire et elle sera la bienvenue.

La preuve, notre ami Roland l'a adapté, et j'espère que tu continu le parcours avec nous jusque qu’on trouve une bonne solution.

Roland : J'aimerais bien que la fonction reste dans un module, parce que dans le Worksheet_Change, j'ai d’autres traitements à faire.

Pour l'essai de la fonction, c'est concluant sauf que la fonction traite seulement ce qui entre les tirets (-) :

Par exemple :

bt-boite à conserve 115 g-1

Elle est transformée en :

bt-Boite à Conserve 115 g-1

Le mot bt n'est pas mis en majuscule (bt => Bt)
 
Re : Mettre quelques mots d'une chaine en majuscule

re

je pense que tu te compliques pas mal la vie !

et si tu mettais toi même correctement tes entrées !
ne croies tu pas que ce serait un peu plus simple !

soit, si tu veux des mots deux lettres en majuscule
ici > .Pattern = "[a-zéèàëöôûüîï]{3,}"
tu mets 2 à la place de 3

mais tu auras aussi ceci !
m-Salade d'Haricots En Conserve 250g-1

(En) au lieu de (en)

--------------------------------------------
si tu veux reprendre ma fonction tu auras ceci

M-Salade d'Haricots en Conserve 250g-1
Bt-Tomate Boîte à Conserve 400 g-2

si tu veux la rerendre !
maintenant je crois qu'il faut être raisonnable car ça devient un peu lourd !

Code:
Function MajusculeSpeciale(Rng As String) As String
If ActiveWorkbook.Name <> ThisWorkbook.Name Then Exit Function
Dim M$, I%, I1%, I2%, II%, LM%, MaxMot%, Majus$, Minus$
'tout en minus et 1'car de chaque mot en majusc
M$ = Application.Proper(LCase(Rng))
I1% = 0: I2% = 1: MaxMot% = 3 'remet en minus les mots de 1à3 car maxi
Do
 I1% = InStr(I2%, M$, " "): If I1% = 0 Then Exit Do
 I2% = InStr(I1% + 1, M$, " ")
 I% = I2% - I1% - 1: If I% <= 0 Then Exit Do
 If I% > 0 And I% <= MaxMot% Then Mid(M$, I1% + 1, 1) = LCase(Mid(M$, I1% + 1, 1))
Loop

I% = 0 'remet en minus 1'car des mots avec une apostrophe
Do: I% = InStr(I% + 1, M$, "'"): If I% = 0 Then Exit Do
 Mid(M$, I% - 1, 1) = LCase(Mid(M$, I% - 1, 1))
Loop

LM% = Len(M$) 'remet en minus le 1'car après chiffre
For I% = 1 To LM%
 If IsNumeric(Mid(M$, I%, 1)) Then
    For II% = I% + 1 To LM%
     If Not IsNumeric(Mid(M$, II%, 1)) And Mid(M$, II%, 1) <> " " Then
        Mid(M$, II%, 1) = LCase(Mid(M$, II%, 1)): I% = II%: Exit For
     End If
    Next
 End If
Next
MajusculeSpeciale = M$
End Function
 
Re : Mettre quelques mots d'une chaine en majuscule

Salut Roland,

Ta fonction marche très bien.

Celle de David, reste à développer.

La chaine :

m-salade d'haricots en conserve 250g-1

est transformée par la fonction de :

:: Roland > M-Salade d'Haricots en Conserve 250g-1 (Juste)

:: David > m-Salade d'Haricots En Conserve 250g-1 (A corriger)

Merci.
 
Re : Mettre quelques mots d'une chaine en majuscule

re

je te rappels aussi que ma fonction à une variable réglée pour des mots de 3 caractères qui restent en minuscules !
c'est ce que tu voulais au début !
si tu veux changer c'est ici > MaxMot% = 3

c'est à dire que "les" "des" ... restent en minusc
si tu passent à 2 ça fera "Les" "Des"

quand à la fonction avec les expressions rationnelles,
bien que je les utilisent pour testées une saisie d'adresse mail ou un nom de dossier/fichier ...
c'est à dire pour ne pas laisser passer n'importe quoi,
je n'y suis pas très familiarisé, mais sache que c'est très efficace !
d'ailleurs suite à ça je vais m'y remettre !
si ça t'interresse il y a sur le net des sites des tutos et autres pour apprendre !
 
Re : Mettre quelques mots d'une chaine en majuscule

re

j'ai remis {3} à la fonction de David !
et j'y met le 1'caractère de la chaîne en majuscule que ce soit un ou plusieurs caractères ! (idem la mienne)
ce qui donne un résultat idem à qq exceptions près !


voir ci-joint

EDIT
pour ceux que ça interressent j'ai apporté qq petites améliorations
test du dernier mot et test d'une chaîne vide car sinon ça plantait !
 

Pièces jointes

Dernière édition:
Re : Mettre quelques mots d'une chaine en majuscule

Bonsoir Roland,

Il faut faire plusieurs testes pour voir si on obtient dans tous les cas le résultat voulu.

Par exemple si on a un nom composé de deux lettres, ça pose problème, comme Ti ou Li !
 
Re : Mettre quelques mots d'une chaine en majuscule

Bonjour à tous

Mon Cher Roland_M ...
je crois que notre ami cherche la petite bête qui fera bugger le code 🙄

Nous sommes très loin de la première demande
J’aimerais par une fonction, ne mettre le contenu d’une cellule en majuscule, que certain mots et éviter certains d’autres. Par exemple, si j’ai cette phrase :
boite à conserve 115 g

[HS]N'apporte rien au sujet, c'est histoire de ...
 
- 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
Retour