Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Code Excel pour mettre la première lettre en majuscule

Yonissart

XLDnaute Nouveau
Bonsoir
Je cherche un code Excel pour mettre la première lettre de chaque mot en majuscule. j'en avais trouvé un super, mais il y a des mots qui doivent rester entièrement en majuscule, et ça ne suit pas, ça met meme tout en minuscule
Existe t-il un code Excel pour réussir ceci ?
Merci beaucoup
Cordialement
 
Solution
Bonsoir,

A tester ce code que j'ai sous le coude, provient d'un ancien fichier "le mettre dans la feuille même"

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    If Not Intersect(Target, [A1:Z100]) Is Nothing Then
        Dim cell As Range
        For Each cell In Target
            cell.Value = CapitaliserPremiereLettre(cell.Value)
        Next cell
    End If
    Application.EnableEvents = True
End Sub

Function CapitaliserPremiereLettre(ByVal texte As String) As String
    Dim mots() As String
    Dim mot As Variant
    Dim i As Integer

    mots = Split(texte, " ")

    For i = LBound(mots) To UBound(mots)
        If mots(i) <> "" Then
            ' Vérifier si le premier caractère est...

riton00

XLDnaute Impliqué
Bonsoir,

A tester ce code que j'ai sous le coude, provient d'un ancien fichier "le mettre dans la feuille même"

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    If Not Intersect(Target, [A1:Z100]) Is Nothing Then
        Dim cell As Range
        For Each cell In Target
            cell.Value = CapitaliserPremiereLettre(cell.Value)
        Next cell
    End If
    Application.EnableEvents = True
End Sub

Function CapitaliserPremiereLettre(ByVal texte As String) As String
    Dim mots() As String
    Dim mot As Variant
    Dim i As Integer

    mots = Split(texte, " ")

    For i = LBound(mots) To UBound(mots)
        If mots(i) <> "" Then
            ' Vérifier si le premier caractère est une majuscule
            If Asc(Mid(mots(i), 1, 1)) >= 65 And Asc(Mid(mots(i), 1, 1)) <= 90 Then
                ' Conserver la majuscule
                mots(i) = UCase(Left(mots(i), 1)) & Mid(mots(i), 2)
            Else
                ' Mettre en majuscule la première lettre
                mots(i) = UCase(Left(mots(i), 1)) & Mid(mots(i), 2)
            End If
        End If
    Next i

    CapitaliserPremiereLettre = Join(mots, " ")
End Function

Slts
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à tous ,
Une autre fonction (même principe que @riton00 que je salue mais en plus concis) :
VB:
Function PremLettreMaj$(ByVal texte$)
Dim x, r$
   For Each x In Split(texte): r = r & " " & UCase(Left(x, 1)) & Mid(x, 2): Next
   PremLettreMaj = Mid(r, 2)
End Function
 

Pièces jointes

  • Yonissart-PrelLettreMaj-v1.xlsm
    17.1 KB · Affichages: 18
Dernière édition:

wDog66

XLDnaute Occasionnel
Bonjour à tous,

Ou encore plus simple suivant le dernier code de mapomme
VB:
Function PremLettreMaj$(ByVal texte$)
  Dim x, r$
  For Each x In Split(texte): r = r & " " & WorksheetFunction.Proper(x): Next
  PremLettreMaj = Mid(r, 2)
End Function
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @wDog66 ,

J'avais songé à Proper() mais j'y vois deux inconvénients :
  • On quitte VBA pour faire appel à Excel (j'essaie dans la mesure du possible de faire avec des fonctions natives de VBA à moins que l'appel aux fonctions d'Excel ne conduise à une simplification gargantuesque). Tout bien considéré et le temps passant, je fais de plus en plus d'entorses à cette règle
  • Et surtout, la fonction Proper() passe en minuscule le reste du mot. Or c'est ce que désire éviter le demandeur que je cite :
il y a des mots qui doivent rester entièrement en majuscule

edit : bonjour @patricktoulon , bonjour @TooFatBoy
 
Dernière édition:

AtTheOne

XLDnaute Accro
Supporter XLD
Bonsoir à toutes & à tous,
bonsoir @Yonissart , @riton00 , @mapomme , @TooFatBoy , @wDog66
Bon dans mon délire de tout faire par formule à condition d'avoir EXCEL365 ou EXCEL2024 voici une formule avec une LAMBDA récursive qui fait le travail.
Ouf ! J'ai ramé car pour moi c'était une première !
Voilà la formule placée dans le nom "MesNomsPropres" :
Enrichi (BBcode):
=LAMBDA(Texte;LET(txt;Texte;
                  lst;FRACTIONNER.TEXTE(txt;{" ";".";"'";"-";",";";";":";"!";"?";"…";"/";"\";"="};;FAUX;VRAI)&"|";
                  P;MAJUSCULE(GAUCHE(lst;1))&DROITE(lst;NBCAR(lst)-1);
                  N;COLONNES(P);
                  idx;1;
                  Rés;"";
                  NmP;LAMBDA(Me;Rés;txt;P;N;idx;SI(idx>N;Rés;Me(Me;CONCAT(Rés;LET(item;INDEX(P;idx);nbc;NBCAR(item);GAUCHE(item;nbc-1)&STXT(txt;NBCAR(Rés)+nbc;1)));txt;P;N;idx+1)));
                  NmP(NmP;Rés;txt;P;N;idx)))(A1)

Liste des séparateurs utilisés : {" ";".";"'";"-";",";";";":";"!";"?";"";"/";"\";"="}, on peut en ajouter ou en retiter it's up to you !

On l'appelle avec une référence ou un texte en paramètre
exemple =MesNomsPropres(A1)

Voir la pièce jointe
 

Pièces jointes

  • Exemple avec fonction LAMBDA récursive.xlsx
    13.2 KB · Affichages: 4
Dernière édition:

jurassic pork

XLDnaute Occasionnel
Hello,
mapomme apparemment ton code ne fonctionne que pour des mots délimités par espace. Yonnisart ne nous a pas dit si c'est que ce cas de figure qu'il voulait. Par exemple jean-pierre devient Jean-pierre et pas Jean-Pierre ce que le code de AtTheOne fait à priori (pas pu tester je n'ai pas Excel 365). Il prend en compte tous les séparateurs de mots potentiels.
Ami calmant, J.P
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @jurassic pork
la première lettre de chaque mot en majuscule
Pour autant que je sache, en français, et ce malgré l'orthographe inclusive, les mots sont encore séparés par un espace . Pour ne pas froisser les adeptes de 'l'inclusif', je dirais même une espace (si on parle de typographie) .
D'ailleurs passer en majuscule tous les mots d'une phrase n'a que très peu de sens en français excepté si c'est une énumération de noms propres.
Il me semble par ailleurs que seuls les noms propres composés prennent une majuscule à chaque mot les composant. Un nom commun en majuscule ne passe en majuscule que le premier mot du nom composé. A mon humble avis, seule la compréhension du texte permettrait de faire la distinction entre Jean-Marc et Dame-jeanne. Et ça en formule ou bien en VBA, je n'y suis jamais arrivé (et dans le passé, j'ai cherché au début ).
Attention ! Ce n'est pas parce que je n'y suis pas arrivé que d'autres n'ont pas la solution. Loin de moi cette outrecuidance, je n'ai tout simplement pas encore vu de telles formules ou codes.
Et que dire du prénom Marie-Jeanne et du nom commun marie-jeanne ?
 
Dernière édition:

jurassic pork

XLDnaute Occasionnel
Hello mapomme,
Effectivement on ne sait pas trop pourquoi Yonnissart veut passer les premières lettres de tous les mots de son texte en majuscule et ce qu'il entend par mot.
Sinon j'ai réussi à créer une fonction personnalisée avec des expressions régulières qui fait normalement le job :
VB:
Global regex As New RegExp
 PremLetMajJP$(texte$, pattern$)
    Dim match As Object
    regex.pattern = pattern
    regex.Global = True
    For Each match In regex.Execute(texte)
        Mid(texte, match.FirstIndex + 1, 1) = UCase(Mid(texte, match.FirstIndex + 1, 1))
    Next match
    PremLetMajJP = texte
    Set match = Nothing
End Function

Appel de la Fonction :
Code:
=PremLetMajJP(F2;"\b([\wÀ-ÿ]+)\w*")
j'ai eu un petit souci avec les lettres accentuées comme dans premières par exemple , c'est pour cela que j'ai rajouté À-ÿ à \w qui représente un mot normal mais qui ne fonctionne que pour l'ascii. le \b c'est pour boundary (séparateur de mots) et il me prend le -.
temps d'exécution 62µs fonction de mapomme: 40µs (dépend du nombre de mots dans le texte)
Ami calmant, J.P
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re @jurassic pork ,

Je n'ai jamais eu d'atomes crochus avec le système des expressions régulières bien qu'il soit très puissant et performant. C'est sans doute le fait que l'expression régulière quand on n'en est pas l'auteur est difficile à déchiffrer et rend le code peu lisible au premier abord. Je reste influencé par un prof qui bannissait les "astuces" au sein des codes. Il disait l'astuce c'est bien quand vous êtes plongé dans la résolution du problème. Un à deux ans plus tard, à la lecture du code, même l'auteur de l'astuce ne la comprend plus (et ce n'est pas avec les commentaires jamais mis qu'on va s'y retrouver)...
 

AtTheOne

XLDnaute Accro
Supporter XLD
Bonjour à toutes & à tous
(pas pu tester je n'ai pas Excel 365).
Je viens de me payer (pour pas cher) une licence OFFICE Pro plus 2024.
(Utilisable sur un seul poste et non réinstallable).
Je teste les fonctionnalités dont je ne disposais pas avec ma version 2021, en particulier La fonction LAMBDA.
Je m'amuse comme un fou !
À bientôt
 

jurassic pork

XLDnaute Occasionnel
Hello AtTheOne,
avec ta version tu dois alors pouvoir aussi tester les expressions régulières en formule (pas celle que j'ai mise dans une fonction personnalisée VBA dans cette discussion car il y a un traitement "spécial" dans le VBA)
Pour mapomme : je ne suis pas un expert en expressions régulières mais en les pratiquant régulièrement on arrive à se débrouiller (même si ce n'est pas optimisé)
[EDIT] Ah ben non apparemment les Regex c'est que pour Excel 365
Ami calmant, J.P
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour le forum,

En passant une solution simple :
VB:
Function PremLettreMaj$(x$)
Dim i&
x = " " & x
For i = 1 To Len(x)
    If Mid(x, i, 1) = " " Then Mid(x, i, 2) = UCase(Mid(x, i, 2))
Next
PremLettreMaj = LTrim(x)
End Function
A+
 

Pièces jointes

  • Yonissart-PrelLettreMaj-v2.xlsm
    17 KB · Affichages: 3

Discussions similaires

  • Question
XL pour MAC mise en forme
Réponses
2
Affichages
489
Réponses
9
Affichages
679
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…