2 つ以上の SendKeys ステートメントが連続して実行されると、NumLock キーがオフになる。
この問題は、CapsLock キーと ScrollLock キーにも影響することがあるらしい。
と、Microsoftのサポートにはあるが、1つのステートメントでもオフになる現象が起こっている。
http://support.microsoft.com/kb/179987/ja
<原因-抜粋>
この問題は、1 つ目の SendKeys ステートメントの実行中に 2 つ目の SendKeys ステートメントの実行が開始されるために発生します。
1 つ目の SendKeys ステートメントは、キーボードの状態を保存したうえで、NumLock、CapsLock、ScrollLock をすべてオフにします。
2 つ目の SendKeys ステートメントが実行されるのは、1 つ目の SendKeys ステートメントによるキー ストロークの送信とキーボードの状態の復元が行われる前です。
2 つ目の SendKeys ステートメントの実行時にもキーボードの状態が保存されますが、このとき保存されるのは、それらのキーがすべてオフになっている状態です。最終的に、キーボードの状態は後から保存された状態 (それらのキーがすべてオフになっている状態) で復元されます。
<回避策>WSHをSendKeysの後に実行する
'====================================================== ' SendkeysでNumlockがOFFになるバグを回避する ' WSH(Windows Scripting Host) '====================================================== Sub numlock_onoff() Dim WshShell Set WshShell = CreateObject("WScript.Shell") WshShell.SendKeys "{NUMLOCK}" Set WshShell = Nothing End Sub
‘入力リストを展開する
SendKeys “%{down}”
Call numlock_onoff
2021年6月追記「WshShellのSendKeysをラップする」
VBAのApplication.SendKeysメソッドの使用をやめ、全面的にWshScriptのSendKeysメソッドに置き換える方法が掲載されています。
-以下抜粋-
WshShellのSendKeysを使えば良い、といっても参照設定を追加するのも面倒だし、CreateObjectするのも面倒、ということでサブルーチン化したものがこちらです。
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
毎回CreateObjectすると負荷が大きくなるので、Static宣言+存在判定をしています。
代わりにオブジェクトを破棄する方法が無くなるので、wshShellオブジェクトがメモリに残り続けます。
三角猫
2016年3月19日 at 12:34 PMVBAのSendKeysが勝手にNumLockを切り替えてしまう不具合の解決策を探し求めて、こちらに辿り着きました。記事のおかげで解決しました。ありがとうございました。
VBAのSendKeysを全てWshShell.SendKeysに置き換えれば、NumLockをいじる必要がないですね。
Santa Network
2016年3月22日 at 2:21 PMコメント、ありがとうございます。
お役に立ててよかったです。(*^^)v
キェルケゴール
2017年7月1日 at 1:34 PM<回避策>WSHをSendkyesの後に実行する ← kyes 綴り間違い一つ目
SendkyesでNumlockがOFFになるバグを回避する ← kyes 綴り間違い二つ目
綴り間違いは直してください。
1897年8月12日 11:00 PM
santane • Post Author •
2017年7月30日 at 5:14 PMキェルケゴールさん
綴り間違いのご指摘、ありがとうございました。
修正しました。(^_^;)
AccessからVBAでブラウザの入力フォームに値をセットする – Home and Abroad
2018年7月14日 at 10:43 PM[…] Office TANAKA – Excel VBA Tips[Split関数で文字列を区切る] SendKeys を実行するとNumLock キーがオフになる現象を回避 ? Santa Network [VBA]DataObjectを使ったクリップボード操作が上手くいかない場合の対処法 | […]
saimo
2020年9月26日 at 3:38 PM記事にして頂きありがとうございます。
助かりました。
santane • Post Author •
2020年9月29日 at 7:09 AMお役に立ててよかったです。
nukesaku
2021年6月1日 at 7:11 AMAccessのフォームのテキストボックスでこの現象が発生。当初、NumLockをオフで使っているのだなと思い込んでおりました。
santane • Post Author •
2021年6月2日 at 9:46 AM2013年の記事ですね。Microsoftのサポートリンクも切れていました。
現在でもWSHで回避できましたら幸いです。