🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA UCase & LCase dans Excel — comparaisons insensibles à la casse et le piège StrConv du Title Case

|

VBA UCase & LCase dans Excel — comparaisons insensibles à la casse et le piège StrConv du Title Case

TL;DRUCase et LCase basculent le texte en tout-majuscules ou tout-minuscules. L'erreur est de croire qu'ils servent à nettoyer les données. Ils ne servent qu'à deux choses : comparer (le = de VBA est sensible à la casse, donc "Yes" = "yes" vaut False — normalisez les deux côtés avec UCase avant de comparer) et afficher. Ils sont destructifs et irréversibles, donc n'écrasez jamais des données stockées avec eux. Et pour le Title Case, il n'existe pas de PCase natif — vous utilisez StrConv(s, vbProperCase), qui fonctionne pour les noms simples mais massacre McDonald, O'Brien et iPhone.

Changer la casse semble la chose la plus simple en VBA, et UCase/LCase sont eux-mêmes simples. Les bugs viennent du pourquoi on les emploie. Utilisés comme outil de comparaison, ils sont indispensables. Utilisés comme outil de stockage, ils détruisent discrètement l'information.

Ce que vous allez apprendre

  • Pourquoi "Yes" = "yes" vaut False en VBA — et la bonne façon de comparer en ignorant la casse
  • Trois façons de faire une correspondance insensible à la casse (et laquelle choisir)
  • Pourquoi vous ne devez jamais stocker la sortie de UCase par-dessus vos données d'origine
  • StrConv pour le Title Case — et le piège des noms propres qui l'accompagne

Le modèle mental : la casse est une lentille, pas une modification

Voyez UCase/LCase comme une paire de lentilles à travers lesquelles vous regardez, et non comme des modifications apportées à la page. Quand vous voulez savoir si deux chaînes correspondent indépendamment de la casse, vous les regardez toutes deux à travers la même lentille (UCase sur les deux) et vous comparez ce que vous voyez — la page en dessous reste intacte. Dès l'instant où vous traitez la lentille comme une modification — en réécrivant UCase(name) par-dessus name — vous avez jeté la capitalisation d'origine pour toujours.

Sub TheLensIdea()
    Dim stored As String
    stored = "McDonald"               ' la vraie donnée — on la garde

    ' On compare à travers une lentille, on ne change pas la donnée
    If UCase(stored) = UCase("mcdonald") Then
        Debug.Print "match"           ' ceci s'affiche
    End If

    Debug.Print stored                ' toujours "McDonald" — intact
End Sub

La règle qui attrape le bug de casse n°1 : le = de VBA est sensible à la casse

C'est le mode de défaillance derrière une énorme part des questions « mon If ne s'exécute jamais ». Par défaut, VBA compare les chaînes octet par octet, donc la capitalisation compte :

Sub CaseSensitiveByDefault()
    Dim answer As String
    answer = "YES"                    ' ce que l'utilisateur a réellement tapé

    If answer = "yes" Then            ' FALSE — "YES" <> "yes"
        Debug.Print "confirmed"       ' ne s'exécute jamais
    End If

    ' Correction : normaliser les deux côtés à travers la même lentille
    If UCase(answer) = "YES" Then     ' TRUE
        Debug.Print "confirmed"       ' s'exécute
    End If
End Sub

Vous avez trois façons de rendre une comparaison insensible à la casse, et le choix est un vrai jugement à faire :

  1. UCase/LCase sur les deux côtésUCase(a) = UCase(b). Explicite, local, évident pour le prochain lecteur. Le meilleur choix par défaut pour une comparaison ponctuelle.
  2. StrComp(a, b, vbTextCompare) — renvoie 0 en cas d'égalité en ignorant la casse. Le plus net quand vous voulez précisément une comparaison et rien d'autre.
  3. Option Compare Text en tête du module — rend toutes les comparaisons =, Like et InStr de ce module insensibles à la casse. Puissant mais invisible : quelqu'un qui lit une seule ligne ne peut pas voir que les règles de comparaison ont changé. À utiliser avec parcimonie et uniquement quand tout le module veut ce comportement.

Ma règle : préférez un UCase explicite pour une comparaison isolée ; n'utilisez Option Compare Text que lorsqu'un module entier est réellement insensible à la casse, et commentez-le bien fort.

Les clés de Dictionary sont elles aussi sensibles à la casse

Le même piège mord Scripting.Dictionary. Par défaut, d("USA") et d("usa") sont deux clés différentes — vous obtiendrez des entrées en double auxquelles vous ne vous attendiez pas. Soit vous définissez d.CompareMode = vbTextCompare juste après sa création, soit vous faites UCase sur chaque clé avant de la stocker ou de la rechercher. Choisissez l'une des deux et restez cohérent.

Title Case : il n'y a pas de PCase, donc on utilise StrConv

VBA vous donne UCase et LCase mais aucune fonction de proper-case native. L'outil est StrConv avec le drapeau vbProperCase :

Debug.Print StrConv("john smith", vbProperCase)   ' -> "John Smith"

Cela fonctionne à merveille pour une entrée ordinaire en minuscules. Mais StrConv ne connaît qu'une seule règle — mettre en majuscule la première lettre de chaque mot, le reste en minuscules — et cette règle est fausse pour beaucoup de noms réels :

Debug.Print StrConv("McDonald", vbProperCase)  ' -> "Mcdonald"   (faux)
Debug.Print StrConv("O'BRIEN", vbProperCase)   ' -> "O'brien"    (faux)
Debug.Print StrConv("iPhone", vbProperCase)    ' -> "Iphone"     (faux)
Debug.Print StrConv("ACME III", vbProperCase)  ' -> "Acme Iii"   (faux)

Le jugement : StrConv(..., vbProperCase) est un nettoyeur « suffisant » pour les noms et adresses en texte libre dont l'entrée est tout en majuscules ou tout en minuscules. Ce n'est pas un formateur de marques ni de noms propres. Si l'exactitude compte pour des noms spécifiques, tenez une liste d'exceptions et corrigez-les après StrConv, ou bien ne mettez pas du tout en Title Case automatiquement.

StrConv fait bien plus que la casse, et c'est pourquoi c'est le bon endroit pour cela — il convertit aussi entre demi-largeur et pleine largeur (vbWide/vbNarrow) et entre Hiragana et Katakana (vbHiragana/vbKatakana) pour les textes d'Asie de l'Est, plus les conversions octet/Unicode. Il vaut la peine de savoir que la liste des drapeaux existe le jour où vous rencontrez ces besoins.

Comment ExcelMaster aide

La plupart du code VBA de gestion de la casse fait partie d'une passe de nettoyage : standardiser une colonne pour que les correspondances et les recherches cessent d'échouer. ExcelMaster fait cela à partir d'une description — « rapproche ces deux listes de clients en ignorant la casse et les espaces » — et normalise pour la comparaison sans détruire les valeurs d'affichage dans votre feuille. Vous décrivez l'intention (correspondance insensible à la casse, Title Case pour l'affichage) et il garde la donnée d'origine intacte.

Vous écrirez encore UCase/LCase directement dans les macros. Mais pour le travail « nettoie et rapproche ces colonnes », énoncer la règle vaut mieux que normaliser chaque clé à la main.

Questions fréquentes

Comment convertir du texte en majuscules ou en minuscules en VBA ?

Utilisez UCase(text) pour le tout-majuscules et LCase(text) pour le tout-minuscules. Ils renvoient une nouvelle chaîne et ne modifient pas l'original, donc affectez le résultat quelque part si vous voulez le conserver.

Comment faire une comparaison insensible à la casse en VBA ?

Normalisez les deux côtés avec la même fonction — UCase(a) = UCase(b) — ou utilisez StrComp(a, b, vbTextCompare) qui renvoie 0 quand les chaînes sont égales en ignorant la casse. Pour un module entier, Option Compare Text rend toutes les comparaisons insensibles à la casse.

Comment mettre en majuscule la première lettre de chaque mot en VBA ?

Utilisez StrConv(text, vbProperCase). Sachez qu'il met tout le reste en minuscules, donc il transforme McDonald en Mcdonald et iPhone en Iphone. Pour les noms comportant des majuscules internes, corrigez-les ensuite avec une liste d'exceptions.

Pourquoi StrConv abîme-t-il des noms comme McDonald ?

vbProperCase suit une seule règle rigide : majuscule à la première lettre de chaque mot, minuscule au reste. Il n'a aucune connaissance des noms propres, donc tout nom comportant une majuscule interne (McDonald, MacLeod, iPhone) ou une apostrophe (O'Brien) en ressort faux. Traitez-le comme un nettoyeur au mieux, pas comme une autorité sur les noms.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 14/06/2026.

Guides associés : VBA Concatenate · VBA Str · VBA Replace · VBA Dictionary · VBA For Loop