Cas de phrase dans Excel - Conseils Excel

Neethu a posé la question d'aujourd'hui dans un commentaire sur YouTube:

Une macro peut-elle changer le texte en cas de phrase dans Excel?

C'est étrange: Excel connaît UPPER, Lower et Proper, mais il ne prend pas en charge les autres cas pris en charge par Word: Sentence Case ou tOGGLE cASE.

La casse de texte sélectionnée peut être facilement modifiée dans Microsoft Word à l'aide de la fonction interne appelée Modifier la casse.

Modifier les options de commande de casse dans Microsoft Word.

Vous pouvez simplement cliquer sur:

  • «Phrase Case» pour mettre en majuscule la première lettre d'une phrase et laisser toutes les autres lettres en minuscules.
  • "minuscules" pour exclure les majuscules de votre texte.
  • "UPPERCASE" pour mettre toutes les lettres en majuscule.
  • "Capitaliser chaque mot" pour mettre en majuscule la première lettre de chaque mot et laisser les autres lettres en minuscules.
  • "tOGGLE cASE" pour basculer entre deux vues de cas.

Bien qu'Excel ne soit pas une application de traitement de texte, vous devrez parfois changer la casse du texte donné. Il existe trois fonctions Excel pour fournir des fonctionnalités similaires. Ces fonctions prennent un seul argument et transforment la casse du texte fourni ou de la valeur de texte de la cellule référencée comme expliqué ci-dessous.

  1. LOWER() fonction pour exclure les majuscules.
  2. UPPER() fonction pour mettre en majuscule toutes les lettres.
  3. PROPER() fonction pour mettre en majuscule la première lettre de chaque mot.

Bien que nous ne parlions pas de l'option Tooggle Case dans cet article, l'option Phrase Case peut être nécessaire à utiliser dans Excel, et cela peut être partiellement réalisé en combinant les fonctions existantes pour une seule phrase comme indiqué ci-dessous.

Sélectionnez Implémentation de cas avec des formules Excel.

Vous pouvez utiliser les combinaisons de fonctions suivantes pour appliquer la casse à une phrase donnée dans Excel.

  1. Prenez la première lettre du texte donné en utilisant la fonction LEFT () et transformez-la en majuscule en utilisant la fonction UPPER ():

    =UPPER(LEFT(A1,1))

  2. Et prenez le reste du texte en combinant les fonctions DROITE () et LEN () ensemble, et transformez-le en minuscules en utilisant la fonction LOWER ():

    =LOWER(RIGHT(A1,LEN(A1)-1))

  3. Enfin concaténez ces deux résultats en utilisant la fonction CONCAT ():

    =CONCAT(UPPER(LEFT(A1,1)),LOWER(RIGHT(A1,LEN(A1)-1)))

Cela transformera le texte en casse de phrase. Vous pouvez également tester cela pour tout le texte en majuscule affiché dans la cellule A2.

Que faire s'il y a plus d'une phrase dans une cellule que vous souhaitez changer en casse de la phrase?

Plusieurs phrases dans une cellule.

Une option pour ce faire pourrait être d'utiliser VBA pour effectuer cette transformation.

SENTENCECASE() La fonction définie par l'utilisateur prend le texte donné, traite le texte pour trois signes de ponctuation (point, point d'interrogation et point d'exclamation) pour trouver les phrases multiples, mettre en majuscule la première lettre de chaque phrase et renvoyer le résultat.

Function SENTENCECASE(txt As String) Dim resArr() As String Dim newArr1(), newArr2(), newArr3() As Variant ReDim resArr(0) resArr(0) = txt newArr1 = splitAndTransform(resArr(0), ".") If Not IsEmpty(newArr1) Then For Each par1 In newArr1 newArr2 = splitAndTransform(par1, "?") If Not IsEmpty(newArr2) Then For Each par2 In newArr2 newArr3 = splitAndTransform(par2, "!") If Not IsEmpty(newArr3) Then For Each par3 In newArr3 resArr(UBound(resArr)) = par3 ReDim Preserve resArr(UBound(resArr) + 1) Next par3 End If Next par2 End If Next par1 End If SENTENCECASE = Join(resArr, " ") End Function

SENTENCECASE()La fonction utilise une fonction d'assistance appelée splitAndTransform()pour diviser des phrases et transformer la casse par le délimiteur donné. splitAndTransform()est une fonction VBA réutilisable dans ce projet, elle est donc écrite comme une fonction d'assistance distincte.

Function splitAndTransform(text, delimiter) Dim tmpArr Dim newArr tmpArr = Split(text, delimiter) If UBound(tmpArr)>= 0 Then ReDim newArr(UBound(tmpArr)) For i = 0 To UBound(tmpArr) If tmpArr(i) "" Then newArr(i) = Trim(tmpArr(i)) newArr(i) = UCase(Left(newArr(i), 1)) & _ LCase(Right(newArr(i), Len(newArr(i)) - 1)) If Not isPuncMarked(newArr(i)) Then newArr(i) = newArr(i) & delimiter End If End If Next i Else ReDim newArr(0) End If splitAndTransform = newArr End Function

splitAndTransform()La fonction d'assistance utilise une autre fonction d'assistance appelée isPuncMarked()qui définit si le texte donné contient un signe de ponctuation à la fin. Même si elle n'est pas réutilisée dans le module, la fonction isPuncMarked () renvoie une valeur booléenne, et la fonction appelante ne se préoccupe que de la valeur qu'elle renvoie, mais de son fonctionnement. Il est toujours bon de séparer également cette logique pour offrir une meilleure lisibilité dans les procédures dépendantes.

Function isPuncMarked(sentence) As Boolean Dim rightMost As String rightMost = Right(sentence, 1) If rightMost = "." Or _ rightMost = "?" Or _ rightMost = "!" Then isPuncMarked = True Else isPuncMarked = False End If End Function

Voici le résultat.

Résultat UDF SENTENCECASE.

Idéalement, il peut être judicieux d'écrire une procédure qui prendra la plage sélectionnée et de remplacer tout le contenu en utilisant la casse de la phrase à la place d'une fonction définie par l'utilisateur. Cela peut être fait en ajoutant la sous-procédure suivante dans le projet qui appliquera la masse et la transformation permanente.

Sub doSentenceCase() Dim rng As Range Dim cll As Range Dim resArr() As String Dim newArr1(), newArr2(), newArr3() As Variant Set rng = Selection For Each cll In rng.Cells ReDim resArr(0) resArr(0) = cll.Value newArr1 = splitAndTransform(cll.Value, ".") If Not IsEmpty(newArr1) Then For Each par1 In newArr1 newArr2 = splitAndTransform(par1, "?") If Not IsEmpty(newArr2) Then For Each par2 In newArr2 newArr3 = splitAndTransform(par2, "!") If Not IsEmpty(newArr3) Then For Each par3 In newArr3 resArr(UBound(resArr)) = par3 ReDim Preserve resArr(UBound(resArr) + 1) Next par3 End If Next par2 End If Next par1 End If cll.Value = Join(resArr, " ") Next cll End Sub

Articles intéressants...