Shift F3 (ChangeCase) Umschaltung zwischen Groß- und Kleinschreibung in Word durch Übersteuern eines Word-Befehls verwenden, Beseitigung des Bugs in Tabellen

Funktion in der Benutzerschnittstelle und Bug in Tabellen

Zur komfortablen Umschaltung zwischen Groß- und Kleinschreibung gibt es in Word den Shortcut Shift F3. Er schaltet für das Wort, in dem die Einfügemarke gerade steht, zwischen Großschreibung des ersten Buchstabens, Großschreibung aller Buchstaben und Kleinschreibung um, und zwar nacheinander. Das Ergebnis von drei Betätigungen (untereinander) sieht so aus:

Blabla
BLABLA
blabla

Das funktioniert sowohl, wenn der Cursor mitten im Wort steht, als auch, wenn er hinter dem letzten Buchstaben steht. Es wird sogar noch für das aktuelle Wort umgeschaltet, wenn bereits ein Leerzeichen nach dem Wort eingegeben wurde.

Vielschreiber (vor allem auch Diktatschreiber) schätzen diese Funktion, weil man häufig beim Schreiben des Wortanfangs (nach Diktat) noch nicht erkennt, ob es sich um ein groß zu schreibendes Substantiv handelt oder nicht. Am Ende des Wortes hat der geübte Schreiber das erkannt und kann mit dem Shortcut Shift F3 schnell umschalten, ohne sich erst mit dem Cursor an den Wortanfang zu begeben, dort den falschen Kleinbuchstaben zu löschen und den richtigen Großbuchstaben einzugeben, um danach wieder ans Wortende zurückzukehren. Geübte Schreiber erzielen dadurch Zeitgewinne.

Einen kleinen Wertmutstropfen gibt es allerdings: Schreibt man innerhalb einer Tabelle und wendet den Shortcut an, so funktioniert er, wie gewohnt, solange der Cursor innerhalb eines Wortes steht. Steht er jedoch am Wortende (also vor dem Zellenende der Tabellenzelle), und man wendet gewohnheitsmäßig den Shortcut an, erstreckt sich die Umschaltung der Groß- und Kleinschreibung auf alle Wörter innerhalb dieser Tabellenzelle, so dass plötzlich alle Wörter groß geschrieben sind oder in Großbuchstaben. Das ist beim zügigen Schreiben ärgerlich, denn man muss immer daran denken, vorher mit dem Cursor wenigstens einen Buchstaben nach links zu gehen, um sich sicher innerhalb des Wortes zu befinden, ehe man den Shortcut anwendet. Der Bug besteht seit Word 97 und ist auch in der neuesten Version Word 2010 nicht behoben. Deswegen wird hier die folgende Lösung vorgestellt.

Übersteuern des Word-Befehls

Mittels der in Word bekannten Technik des Übersteuerns von Word-Befehlen (aufgrund des Prozedurnamens) soll die Funktionalität dieser Umschaltung in Word mit VBA nachgebaut werden, und zwar mit einer Sonderbehandlung für Tabellen, damit eine zuverlässige Funktionalität auch in Tabellen gewährleistet ist. Also den Ablauf mit dem Makro-Recorder aufgezeichnet. Das Ergebnis lautet:

Sub Versuch1()  
    Selection.Range.Case = wdNextCase
End Sub  

Beim Ausprobieren des Verhaltens dieser einen Code-Zeile zeigt sich ein interessanter Effekt: Es macht nicht das Gleiche wie der Shortcut Shift F3! Steht man nämlich mit dem Cursor innerhalb eines Wortes und wendet dieses Makro an, so wird zwar die Groß-/Kleinschreibung umgeschaltet, jedoch steht der Cursor danach am Ende des Wortes und nicht mehr, wie zu Beginn, innerhalb des Wortes. Der aufgezeichnete Code macht also nicht das Gleiche wie der interne Word-Befehl! Wie nicht anders zu erwarten, wird es in Tabellen auch nicht besser.

Der Prozedurname ChangeCase, der erforderlich ist, damit das Makro den Word-Befehl übersteuert (allein wegen des Prozedurnamens) ist zwar schnell ausgemacht, aber an dem Code muss noch gearbeitet werden. Natürlich könnte man nun die Funktionalität des Word-Befehls exakt nachbauen: also am Anfang der Prozedur die Cursorposition »merken«, dann die Befehlszeile, danach wieder an die ursprüngliche Position zurückkehren. Dann wird noch die Sonderbehandlung für die Tabellen benötigt, dazu muss erkannt werden, ob der Cursor innerhalb eines Wortes steht, oder vor dem Ende der Tabellenzelle oder eines Leerzeichens.

Internen Word-Befehl trotz Übersteuerung verwenden

Hier kam ich nun auf die Idee, den deutschen Prozedurnamen zu verwenden, um den Word-Befehl zu übersteuern, so dass die Prozedur anspringt, wenn der Benutzer den Shortcut Shift F3 drückt. Damit muss die Originalfunktionalität von ChangeCase nicht unbedingt nachgebaut werden, sondern man hat mit Application.Run sogar die Möglichkeit, den Originalbefehl trotzdem zu benutzen. Es leuchtet ein, dass dies nur in einer nicht englischen Version funktionieren kann. Und so sieht die Prozedur aus:


Sub GroßKleinschreibungÄndern()  
' @ Nora Richter  
' baut die Funktion ChangeCase (Shift F3) nach  
' mit Sonderbehandlung in Tabellen, wo die Word-eigene Funktion "spinnt"  
' trägt den deutschen Befehlsnamen  
' damit kann mit Application.Run der englische Befehl noch aufgerufen werden!  
    Dim rng As Word.Range

    If Selection.Information(wdWithInTable) Then
        Set rng = Selection.Range.Duplicate
        rng.MoveEnd wdCharacter, 1
        Select Case Asc(rng.Characters.Last)
            Case 32, 13
             '32 = Leerzeichen, 13 = Absatzmarke  
                Selection.MoveLeft wdCharacter, 1
                Application.Run "ChangeCase"
                Selection.MoveRight wdCharacter, 1
            Case Else
                Application.Run "ChangeCase"
        End Select
        Set rng = Nothing
    Else
        Application.Run "ChangeCase"
    End If
End Sub  

Nachbau des Word-Befehls zur Verwendung auch in englischer Version und allen anderen Sprachversionen

Natürlich soll auch noch die Lösung geliefert werden, wie der Word-Befehl für alle Sprachversionen nachgebaut werden kann. Die folgende Prozedur ChangeCase entspricht der Prozedur GroßKleinschreibungÄndern. Sie stellt die Sonderbehandlung für die Tabellen bereit. Der Prozedurname ChangeCase sorgt dafür, dass die Prozedur anspringt, wenn der Shortcut Shift F3 angewendet wird. Die Prozedur myCase bildet die Original-Wordfunktion ChangeCase nach und wird von unserer Prozedur ChangeCase aufgerufen.


Sub ChangeCase()  
' @ Nora Richter  
' baut die Funktion ChangeCase (Shift F3) nach  
' mit Sonderbehandlung in Tabellen, wo die Word-eigene Funktion "spinnt"  
' substitutes Word's Function ChangeCase  
' with special handling for tables where Word's function is buggy  
    Dim rng As Word.Range

    If Selection.Information(wdWithInTable) Then
        Set rng = Selection.Range.Duplicate
        rng.MoveEnd wdCharacter, 1
        Select Case Asc(rng.Characters.Last)
            Case 32, 13
             '32 = Leerzeichen (space), 13 = Absatzmarke (return)  
                Selection.MoveLeft wdCharacter, 1
                Call myCase
                Selection.MoveRight wdCharacter, 1
            Case Else
                Call myCase
        End Select
        Set rng = Nothing
    Else
        Call myCase
    End If

End Sub  

Sub myCase()  
    Dim rng As Word.Range
    Dim lngAnfang As Long
    Dim lngEnde As Long
    Set rng = Selection.Range.Duplicate
    lngAnfang = rng.Start
    lngEnde = rng.End
    rng.Case = wdNextCase
    rng.SetRange Start:=lngAnfang, End:=lngEnde
    rng.Select
    Set rng = Nothing
End Sub              
Schreibbüro Richter, Georg-Schumann-Str. 8, 04105 Leipzig, Tel.: (03 41) 59 008 95