Caso de oración en Excel - Consejos de Excel

Tabla de contenido

Neethu hizo la pregunta de hoy en un comentario en YouTube:

¿Puede una macro cambiar el texto a Sentence Case en Excel?

Es extraño: Excel sabe SUPERIOR, INFERIOR y CORRECTO, pero no es compatible con los otros casos admitidos por Word: Sentence Case o tOGGLE CASE.

El caso de texto seleccionado se puede cambiar fácilmente en Microsoft Word utilizando la función interna llamada Cambiar caso.

Cambiar las opciones del comando de mayúsculas y minúsculas en Microsoft Word.

Simplemente puede hacer clic en:

  • "Sentence Case" para poner en mayúscula la primera letra de una oración y dejar todas las demás letras en minúsculas.
  • "minúsculas" para excluir las letras mayúsculas de su texto.
  • "MAYÚSCULAS" para poner en mayúscula todas las letras.
  • "Capitalizar cada palabra" para poner en mayúscula la primera letra de cada palabra y dejar las demás letras en minúscula.
  • "TOGGLE CASE" para cambiar entre dos vistas de casos.

Aunque Excel no es una aplicación de procesamiento de texto, a veces es posible que deba cambiar las mayúsculas y minúsculas del texto dado. Hay tres funciones de Excel para proporcionar una funcionalidad similar. Estas funciones toman un solo argumento y transforman el caso del texto proporcionado o el valor del texto de la celda referenciada como se explica a continuación.

  1. LOWER() función para excluir letras mayúsculas.
  2. UPPER() función para poner en mayúscula todas las letras.
  3. PROPER() función para poner en mayúscula la primera letra de cada palabra.

Si bien no discutiremos la opción Tooggle Case en este artículo, la opción Sentence Case podría ser necesaria para usar en Excel, y esto se puede lograr parcialmente combinando las funciones existentes para una sola oración como se muestra a continuación.

Seleccione Implementación de casos con fórmulas de Excel.

Puede usar las siguientes combinaciones de funciones para aplicar Seleccionar caso a una oración determinada en Excel.

  1. Tome la primera letra del texto dado usando la función IZQUIERDA (), y transfórmela a mayúscula usando la función SUPERIOR ():

    =UPPER(LEFT(A1,1))

  2. Y toma el resto del texto combinando las funciones RIGHT () y LEN () juntas, y transfórmalo a minúsculas usando la función LOWER ():

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

  3. Finalmente, concatene estos dos resultados usando la función CONCAT ():

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

Esto transformará el texto en caso de oración. También puede probar esto para todo el texto en mayúsculas que se muestra en la celda A2.

¿Qué pasa si hay más de una oración en una celda que le gustaría cambiar a Sentence Case?

Varias oraciones en una celda.

Una opción para hacer esto podría usar VBA para realizar esta transformación.

SENTENCECASE() La función definida por el usuario toma el texto dado, procesa el texto con tres signos de puntuación (punto, signo de interrogación y signo de exclamación) para encontrar las oraciones múltiples, poner en mayúscula la primera letra de cada oración y devolver el resultado.

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 función usa una función auxiliar llamada splitAndTransform()para dividir oraciones y transformar el caso por el delimitador dado. splitAndTransform()es una función de VBA reutilizable en este proyecto, por lo que está escrito como una función auxiliar separada.

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 función auxiliar usa otra función auxiliar llamada isPuncMarked()que define si el texto dado contiene un signo de puntuación al final. Incluso si no se reutiliza en el módulo, la función isPuncMarked () devuelve un valor booleano, y la función de llamada solo se preocupa por el valor que devuelve, pero cómo funciona. Siempre es una buena práctica separar también esta lógica para proporcionar una mejor legibilidad en los procedimientos dependientes.

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

Aquí está el resultado.

Resultado de SENTENCECASE UDF.

Idealmente, podría ser una buena idea escribir un procedimiento que tome el rango seleccionado y reemplace todo el contenido usando Sentence Case en lugar de una función definida por el usuario. Esto se puede hacer agregando el siguiente subprocedimiento en el proyecto que aplicará la masa y la transformación 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

Articulos interesantes...