Access等でSendKeys "{TAB}"でNumLockが切り替わるのを避けるコード
VBAの中でも特に便利な SendKeys メソッドですが、実はかなり糞な実装なので、TABキー連打をエミュレートして入力項目を動いていくようなコードを書くと、いきなりNumLockが点いたり消えたりしはじめます。
お客さんがテンキー環境でシステムを使っていて、気が付いたらテンキーが使えなくなっている、という現象を聞き、「ああ、あれね」という感じでした。Web上でも愚痴っぽい話やら回避コードやらが多数掲載されており(この回避コードはうまく動かないモノも多いが(汗))、はっきり言ってメジャーな問題です。
公式のレポートを読むと
2 つ以上の SendKeys ステートメントが連続して実行されると、NumLock キーがオフになります。この問題は、CapsLock キーと ScrollLock キーにも影響することがあります。
と書かれてあるものの、基本的に直すつもりは無いようです(かなり昔から実装・発覚していて未だにパッチが当たってないので)。
ので、これを回避するためのコード*1を書く羽目に。まさにMSの尻ぬぐいですが、短いコードで済んだので今回はガマン。
Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, _ ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Public Const KEYEVENTF_KEYUP = &H2 Public Const VK_TAB = &H9 '[TAB] Public Sub StepNext() Call keybd_event(VK_TAB, 0, 0, 0) Call keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP, 0) End Sub
上記の StepNext を呼ぶと、TABキーを1回押します。連打しても問題ありません。これをもっと拡張してオリジナルのSendKeysを書いても良いんですが、そんな時間ありませんw
誰か作って下さい(他力本願)。かなり需要はあると思いますが(既に遅い?)