Neethu stellte die heutige Frage in einem Kommentar auf YouTube:
Kann ein Makro Text in Excel in Satzfall ändern?
Es ist seltsam: Excel kennt UPPER, Lower und Proper, unterstützt jedoch nicht die anderen Fälle, die von Word: Satzfall oder TOGGLE-Fall unterstützt werden.
Die ausgewählte Groß- und Kleinschreibung kann in Microsoft Word mithilfe der internen Funktion "Groß- / Kleinschreibung ändern" problemlos geändert werden.

Sie können einfach klicken auf:
- "Satzfall", um den ersten Buchstaben eines Satzes groß zu schreiben und alle anderen Buchstaben als Kleinbuchstaben zu belassen.
- "Kleinbuchstaben", um Großbuchstaben aus Ihrem Text auszuschließen.
- "GROSSBUCHSTABEN", um alle Buchstaben groß zu schreiben.
- "Großschreibung jedes Wortes", um den ersten Buchstaben jedes Wortes groß zu schreiben und die anderen Buchstaben in Kleinbuchstaben zu belassen.
- "tOGGLE cASE", um zwischen zwei Fallansichten zu wechseln.
Obwohl Excel keine Textverarbeitungsanwendung ist, müssen Sie manchmal die Groß- und Kleinschreibung des angegebenen Textes ändern. Es gibt drei Excel-Funktionen, um ähnliche Funktionen bereitzustellen. Diese Funktionen verwenden ein einzelnes Argument und transformieren den Fall des bereitgestellten Textes oder des Textwerts der referenzierten Zelle wie unten erläutert.
LOWER()
Funktion zum Ausschließen von Großbuchstaben.UPPER()
Funktion, um alle Buchstaben groß zu schreiben.PROPER()
Funktion zum Großschreiben des ersten Buchstabens jedes Wortes.
Während wir in diesem Artikel nicht auf die Option "Groß- und Kleinschreibung umschalten" eingehen, ist die Verwendung der Option "Groß- / Kleinschreibung" möglicherweise in Excel erforderlich. Dies kann teilweise erreicht werden, indem die vorhandenen Funktionen für einen einzelnen Satz wie unten gezeigt kombiniert werden.

Sie können die folgenden Funktionskombinationen verwenden, um Select Case auf einen bestimmten Satz in Excel anzuwenden.
- Nehmen Sie den ersten Buchstaben des angegebenen Textes mit der Funktion LEFT () und wandeln Sie ihn mit der Funktion UPPER () in Großbuchstaben um:
=UPPER(LEFT(A1,1))
- Nehmen Sie den Rest des Textes, indem Sie die Funktionen RIGHT () und LEN () miteinander kombinieren, und wandeln Sie ihn mit der Funktion LOWER () in Kleinbuchstaben um:
=LOWER(RIGHT(A1,LEN(A1)-1))
- Verketten Sie diese beiden Ergebnisse schließlich mit der Funktion CONCAT ():
=CONCAT(UPPER(LEFT(A1,1)),LOWER(RIGHT(A1,LEN(A1)-1)))
Dadurch wird der Text in Satzbuchstaben umgewandelt. Sie können dies auch für den gesamten großgeschriebenen Text testen, der in der Zelle A2 angezeigt wird.
Was ist, wenn eine Zelle mehr als einen Satz enthält, den Sie in Satzfall ändern möchten?

Eine Möglichkeit hierfür könnte die Verwendung von VBA sein, um diese Transformation durchzuführen.
SENTENCECASE()
Die benutzerdefinierte Funktion verwendet den angegebenen Text, verarbeitet den Text für drei Satzzeichen (Punkt, Fragezeichen und Ausrufezeichen), um die mehreren Sätze zu finden, den ersten Buchstaben jedes Satzes groß zu schreiben und das Ergebnis zurückzugeben.
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()
Die Funktion verwendet eine Hilfsfunktion, die aufgerufen wird splitAndTransform()
, um Sätze zu teilen und den Fall durch das angegebene Trennzeichen zu transformieren. splitAndTransform()
ist eine wiederverwendbare VBA-Funktion in diesem Projekt, daher wird sie als separate Hilfsfunktion geschrieben.
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()
Die Hilfsfunktion verwendet eine andere Hilfsfunktion namens isPuncMarked()
, die definiert, ob der angegebene Text am Ende ein Interpunktionszeichen enthält. Auch wenn es im Modul nicht wiederverwendet wird, gibt die Funktion isPuncMarked () einen booleschen Wert zurück, und die Aufruferfunktion befasst sich nur mit dem zurückgegebenen Wert, aber mit der Funktionsweise. Es ist immer eine gute Praxis, diese Logik auch zu trennen, um eine bessere Lesbarkeit in abhängigen Prozeduren zu gewährleisten.
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 ist das Ergebnis.

Im Idealfall empfiehlt es sich, eine Prozedur zu schreiben, die den ausgewählten Bereich übernimmt, und den gesamten Inhalt durch die Verwendung von Satzfall anstelle einer benutzerdefinierten Funktion zu ersetzen. Dies kann durch Hinzufügen der folgenden Unterprozedur zum Projekt erfolgen, die die Massen- und permanente Transformation anwendet.
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