Neethu stelde de vraag van vandaag in een opmerking op YouTube:
Kan een macro tekst wijzigen in zin Case in Excel?
Het is vreemd: Excel kent UPPER, lower en Proper, maar het ondersteunt de andere gevallen die worden ondersteund door Word: Sentence Case of tOGGLE CASE niet.
Geselecteerde hoofdletters en kleine letters kunnen eenvoudig in Microsoft Word worden gewijzigd met behulp van de interne functie Change Case.

U kunt eenvoudig klikken op:
- "Zin Case" om de eerste letter van een zin te kapitaliseren en alle andere letters als kleine letters te laten.
- "kleine letters" om hoofdletters uit uw tekst te verwijderen.
- "HOOFDLETTERS" om alle letters met een hoofdletter te schrijven.
- "Geef elk woord een hoofdletter" om de eerste letter van elk woord een hoofdletter te geven en de andere letters in kleine letters te laten.
- "tOGGLE CASE" om te schakelen tussen twee case-views.
Hoewel Excel geen tekstverwerkingsprogramma is, moet u soms het hoofdlettergebruik van de opgegeven tekst wijzigen. Er zijn drie Excel-functies die vergelijkbare functionaliteit bieden. Deze functies gebruiken een enkel argument en transformeren het geval van de opgegeven tekst of de tekstwaarde van de cel waarnaar wordt verwezen, zoals hieronder wordt uitgelegd.
LOWER()
functie om hoofdletters uit te sluiten.UPPER()
functie om alle letters met een hoofdletter te schrijven.PROPER()
functie om de eerste letter van elk woord met een hoofdletter te schrijven.
Hoewel we de optie Tooggle Case in dit artikel niet zouden bespreken, kan de optie Sentence Case nodig zijn om in Excel te gebruiken, en dit kan gedeeltelijk worden bereikt door de bestaande functies voor een enkele zin te combineren, zoals hieronder wordt weergegeven.

U kunt de volgende functiecombinaties gebruiken om Select Case toe te passen op een bepaalde zin in Excel.
- Neem de eerste letter van de gegeven tekst met behulp van de LEFT () -functie en transformeer deze in hoofdletters met behulp van de UPPER () -functie:
=UPPER(LEFT(A1,1))
- En neem de rest van de tekst door de functies RIGHT () en LEN () samen te combineren en transformeer deze naar kleine letters met behulp van de functie LOWER ():
=LOWER(RIGHT(A1,LEN(A1)-1))
- Voeg ten slotte deze twee resultaten samen met behulp van de functie CONCAT ():
=CONCAT(UPPER(LEFT(A1,1)),LOWER(RIGHT(A1,LEN(A1)-1)))
Dit zal de tekst transformeren naar hoofdlettergebruik. U kunt dit ook testen voor alle tekst met hoofdletters die wordt weergegeven in de A2-cel.
Wat moet ik doen als er meer dan één zin in een cel staat die u wilt wijzigen in Zin Case?

Een optie om dit te doen, zou VBA kunnen zijn om deze transformatie uit te voeren.
SENTENCECASE()
de door de gebruiker gedefinieerde functie neemt de gegeven tekst, verwerkt de tekst voor drie leestekens (punt, vraagteken en uitroepteken) om de meerdere zinnen te vinden, de eerste letter van elke zin met een hoofdletter te schrijven en het resultaat te retourneren.
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()
functie gebruikt een hulpfunctie die wordt aangeroepen splitAndTransform()
om zinnen te splitsen en de hoofdletter te transformeren met het gegeven scheidingsteken. splitAndTransform()
is een herbruikbare VBA-functie in dit project, dus het is geschreven als een aparte helperfunctie.
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()
de helperfunctie gebruikt een andere helperfunctie isPuncMarked()
die wordt genoemd en die bepaalt of de gegeven tekst aan het einde een leesteken bevat. Zelfs als het niet opnieuw wordt gebruikt in de module, retourneert de functie isPuncMarked () een booleaanse waarde, en de functie aanroeper betreft alleen de waarde die het retourneert, maar hoe het werkt. Het is altijd een goede gewoonte om deze logica ook te scheiden om een betere leesbaarheid in afhankelijke procedures te bieden.
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
Hier is het resultaat.

Idealiter zou het een goed idee kunnen zijn om een procedure te schrijven die het geselecteerde bereik in beslag neemt en alle inhoud te vervangen door gebruik van Sentence Case in plaats van een door de gebruiker gedefinieerde functie. Dit kan gedaan worden door de volgende subprocedure aan het project toe te voegen die de massa en permanente transformatie zal toepassen.
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