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

UCase & LCase en VBA en Excel — comparaciones sin distinción de mayúsculas y la trampa del título con StrConv

|

UCase & LCase en VBA en Excel — comparaciones sin distinción de mayúsculas y la trampa del título con StrConv

TL;DRUCase y LCase pasan 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" es False; normalice ambos lados con UCase antes 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ón PCase integrada: se usa StrConv(s, vbProperCase), que funciona con nombres sencillos pero destroza McDonald, O'Brien e iPhone.

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" es False en 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 UCase encima de sus datos originales
  • StrConv para 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:

  1. UCase/LCase en ambos ladosUCase(a) = UCase(b). Explícito, local, evidente para quien lo lea después. La mejor opción por defecto para una comparación puntual.
  2. 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.
  3. Option Compare Text al principio del módulo — hace que cada =, Like e InStr de 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