Neethu ställde dagens fråga i en kommentar på YouTube:
Kan ett makro ändra text till Sentence Case i Excel?
Det är konstigt: Excel känner till ÖVRE, lägre och korrekt, men det stöder inte de andra fallen som stöds av Word: Sentence Case eller tOGGLE CASE.
Valt textfall kan enkelt ändras i Microsoft Word med hjälp av den interna funktionen som heter Change Case.

Du kan helt enkelt klicka på:
- "Mening" för att versera den första bokstaven i en mening och lämna alla andra bokstäver som små bokstäver.
- "gemener" för att utesluta stora bokstäver från din text.
- "UPPERCASE" för att versera alla bokstäver.
- "Stora bokstäver i varje ord" för att göra stora bokstäver i varje ord och lämna de andra bokstäverna med små bokstäver.
- "TOGGLE CASE" för att växla mellan två fallvyer.
Även om Excel inte är ett ordbehandlingsprogram kan du ibland behöva ändra fallet för den givna texten. Det finns tre Excel-funktioner som ger liknande funktioner. Dessa funktioner tar ett enda argument och omvandlar fallet med den angivna texten eller referenscellens textvärde som förklaras nedan.
LOWER()
funktion för att utesluta versaler.UPPER()
funktion för att versera alla bokstäver.PROPER()
funktion för att versera den första bokstaven i varje ord.
Även om vi inte skulle diskutera Tooggle Case-alternativet i den här artikeln, kan alternativet Sentence Case vara nödvändigt att använda i Excel, och detta kan delvis uppnås genom att kombinera befintliga funktioner för en enda mening som visas nedan.

Du kan använda följande funktionskombinationer för att tillämpa Select Case på en given mening i Excel.
- Ta den första bokstaven i den givna texten med funktionen VÄNSTER () och förvandla den till versaler med hjälp av funktionen UPPER ():
=UPPER(LEFT(A1,1))
- Och ta resten av texten genom att kombinera RIGHT () och LEN () -funktionerna tillsammans och förvandla den till gemener med funktionen LOWER ():
=LOWER(RIGHT(A1,LEN(A1)-1))
- Slutligen sammanfoga dessa två resultat med funktionen CONCAT ():
=CONCAT(UPPER(LEFT(A1,1)),LOWER(RIGHT(A1,LEN(A1)-1)))
Detta kommer att förvandla texten till meningsfall. Du kan också testa detta för all stor text som visas i A2-cell.
Vad händer om det finns mer än en enda mening i en cell som du vill ändra till Mening Fall?

Ett alternativ för att göra detta kan vara att använda VBA för att göra denna omvandling.
SENTENCECASE()
användardefinierad funktion tar den givna texten, bearbetar texten för tre skiljetecken (punkt, frågetecken och utropstecken) för att hitta flera meningar, versalerar den första bokstaven i varje mening och returnerar 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()
funktionen använder en hjälpfunktion som kallas för splitAndTransform()
att dela meningar och förvandla fallet med den angivna avgränsaren. splitAndTransform()
är en återanvändbar VBA-funktion i detta projekt, så den är skriven som en separat hjälpfunktion.
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älpfunktionen använder en annan hjälpfunktion isPuncMarked()
som definierar om den angivna texten innehåller ett skiljetecken i slutet. Även om den inte återanvänds i modulen, returnerar funktionen isPuncMarked () ett booleskt värde, och uppringningsfunktionen gäller bara det värde den returnerar, men hur den fungerar. Det är alltid en bra praxis att också separera denna logik för att ge bättre läsbarhet i beroende 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
Här är resultatet.

Helst kan det vara bra att skriva en procedur som tar det valda intervallet och ersätta allt innehåll med hjälp av Sentence Case istället för en användardefinierad funktion. Detta kan göras genom att lägga till följande delprocedur i projektet som kommer att tillämpa massan och 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