Sætningssag i Excel - Excel-tip

Neethu stillede dagens spørgsmål i en kommentar på YouTube:

Kan en makro ændre tekst til Sentence Case i Excel?

Det er underligt: ​​Excel kender OPPER, lavere og korrekt, men det understøtter ikke de andre sager, der understøttes af Word: Sentence Case eller tOGGLE CASE.

Valgt tekstsag kan let ændres i Microsoft Word ved hjælp af den interne funktion kaldet Change Case.

Skift sagkommandomuligheder i Microsoft Word.

Du kan blot klikke på:

  • "Sætningssag" for at kapitalisere det første bogstav i en sætning og lade alle andre bogstaver være små bogstaver.
  • "små bogstaver" for at udelukke store bogstaver fra din tekst.
  • "UPPERCASE" for at kapitalisere alle bogstaverne.
  • "Kapitaliser hvert ord" for at kapitalisere det første bogstav i hvert ord og lade de andre bogstaver være små.
  • "TOGGLE CASE" for at skifte mellem to sagsvisninger.

Selvom Excel ikke er et tekstbehandlingsprogram, kan det være nødvendigt at ændre tilfældet for den givne tekst. Der er tre Excel-funktioner, der giver lignende funktionalitet. Disse funktioner tager et enkelt argument og transformerer tilfældet for den angivne tekst eller den refererede celles tekstværdi som forklaret nedenfor.

  1. LOWER() funktion til at udelukke store bogstaver.
  2. UPPER() funktion til at kapitalisere alle bogstaverne.
  3. PROPER() funktion til at kapitalisere det første bogstav i hvert ord.

Selvom vi ikke ville diskutere Tooggle Case-indstilling i denne artikel, kan det være nødvendigt at sætte indstillingen Case i Excel, og dette kan delvist opnås ved at kombinere de eksisterende funktioner til en enkelt sætning som vist nedenfor.

Vælg sagsimplementering med Excel-formler.

Du kan bruge følgende funktionskombinationer til at anvende Select Case på en given sætning i Excel.

  1. Tag det første bogstav i den givne tekst ved hjælp af LEFT () -funktionen, og omdann den til store bogstaver ved hjælp af UPPER () -funktionen:

    =UPPER(LEFT(A1,1))

  2. Og tag resten af ​​teksten ved at kombinere RIGHT () og LEN () funktionerne sammen, og omdann den til små bogstaver ved hjælp af funktionen LOWER ():

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

  3. Endelig sammenkæd disse to resultater ved hjælp af funktionen CONCAT ():

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

Dette vil transformere teksten til sætningssag. Du kan også teste dette for al kapitaliseret tekst, der vises i A2-celle.

Hvad hvis der er mere end en enkelt sætning i en celle, som du gerne vil ændre til sætningssag?

Flere sætninger i en celle.

En mulighed for at gøre dette kunne være at bruge VBA til at foretage denne transformation.

SENTENCECASE() brugerdefineret funktion tager den givne tekst, behandler teksten til tre tegnsætningstegn (punktum, spørgsmålstegn og udråbstegn) for at finde flere sætninger, store bogstaver i hver sætning og returnere resultatet.

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()funktion bruger en hjælperfunktion kaldet splitAndTransform()til at opdele sætninger og omdanne sagen med den givne afgrænser. splitAndTransform()er en genanvendelig VBA-funktion i dette projekt, så den er skrevet som en separat hjælperfunktion.

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()hjælperfunktion bruger en anden hjælperfunktion kaldet, isPuncMarked()der definerer, om den givne tekst indeholder et tegnsætningstegn i slutningen. Selv det genbruges ikke i modulet, funktionen isPuncMarked () returnerer en boolsk værdi, og opkaldsfunktionen vedrører kun den værdi, den returnerer, men hvordan den fungerer. Det er altid en god praksis at også adskille denne logik for at give bedre læsbarhed i afhængige procedurer.

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

Her er resultatet.

SENTENCECASE UDF-resultat.

Ideelt set kan det være en god ide at skrive en procedure, der tager det valgte interval og erstatte alt indholdet ved hjælp af Sentence Case i stedet for en brugerdefineret funktion. Dette kan gøres ved at tilføje følgende underprocedure i projektet, der vil anvende massen og permanent transformation.

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

Interessante artikler...