TL;DR —
UCaseyLCasepasan el texto a todo mayúsculas o todo minúsculas. El error es creer que sirven para limpiar datos. Sirven para dos tareas, y solo dos: comparar (el=de VBA distingue mayúsculas, así que"Yes" = "yes"esFalse; normalice ambos lados conUCaseantes de comparar) y mostrar. Son una operación con pérdida e irreversible, así que nunca sobrescriba con ellas los datos almacenados. Y para el formato de título no hay una funciónPCaseintegrada: se usaStrConv(s, vbProperCase), que funciona con nombres sencillos pero destrozaMcDonald,O'BrieneiPhone.
Cambiar de mayúsculas a minúsculas parece lo más simple de VBA, y UCase/LCase
en sí son simples. Los errores vienen del porqué se recurre a ellas. Usadas como
herramienta de comparación, son indispensables. Usadas como herramienta de
almacenamiento, destruyen información en silencio.
Lo que aprenderás
- Por qué
"Yes" = "yes"esFalseen VBA, y la forma correcta de comparar ignorando las mayúsculas - Tres maneras de hacer una coincidencia sin distinción de mayúsculas (y cuál elegir)
- Por qué nunca debe almacenar la salida de
UCaseencima de sus datos originales StrConvpara el formato de título, y la trampa de los nombres propios que lo acompaña
El modelo mental: las mayúsculas/minúsculas son una lente, no una edición
Piense en UCase/LCase como un par de lentes a través de las cuales mira, no
como ediciones que hace sobre la página. Cuando quiere saber si dos cadenas
coinciden con independencia de las mayúsculas, mira ambas a través de la misma
lente (les aplica UCase) y compara lo que ve: la página de debajo queda intacta.
En cuanto trata la lente como una edición —escribiendo UCase(name) de vuelta
sobre name—, ha tirado para siempre la capitalización original.
Sub TheLensIdea()
Dim stored As String
stored = "McDonald" ' el dato real — consérvalo
' Compara a través de una lente, no cambies el dato
If UCase(stored) = UCase("mcdonald") Then
Debug.Print "match" ' esto se imprime
End If
Debug.Print stored ' sigue siendo "McDonald" — intacto
End Sub
La regla que atrapa el error de mayúsculas n.º 1: el = de VBA distingue mayúsculas
Este es el modo de fallo que está detrás de una enorme proporción de las preguntas del tipo «mi If nunca se ejecuta». De forma predeterminada, VBA compara las cadenas byte a byte, así que la capitalización importa:
Sub CaseSensitiveByDefault()
Dim answer As String
answer = "YES" ' lo que el usuario escribió en realidad
If answer = "yes" Then ' FALSE — "YES" <> "yes"
Debug.Print "confirmed" ' nunca se ejecuta
End If
' Arreglo: normaliza ambos lados a través de la misma lente
If UCase(answer) = "YES" Then ' TRUE
Debug.Print "confirmed" ' se ejecuta
End If
End Sub
Tiene tres maneras de hacer una comparación sin distinción de mayúsculas, y la elección es un verdadero ejercicio de criterio:
UCase/LCaseen ambos lados —UCase(a) = UCase(b). Explícito, local, evidente para quien lo lea después. La mejor opción por defecto para una comparación puntual.StrComp(a, b, vbTextCompare)— devuelve 0 cuando son iguales ignorando las mayúsculas. Lo más limpio cuando lo único que quiere es comparar y nada más.Option Compare Textal principio del módulo — hace que cada=,LikeeInStrde ese módulo ignore las mayúsculas. Potente pero invisible: quien lea una sola línea no puede saber que las reglas de comparación cambiaron. Úselo con moderación y solo cuando todo el módulo deba comportarse así.
Mi regla: prefiera un UCase explícito para una comparación aislada; use
Option Compare Text solo cuando un módulo entero sea genuinamente insensible a
las mayúsculas, y coméntelo bien a la vista.
Las claves de Dictionary también distinguen mayúsculas
La misma trampa muerde en Scripting.Dictionary. De forma
predeterminada, d("USA") y d("usa") son dos claves distintas: obtendrá
entradas duplicadas que no esperaba. O bien establece d.CompareMode = vbTextCompare justo después de crearlo, o bien aplica UCase a cada clave antes
de almacenarla o buscarla. Elija una opción y sea coherente.
Formato de título: no existe PCase, así que se usa StrConv
VBA le da UCase y LCase, pero ninguna función integrada para el formato de
título. La herramienta es StrConv con el indicador vbProperCase:
Debug.Print StrConv("john smith", vbProperCase) ' -> "John Smith"
Eso funciona de maravilla con una entrada en minúsculas corriente. Pero StrConv
solo conoce una regla —poner en mayúscula la primera letra de cada palabra y el
resto en minúscula— y esa regla es errónea para muchos nombres reales:
Debug.Print StrConv("McDonald", vbProperCase) ' -> "Mcdonald" (incorrecto)
Debug.Print StrConv("O'BRIEN", vbProperCase) ' -> "O'brien" (incorrecto)
Debug.Print StrConv("iPhone", vbProperCase) ' -> "Iphone" (incorrecto)
Debug.Print StrConv("ACME III", vbProperCase) ' -> "Acme Iii" (incorrecto)
El criterio: StrConv(..., vbProperCase) es un limpiador «suficientemente bueno»
para nombres y direcciones de texto libre cuya entrada esté toda en mayúsculas o
toda en minúsculas. No es un formateador de marcas ni de nombres propios. Si la
corrección importa para nombres concretos, mantenga una lista de excepciones y
corríjalos después de StrConv, o no aplique el formato de título de forma
automática en absoluto.
StrConv hace mucho más que cambiar mayúsculas, y por eso es el lugar adecuado
para esto: también convierte entre ancho medio y ancho completo
(vbWide/vbNarrow) y entre Hiragana y Katakana (vbHiragana/vbKatakana) para
texto del este asiático, además de conversiones entre bytes y Unicode. Vale la
pena saber que existe esa lista de indicadores para cuando se tope con esas
necesidades.
Cómo ayuda ExcelMaster
La mayor parte del código VBA que maneja mayúsculas forma parte de una pasada de limpieza: estandarizar una columna para que los emparejamientos y las búsquedas dejen de fallar. ExcelMaster hace eso a partir de una descripción —«empareja estas dos listas de clientes ignorando mayúsculas y espacios»— y normaliza para la comparación sin destruir los valores que se muestran en su hoja. Usted describe la intención (coincidencia sin distinción de mayúsculas, formato de título para mostrar) y se conservan los datos originales intactos.
Seguirá escribiendo UCase/LCase en línea dentro de sus macros. Pero para
trabajos del tipo «limpia y empareja estas columnas», enunciar la regla es mejor
que normalizar cada clave a mano.
Preguntas frecuentes
¿Cómo convierto texto a mayúsculas o a minúsculas en VBA?
Use UCase(text) para todo mayúsculas y LCase(text) para todo minúsculas.
Devuelven una cadena nueva y no modifican la original, así que asigne el resultado
a algún sitio si quiere conservarlo.
¿Cómo hago una comparación sin distinción de mayúsculas en VBA?
Normalice ambos lados con la misma función —UCase(a) = UCase(b)— o use
StrComp(a, b, vbTextCompare), que devuelve 0 cuando las cadenas son iguales
ignorando las mayúsculas. Para un módulo entero, Option Compare Text hace que
todas las comparaciones ignoren las mayúsculas.
¿Cómo pongo en mayúscula la primera letra de cada palabra en VBA?
Use StrConv(text, vbProperCase). Tenga en cuenta que pone todo lo demás en
minúsculas, así que convierte McDonald en Mcdonald e iPhone en Iphone.
Para nombres con mayúsculas internas, corríjalos después con una lista de
excepciones.
¿Por qué StrConv estropea nombres como McDonald?
vbProperCase sigue una única regla rígida: poner en mayúscula la primera letra de
cada palabra y el resto en minúscula. No tiene ningún conocimiento de los nombres
propios, así que cualquier nombre con una mayúscula interna (McDonald, MacLeod,
iPhone) o un apóstrofo (O'Brien) sale mal. Trátelo como un limpiador que hace
lo que puede, no como una autoridad en materia de nombres.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación 14-06-2026.
Guías relacionadas: VBA Concatenate · VBA Str · VBA Replace · VBA Dictionary · VBA For Loop
