🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA SendKeys in Excel — Syntax, Tastencodes und warum es scheinbar in falscher Reihenfolge läuft

|

VBA SendKeys in Excel — Syntax, Tastencodes und warum es scheinbar in falscher Reihenfolge läuft

TL;DR — SendKeys drückt keine Tasten. Es legt Tastenanschläge in eine Warteschlange, und das Fenster, das beim Auslesen den Fokus hat, bekommt sie. Zwei Folgen erklären fast jede Beschwerde darüber. An Excel gesendete Tasten werden erst gelesen, wenn Ihr Makro die Kontrolle abgibt — am Ende oder bei DoEvents —, die Zeilen nach SendKeys laufen also zuerst. Und an ein anderes Programm gesendete Tasten landen in dem Fenster, das gerade den Fokus hat, wenn sie ankommen, und das ist nicht unbedingt das gemeinte. Zeichen wie + ^ % ~ ( ) sind Codes, ein wörtliches 50% müssen Sie also als 50{%} schreiben. Verwenden Sie SendKeys nur als letzte Zeile eines Makros, um Excels eigene Oberfläche für den Benutzer in einem bestimmten Zustand zu hinterlassen. Für alles andere gibt es einen Objektmodell-Aufruf, der die Aufgabe direkt erledigt.

Sub EditNoteCell()
    Range("D2").Select
    SendKeys "{F2}"                 ' letzte Zeile: der Benutzer landet im Bearbeitungsmodus in D2
End Sub

Dies ist der dritte Artikel einer Reihe über Makros, die Excel für Sie startet: per Tastenkombination, per Uhrzeit mit OnTime und hier über vorgetäuschte Tastenanschläge. Die Idee der Reihe: Keiner dieser Wege ruft etwas direkt auf. Jeder legt eine Anforderung in eine Warteschlange, und sie wird erledigt, wenn Excel untätig und bereit ist. Bei SendKeys ist die Anforderung ein Tastenanschlag, und die Warteschlange ist die Tastatureingabe des Fensters, das gerade vorn liegt.

Was Sie lernen

  • Das mentale Modell: Tastenanschläge in einer Warteschlange, zugestellt an das Fenster mit Fokus
  • Syntax, Tastencodes und wie Sie Sonderzeichen wörtlich senden
  • Warum SendKeys scheinbar in falscher Reihenfolge läuft
  • Fokus, das falsche Fenster und warum es nicht unbeaufsichtigt laufen kann
  • Der Nebeneffekt mit der Num-Taste
  • Die wenigen Aufgaben, für die SendKeys richtig ist, und was Sie stattdessen verwenden

Das mentale Modell: Tastenanschläge in einer Warteschlange

Wenn Sie eine Taste drücken, legt Windows sie in die Eingabewarteschlange des Fensters mit dem Fokus, und das Programm liest sie, sobald es dazu kommt. SendKeys schreibt in genau diese Warteschlange, als wären die Tasten getippt worden.

SendKeys bestimmt also, was getippt wird, aber nicht, wann es gelesen wird und wer es liest:

  • Wann: Das empfangende Programm liest seine Warteschlange, wenn es frei ist. Ist der Empfänger Excel, ist Excel gerade damit beschäftigt, Ihr Makro auszuführen — es liest die Tasten also erst, wenn Ihr Makro die Kontrolle abgibt.
  • Wer: Die Tasten gehen an das Fenster, das im Moment des Auslesens den Fokus hat, nicht an das Fenster, an das Sie beim Schreiben der Zeile gedacht haben.

Behalten Sie diese beiden Fragen im Kopf, und das seltsame Verhalten wird vorhersehbar.

Syntax und Tastencodes

Es gibt zwei Formen mit denselben Argumenten:

SendKeys "^c"                       ' VBA-Anweisung
Application.SendKeys "^c"           ' Methode von Excel
SendKeys "~", True                  ' Wait:=True, warten bis die Tasten verarbeitet sind

Die meisten Tasten schreiben Sie einfach als sich selbst: SendKeys "abc" tippt abc. Zusatztasten und benannte Tasten haben Codes:

Code Taste
^ Strg, etwa ^s für Strg+S
+ Umschalt, etwa +{F10} für Umschalt+F10
% Alt, etwa %{DOWN} für Alt+Pfeil unten
~ oder {ENTER} Enter
{TAB}, {ESC}, {BS}, {DEL} Tab, Esc, Rücktaste, Entf
{UP}, {DOWN}, {LEFT}, {RIGHT} Pfeiltasten
{HOME}, {END}, {PGUP}, {PGDN} Navigation (Pos1, Ende, Bild auf, Bild ab)
{F1} bis {F16} Funktionstasten
{LEFT 3} eine Taste, dreimal wiederholt
+(abc) Umschalt gedrückt, während a, b und c gedrückt werden

Für die Windows-Taste und für Druck gibt es keinen Code, und mit SendKeys können Sie keine Maus klicken.

Sonderzeichen müssen in geschweifte Klammern

Weil + ^ % ~ ( ) Codes sind, lassen sie sich nicht als Text tippen. Das hier sendet 50 und drückt dann Alt:

SendKeys "Discount 50%"             ' falsch: % bedeutet Alt
SendKeys "Discount 50{%}"           ' richtig: die Klammern machen es woertlich

Einzuklammern sind die Zeichen + ^ % ~ ( ) { } [ ]. Kommt der Text aus einer Zelle oder vom Benutzer, maskieren Sie ihn in einer Funktion statt von Hand:

Function EscapeKeys(ByVal s As String) As String
    Dim i As Long, ch As String, result As String
    For i = 1 To Len(s)
        ch = Mid$(s, i, 1)
        If InStr("+^%~(){}[]", ch) > 0 Then
            result = result & "{" & ch & "}"
        Else
            result = result & ch
        End If
    Next i
    EscapeKeys = result
End Function

Warum SendKeys scheinbar in falscher Reihenfolge läuft

Das ist die häufigste Frage überhaupt: Der Code nach SendKeys läuft, bevor die Tasten ankommen. Ein typisches Beispiel:

Sub CopyWithKeys()
    Range("A1:C10").Select
    SendKeys "^c"                   ' eingereiht, noch nicht gelesen
    Worksheets("Report").Paste      ' laeuft jetzt: die Zwischenablage ist noch leer
End Sub

SendKeys hat Strg+C in Excels Warteschlange gelegt und ist sofort zurückgekehrt. Excel liest die Warteschlange, wenn es frei ist — und frei ist es nicht, es führt ja gerade CopyWithKeys aus. Also läuft Paste zuerst, und das Kopieren passiert erst nach dem Ende des Makros. Wait:=True hilft hier nicht, denn Excel kann an sich selbst gerichtete Tasten nicht verarbeiten, solange Ihr Code noch läuft. Ein DoEvents nach dem SendKeys lässt die Tasten manchmal durch und manchmal nicht — und das ist schlimmer als nie.

Daraus folgt die Regel: An Excel gesendete Tasten gehören in die letzte Zeile des Makros. Was danach passieren muss, darf nicht von ihnen abhängen. Und hier ist die richtige Antwort gar nicht, das Timing zu reparieren, sondern das Objektmodell zu verwenden, das genau dann ausgeführt wird, wenn die Zeile läuft:

Range("A1:C10").Copy Destination:=Worksheets("Report").Range("A1")

Die Anleitung zu Kopieren und Einfügen behandelt alle Kopiermethoden.

Der Fokus entscheidet, wer die Tasten bekommt

Senden Sie Tasten an ein anderes Programm, übernimmt die zweite Frage: Wer hat den Fokus, wenn die Tasten gelesen werden?

Shell "notepad.exe", vbNormalFocus
Application.Wait Now + TimeSerial(0, 0, 1)   ' hoffen, dass Notepad bis dahin bereit ist
SendKeys "Monthly total: 1250~"

Öffnet sich der Editor zu langsam, kommen die Tasten stattdessen in Excel an und landen in einer Zelle. Holt sich in dieser Sekunde eine Benachrichtigung, eine E-Mail oder ein Chatfenster den Fokus, geht der Text dorthin. Bei gesperrtem Bildschirm oder minimierter Remotesitzung gehen die Tasten ins Leere. Und Windows blockiert Tasten von einem normalen Programm an ein Programm, das als Administrator läuft — SendKeys in ein Fenster mit erhöhten Rechten bewirkt also stillschweigend gar nichts.

Damit ist die Regel für unbeaufsichtigte Abläufe absolut: SendKeys kann nicht laufen, wenn niemand zuschaut. Ein Makro, das per OnTime oder über die Aufgabenplanung startet und SendKeys verwendet, tippt früher oder später an die falsche Stelle. Um ein anderes Programm zu steuern, verwenden Sie dessen Objektmodell über CreateObject, oder starten Sie es mit Argumenten über Shell.

Der Nebeneffekt mit der Num-Taste

Ein seit Langem bekannter Nebeneffekt: Auf vielen Windows-Rechnern schaltet die VBA-Anweisung SendKeys die Num-Taste (Num Lock) aus und beeinflusst manchmal auch die Feststelltaste. Benutzer merken, dass ihr Ziffernblock nach dem Ausführen Ihres Makros nicht mehr funktioniert.

Code, der {NUMLOCK} sendet, um sie wieder einzuschalten, schaltet sie nur erneut um — auf manchen Rechnern stimmt das danach, auf anderen nicht. Application.SendKeys soll das seltener verursachen als die Anweisung, verlässlich ist aber keines von beiden. Die echte Lösung ist dieselbe wie für alles andere auf dieser Seite: weniger Tasten senden. Ein Makro, das SendKeys nur einmal verwendet, als letzte Zeile, fällt damit selten auf.

Die Abwägung: ein letzter Ausweg, für Excels eigene Oberfläche

SendKeys taugt für genau eine Art von Aufgabe: Excels eigene Oberfläche für den Benutzer in einem bestimmten Zustand zu hinterlassen, als letzte Zeile eines Makros. Eine Zelle mit {F2} in den Bearbeitungsmodus zu versetzen oder ein Filter-Dropdown mit %{DOWN} aufzuklappen, ist vertretbar: Der Benutzer sitzt davor, und nichts in Ihrem Code hängt vom Ergebnis ab.

Für alles andere gibt es einen direkten Aufruf, der läuft, wenn die Zeile läuft — mit jedem Tastaturlayout und egal, welches Fenster vorn liegt:

Wofür man Tasten sendet Stattdessen verwenden
^c, ^v zum Kopieren und Einfügen Range.Copy, PasteSpecial
^s zum Speichern ThisWorkbook.Save
~, um eine Excel-Abfrage zu beantworten Application.DisplayAlerts = False
%-Tastenfolgen für einen Befehl im Menüband Application.CommandBars.ExecuteMso "PasteValues"
einen integrierten Dialog öffnen Application.Dialogs(xlDialogPrint).Show
in ein anderes Programm tippen dessen Objektmodell über CreateObject

Tastenfolgen wie Alt, H, V, V hängen außerdem von der Office-Sprache ab: Die Zugriffstasten im Menüband unterscheiden sich zwischen englischem, deutschem und spanischem Excel. Im deutschen Excel ist schon die Registerkarte Start nicht über H erreichbar, eine auf englischem Excel geschriebene SendKeys-Folge läuft hier also ins Leere oder löst einen ganz anderen Befehl aus — und umgekehrt. Die Aufrufe in der rechten Spalte haben dieses Problem nicht; ExecuteMso kennt die Befehle unter ihrem sprachunabhängigen Namen. Die DisplayAlerts-Anleitung zeigt, wie Sie Excels eigene Abfragen behandeln, ohne eine einzige Taste zu drücken.

Wie ExcelMaster hilft

SendKeys-Code funktioniert meist auf dem Rechner, auf dem er geschrieben wurde, an dem Tag, an dem er geschrieben wurde. Er bricht auf einem anderen Tastaturlayout, einem langsameren PC, mit einer anderen Office-Sprache oder beim ersten Mal, wenn eine Benachrichtigung den Fokus stiehlt.

ExcelMaster liest das Makro, ermittelt, was jede SendKeys-Zeile eigentlich erreichen will, und ersetzt sie durch den Objektmodell-Aufruf, der dieselbe Aufgabe direkt erledigt — damit das Makro nicht mehr von Timing, Fokus oder Tastaturlayout abhängt.

Häufig gestellte Fragen

Wie sende ich mit SendKeys die Enter-Taste?

Verwenden Sie SendKeys "~" oder SendKeys "{ENTER}". Die Tilde ist die Haupt-Eingabetaste; {ENTER} ist die Enter-Taste auf dem Ziffernblock, und beides funktioniert in den meisten Programmen.

Warum funktioniert SendKeys in meinem Makro nicht?

Meist funktioniert es — nur später als erwartet: An Excel gesendete Tasten werden gelesen, nachdem Ihr Makro die Kontrolle abgegeben hat, die Zeilen nach SendKeys laufen also zuerst. An ein anderes Programm gesendete Tasten gehen an das Fenster, das beim Auslesen den Fokus hat. Setzen Sie SendKeys in die letzte Zeile oder ersetzen Sie es durch einen Objektmodell-Aufruf.

Warum schaltet SendKeys die Num-Taste aus?

Das ist ein seit Langem bekannter Nebeneffekt der VBA-Anweisung SendKeys unter Windows. {NUMLOCK} zurückzusenden schaltet nur um und ist nicht verlässlich. Verwenden Sie SendKeys so sparsam wie möglich.

Was ist der Unterschied zwischen SendKeys und Application.SendKeys?

SendKeys ist die VBA-Anweisung, Application.SendKeys die Methode von Excel. Beide nehmen dieselben Tastencodes und dasselbe Argument Wait. Beide schreiben in die Eingabewarteschlange des Fensters mit Fokus.

Wie sende ich mit SendKeys ein Prozent- oder Pluszeichen?

Setzen Sie es in geschweifte Klammern: {%}, {+}, {^}, {~}, {(} und {)}. Ohne Klammern werden diese Zeichen als Alt, Umschalt, Strg, Enter und Gruppierungscodes gelesen.

Getestet in

Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 03.10.2026.

Verwandte Anleitungen: VBA Shortcut Key · VBA OnTime · VBA Copy Paste · VBA DisplayAlerts · VBA DoEvents · VBA Shell · VBA CreateObject · VBA Wait