TL;DR —
SendKeysdrü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 beiDoEvents—, die Zeilen nachSendKeyslaufen 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örtliches50%müssen Sie also als50{%}schreiben. Verwenden SieSendKeysnur 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
