Caso di frase in Excel - Suggerimenti per Excel

Neethu ha posto la domanda di oggi in un commento su YouTube:

Una macro può cambiare il testo in Frase maiuscola in Excel?

È strano: Excel conosce UPPER, lower e Proper, ma non supporta gli altri casi supportati da Word: Sentence Case o tOGGLE cASE.

Le maiuscole / minuscole selezionate possono essere facilmente modificate in Microsoft Word utilizzando la funzione interna chiamata Cambia maiuscole / minuscole.

Modifica le opzioni del comando Case in Microsoft Word.

Puoi semplicemente fare clic:

  • "Frase maiuscola" per rendere maiuscola la prima lettera di una frase e lasciare tutte le altre lettere minuscole.
  • "minuscolo" per escludere le lettere maiuscole dal testo.
  • "MAIUSCOLO" per rendere tutte le lettere maiuscole.
  • "Capitalize Each Word" per rendere maiuscola la prima lettera di ogni parola e lasciare le altre lettere minuscole.
  • "TOGGLE CASE" per spostarsi tra due visualizzazioni di casi.

Sebbene Excel non sia un'applicazione di elaborazione testi, a volte potrebbe essere necessario modificare il caso del testo specificato. Sono disponibili tre funzioni di Excel per fornire funzionalità simili. Queste funzioni accettano un singolo argomento e trasformano il caso del testo fornito o il valore del testo della cella a cui si fa riferimento come spiegato di seguito.

  1. LOWER() funzione per escludere le lettere maiuscole.
  2. UPPER() funzione per rendere maiuscole tutte le lettere.
  3. PROPER() funzione per rendere maiuscola la prima lettera di ogni parola.

Anche se non discuteremo l'opzione Tooggle Case in questo articolo, l'opzione Sentence Case potrebbe essere necessaria da utilizzare in Excel e ciò può essere ottenuto parzialmente combinando le funzioni esistenti per una singola frase come mostrato di seguito.

Seleziona Implementazione del caso con formule di Excel.

È possibile utilizzare le seguenti combinazioni di funzioni per applicare Seleziona caso a una determinata frase in Excel.

  1. Prendi la prima lettera del testo dato usando la funzione LEFT () e trasformala in maiuscolo usando la funzione UPPER ():

    =UPPER(LEFT(A1,1))

  2. E prendi il resto del testo combinando le funzioni RIGHT () e LEN () e trasformalo in minuscolo usando la funzione LOWER ():

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

  3. Infine concatena questi due risultati utilizzando la funzione CONCAT ():

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

Questo trasformerà il testo in maiuscolo / minuscolo. Puoi anche testarlo per tutto il testo in maiuscolo mostrato nella cella A2.

E se in una cella sono presenti più frasi che desideri modificare in Maiuscole / minuscole?

Più frasi in una cella.

Un'opzione per farlo potrebbe essere l'utilizzo di VBA per effettuare questa trasformazione.

SENTENCECASE() la funzione definita dall'utente prende il testo dato, elabora il testo per tre segni di punteggiatura (punto, punto interrogativo e punto esclamativo) per trovare più frasi, rendere maiuscola la prima lettera di ogni frase e restituire il risultato.

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()utilizza una funzione di supporto chiamata splitAndTransform()per dividere le frasi e trasformare il caso in base al delimitatore specificato. splitAndTransform()è una funzione VBA riutilizzabile in questo progetto, quindi è scritta come una funzione di supporto separata.

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 funzione di supporto utilizza un'altra funzione di supporto chiamata isPuncMarked()che definisce se il testo specificato contiene un segno di punteggiatura alla fine. Anche se non viene riutilizzato nel modulo, la funzione isPuncMarked () restituisce un valore booleano e la funzione chiamante si occupa solo del valore restituito, ma di come funziona. È sempre buona norma separare anche questa logica per fornire una migliore leggibilità nelle procedure dipendenti.

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

Ecco il risultato.

Risultato UDF SENTENCECASE.

Idealmente potrebbe essere una buona idea scrivere una procedura che prenda l'intervallo selezionato e sostituire tutto il contenuto utilizzando Frase maiuscole invece una funzione definita dall'utente. Questo può essere fatto aggiungendo la seguente procedura secondaria nel progetto che applicherà la trasformazione di 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

Articoli interessanti...