ExcelVBA SendKeysとKeybd_event

いままでSendKeysで処理していて、非常に困ってた部分がありました。
たとえば、SendKeysを含む処理のトリガーとなるのが、Shift+何かのキー入力のときとか。


一例を挙げると、Shift+Iを押したときに、F2(セルの編集)を押したことにしたかったのですよ。
ただ、普通にSendKeysでF2を送ると、Shift+Iを押してるわけですから、処理としてはShift+F2(+I)で処理されちゃうわけです。
で、Shift+F2っていうのは「コメントの挿入」のショートカットなので、そっちが発動しちゃう。


これを避けるために、2通り考えました。
1つはSendKeysで処理するのではなく、直接F2の効果(セルの編集)の命令を送る方法。
1つはSendKeysの前に「Shiftを離す」処理を入れる方法。


ちょっと別の部分でも思うところがあり、最初前者で当たってみました。
具体的には、WinAPIのPostMessageを。
しかし、これはなかなか難しそうという結果に。
そもそも、F2と同じ効果のメッセージがわからねーっす。


で、次に後者を試してみました。
「Shiftを離す」もPostMessageかな?と思ってたら、ちょうどキーを送る命令がWinAPIにありました。それがKeybd_eventです。
コードにすると、こんな感じです。

'WinAIP使う準備
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal _
   bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Const KEYEVENTF_KEYUP = &H2

〜中略〜

'Shift+Iを押したときにここに来るように中略部で設定してある。
Function insertI_S()
    keybd_event 16, 0, KEYEVENTF_KEYUP, 0   'Shift離す
    keybd_event 113, 0, 0, 0    'F2
End Function

最初、後ろの「keybd_event 113, 0, 0, 0 'F2」を「SendKeys "{F2}"」でやってたんですけど、これだとなぜか上手くいかず。
やっぱりSendKeysは不安定なので、keybd_eventで統一しちゃった方がよさそうですね〜。
SendKeysは使っててヒヤヒヤしてたので、この機会に全部こっちにしちゃおうかと〜。
……まぁ、いまさらWinAPI使うのもなんだかなーな気分ではあるんですけどw