TL;DR —
UCaseetLCasebasculent 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"vautFalse— normalisez les deux côtés avecUCaseavant 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 dePCasenatif — vous utilisezStrConv(s, vbProperCase), qui fonctionne pour les noms simples mais massacreMcDonald,O'BrienetiPhone.
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"vautFalseen 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
UCasepar-dessus vos données d'origine StrConvpour 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 :
UCase/LCasesur les deux côtés —UCase(a) = UCase(b). Explicite, local, évident pour le prochain lecteur. Le meilleur choix par défaut pour une comparaison ponctuelle.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.Option Compare Texten tête du module — rend toutes les comparaisons=,LikeetInStrde 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
