Neethu fez a pergunta de hoje em um comentário no YouTube:
Uma macro pode alterar o texto para caixa de frase no Excel?
É estranho: o Excel conhece UPPER, lower e Proper, mas não suporta os outros casos suportados pelo Word: Sentença Case ou tOGGLE cASE.
A caixa de texto selecionada pode ser facilmente alterada no Microsoft Word usando a função interna chamada Change Case.

Você pode simplesmente clicar em:
- "Caixa de frase" para colocar a primeira letra de uma frase em maiúscula e deixar todas as outras letras em minúsculas.
- "minúsculas" para excluir letras maiúsculas de seu texto.
- "MAIÚSCULAS" para capitalizar todas as letras.
- "Capitalize Cada Palavra" para colocar a primeira letra de cada palavra em maiúscula e deixar as outras letras em minúsculas.
- "tOGGLE cASE" para alternar entre duas visualizações de caso.
Embora o Excel não seja um aplicativo de processamento de texto, às vezes pode ser necessário alterar a caixa do texto fornecido. Existem três funções do Excel para fornecer funcionalidade semelhante. Essas funções aceitam um único argumento e transformam a capitalização do texto fornecido ou o valor do texto da célula referenciada conforme explicado abaixo.
LOWER()
função para excluir letras maiúsculas.UPPER()
função para capitalizar todas as letras.PROPER()
função para colocar a primeira letra de cada palavra em maiúscula.
Embora não tenhamos discutido a opção Alternar entre maiúsculas e minúsculas neste artigo, a opção Maiúsculas e minúsculas pode ser necessária para usar no Excel, e isso pode ser parcialmente alcançado combinando as funções existentes para uma única frase, conforme mostrado abaixo.

Você pode usar as seguintes combinações de funções para aplicar Select Case a uma determinada frase no Excel.
- Pegue a primeira letra do texto fornecido usando a função LEFT () e transforme-a em maiúscula usando a função UPPER ():
=UPPER(LEFT(A1,1))
- E pegue o restante do texto combinando as funções RIGHT () e LEN () e transforme-o em minúsculas usando a função LOWER ():
=LOWER(RIGHT(A1,LEN(A1)-1))
- Por fim, concatene esses dois resultados usando a função CONCAT ():
=CONCAT(UPPER(LEFT(A1,1)),LOWER(RIGHT(A1,LEN(A1)-1)))
Isso transformará o texto em maiúsculas e minúsculas. Você também pode testar isso para todo o texto em maiúsculas que é mostrado na célula A2.
E se houver mais de uma frase em uma célula que você gostaria de alterar para caixa alta de frase?

Uma opção para fazer isso poderia ser usar o VBA para fazer essa transformação.
SENTENCECASE()
função definida pelo usuário pega o texto fornecido, processa o texto para três sinais de pontuação (ponto final, ponto de interrogação e ponto de exclamação) para encontrar as frases múltiplas, coloca a primeira letra de cada frase em maiúscula e retorna o 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()
A função usa uma função auxiliar chamada splitAndTransform()
para dividir sentenças e transformar o caso pelo delimitador fornecido. splitAndTransform()
é uma função VBA reutilizável neste projeto, portanto, é escrita como uma função 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()
A função auxiliar usa outra função auxiliar chamada isPuncMarked()
que define se o texto fornecido contém um sinal de pontuação no final. Mesmo não sendo reutilizada no módulo, a função isPuncMarked () retorna um valor booleano, e a função do chamador se preocupa apenas com o valor que retorna, mas como funciona. É sempre uma boa prática também separar essa lógica para fornecer melhor legibilidade nos procedimentos dependentes.
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
Aqui está o resultado.

Idealmente, pode ser uma boa ideia escrever um procedimento que ocupe o intervalo selecionado e substituir todo o conteúdo usando Caixa de Frase em vez de uma função definida pelo usuário. Isso pode ser feito adicionando o seguinte subprocedimento ao projeto que aplicará a transformação em massa e 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