Neethu stilte spørsmålet i dag i en kommentar på YouTube:
Kan en makro endre tekst til Sentence Case i Excel?
Det er rart: Excel kjenner ØVRE, lavere og riktig, men det støtter ikke de andre sakene som støttes av Word: Sentence Case eller tOGGLE CASE.
Valgt tekstsak kan enkelt endres i Microsoft Word ved å bruke den interne funksjonen kalt Change Case.

Du kan bare klikke:
- "Sentence Case" for å kapitalisere den første bokstaven i en setning og la alle andre bokstaver stå som små bokstaver.
- "små bokstaver" for å ekskludere store bokstaver fra teksten.
- "UPPERCASE" for å bruke store bokstaver.
- "Store hvert ord" med store bokstaver i hvert ord og la de andre bokstavene være små.
- "TOGGLE CASE" for å skifte mellom to saksvisninger.
Selv om Excel ikke er et tekstbehandlingsprogram, kan det hende du må endre saken på den gitte teksten. Det er tre Excel-funksjoner som gir lignende funksjonalitet. Disse funksjonene tar ett argument, og transformerer saken til den angitte teksten eller refererte cellens tekstverdi som forklart nedenfor.
LOWER()
funksjon for å ekskludere store bokstaver.UPPER()
funksjon for å bruke store bokstaver.PROPER()
funksjon for å kapitalisere den første bokstaven i hvert ord.
Selv om vi ikke ville diskutere Tooggle Case-alternativet i denne artikkelen, kan det være nødvendig å bruke Sentence Case-alternativet i Excel, og dette kan delvis oppnås ved å kombinere de eksisterende funksjonene for en enkelt setning som vist nedenfor.

Du kan bruke følgende funksjonskombinasjoner til å bruke Select Case på en gitt setning i Excel.
- Ta den første bokstaven i den gitte teksten ved å bruke LEFT () -funksjonen, og transformer den til store bokstaver ved å bruke UPPER () -funksjonen:
=UPPER(LEFT(A1,1))
- Og ta resten av teksten ved å kombinere RIGHT () og LEN () -funksjonene sammen, og transformer den til små bokstaver ved å bruke LOWER () -funksjonen:
=LOWER(RIGHT(A1,LEN(A1)-1))
- Til slutt sammenkoble disse to resultatene ved å bruke funksjonen CONCAT ():
=CONCAT(UPPER(LEFT(A1,1)),LOWER(RIGHT(A1,LEN(A1)-1)))
Dette vil transformere teksten til setningssak. Du kan også teste dette for all kapitalisert tekst som vises i A2-celle.
Hva om det er mer enn en enkelt setning i en celle som du vil endre til Sentence Case?

Et alternativ for å gjøre dette kan være å bruke VBA til å gjøre denne transformasjonen.
SENTENCECASE()
brukerdefinert funksjon tar den gitte teksten, behandler teksten for tre skilletegn (punktum, spørsmålstegn og utropstegn) for å finne flere setninger, bruke store bokstaver i hver setning 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()
funksjonen bruker en hjelperfunksjon som kalles for splitAndTransform()
å dele setninger, og transformere saken ved den gitte skilletegnet. splitAndTransform()
er en gjenbrukbar VBA-funksjon i dette prosjektet, så den er skrevet som en egen hjelperfunksjon.
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()
hjelperfunksjon bruker en annen hjelperfunksjon kalt isPuncMarked()
som definerer om den gitte teksten inneholder et skilletegn på slutten. Selv om den ikke brukes på nytt i modulen, returnerer funksjonen isPuncMarked () en boolsk verdi, og innringerfunksjonen gjelder bare verdien den returnerer, men hvordan den fungerer. Det er alltid en god praksis å også skille denne logikken for å gi bedre lesbarhet i avhengige prosedyrer.
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.

Ideelt sett kan det være lurt å skrive en prosedyre som tar det valgte området, og erstatte alt innholdet ved å bruke Sentence Case i stedet for en brukerdefinert funksjon. Dette kan gjøres ved å legge til følgende underprosedyre i prosjektet som vil bruke massen og permanent transformering.
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