和風スパゲティのレシピ

日本語でコーディングするExcelVBA

キーボード入力を送信する - SendKeysメソッド

キーボードから入力したかのようにキー操作を送信する、
SendKeysステートメントを解説します。

基本構文

Application.SendKeys キー指定文字列, [ wait ]

サンプルコード

Application.SendKeys "ABC" ' A→B→Cの順にキー送信

Application.SendKeys "^s" ' Ctrl+Sを送信

Application.SendKeys "^s", True ' Ctrl+Sを送信し、保存完了を待つ※

Application.SendKeys "{F1}" ' F1キーを送信

Application.SendKeys "{TAB 5}" ' Tabキーを5回送信

解説

SendKeysメソッドを使用すると、
キーボードから入力したかのようにキー操作を送信することができます。

Ctrl/Alt/Shiftなどの同時押し用のキーを送信したい場合は、
以下の対応記号を同時押しキーの前に挿入してください。

対象キー 指定文字
Ctrl ^
Shift +
Alt %


第2引数「wait」をTrueにすると、
キーが送信されたアプリから反応が返るのを待ってくれます。

Application.SendKeys "^s", True ' Ctrl+Sを送信し、保存完了を待つ※

このコードは「上書き保存」が終わるのを待って次の行に進むイメージです。

と言いつつ、このwaitは挙動が安定しているわけではなく、
また、そもそも反応を返してくれるアプリではない場合もあります。


「気持ち待ってくれる」程度に認識しておき、確実に待ちたい場合は、
何らかの方法で処理が完了したかを調べてから次コードに移ってください。


SendKeysメソッドは{F1}のような記述を使って、
ほぼすべてのキーを送信することができます。

各キーの指定文字列は以下の通りです。

対象キー 指定文字
BackSpace {BACKSPACE} または {BS}
Break {BREAK}
CapsLock {CAPSLOCK}
Clear {CLEAR}
Delete または Del {DELETE} または {DEL}
End {END}
Enter (テンキー) {ENTER}
Enter ~
Esc { ESCAPE} または {ESC}
Help {HELP}
Home {HOME}
Ins {INSERT}
NumLock {NUMLOCK}
PageDown {PGDN}
PageUp {PGUP}
Return {RETURN}
ScrollLock {SCROLLLOCK}
Tab {TAB}
{UP}
{DOWN}
{LEFT}
{RIGHT}
F1 ~ F15 {F1} から {F15}

使用例

Excelの操作をわざわざキー送信に頼る場面はほとんどないため、
主にほかのアプリケーションを操作する際などに利用します。

例えば「あるアプリの第6入力欄の値をとってくる」ような場合は、

AppActivate "アプリ名" ' 対象のアプリをアクティブに
Application.SendKeys "{F1}" ' F1にセットされた機能を実行
Application.Wait [Now() + "00:00:10"] ' 10秒待機
Application.SendKeys "{TAB 5}" ' Tabキーを5回送信
Application.SendKeys "{^a}" ' 全選択
Application.SendKeys "{^c}" ' コピー
AppActivate Application.Caption ' Excelをアクティブに
ThisWorkbook.Worksheets(1).Activate
ThisWorkbook.Worksheets(1).Range("A1").Select
Application.SendKeys "{^v}" ' ペースト

このようにして疑似RPAを作ることができます。

※ Ctrl+Vのペーストは「Range.PasteSpecial(xlPasteAll)」でもOK


ただし、SendKeys自体が不安定なことと、
アプリ側がキー操作をどの程度正確に受け取るかも不安定なため、
この方法で実装したマクロはやや正確性に欠きます。


取ってきた値は正しいかどうかをしっかりチェックしてから使用しましょう。

NumLockが押されてしまう問題

SendKeysメソッドのちょっと困る仕様として、
なぜかNumLockが押されてしまうことがあります。

これは数字キーの有無にかかわらず発生するようで、
端的に言えば不具合(バグ)の類と言えるもののようです。


残念ながらこの問題はExcelのSendKeysメソッドでは解決できません。

この問題に対応する場合は、ApplicationのSendKeysではなく、
WScript.ShellオブジェクトのSendKeysメソッドを使用して下さい。

Sub WshShellオブジェクトのSendKeysを使用してキー操作を送信する()
    
    Dim wshShell As Object
    Set wshShell = CreateObject("WScript.Shell")

    wshShell.SendKeys "^s", True

End Sub

SendKeysの親がApplicationからwshShellに変わっただけで、
引数の種類や指定方法は全く同じものとなります。

NumLockの問題に困った場合は、こちらのコードを使用してください。


よくSendKeysメソッドを使用する方は、
WshShellオブジェクトのSendKeysを汎用関数化しておくのもおすすめです。

Sub WshShellオブジェクトのSendKeysを使用してキー操作を送信する()
    
    wshSendKeys "^s", True

End Sub
    
' WshShellのSendKeysを使用する汎用関数
Public Sub wshSendKeys(Keys As String, Optional Wait As Boolean = False)
    Static wshShell As Object
    If wshShell Is Nothing Then Set wshShell = CreateObject("WScript.Shell")
    Call wshShell.SendKeys(Keys, Wait)
End Sub