keybd_eventを使った手作りRPAで、小さなミスに何時間も引っかかったので備忘録です。
実現したかった処理は以下の通りです。
①クロームで開いているYoutubeをアクティベートする。
(画面の一番前に持ってくる)
②tabキーを5回押す。
③shift+tabを1回押す。
④マクロ有効エクセルをアクティベートし、処理が終了した旨のmsgboxを表示する。
そのために書いたコードがこれです。
Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Sub 例() Dim wsh As Object '処理1 Set wsh = CreateObject("WScript.Shell") wsh.AppActivate ("Youtube - Google Chrome") 'Chromeをアクティベート Application.Wait [Now() + TimeValue("00:00:00.5")] '画面遷移待機 '処理2 Dim i As Long i = 0 Do While i <> 5 keybd_event vbKeyTab, 0, 0, 0 'tab押す keybd_event vbKeyTab, 0, &H2, 0 'tab離す Application.Wait [Now() + TimeValue("00:00:00.1")] i = i + 1 Loop '処理3 keybd_event vbKeyShift, 0, 0, 0 'shift押す keybd_event vbKeyTab, 0, 0, 0 'tab押す keybd_event vbKeyTab, 0, &H2, 0 'tab離す keybd_event vbKeyShift, 0, &H2, 0 'shift離す '処理4 wsh.AppActivate ("マクロ有効エクセル.xlsm") 'エクセルをアクティベート Set wsh = Nothing MsgBox "処理が完了しました" End Sub
これを実行すると、処理3のShift+tabは実行されず、処理4のmsgboxが表示されます。
keybd_eventの書き方は間違っていないはずなのに何故なのか・・・。
色々試してみると、処理4を全てコメントアウトしてみたら、処理3が動きました。
他にも、処理3の後にApplication.Waitを入れて少しだけ待つと動きました。
恐らく、処理3が実行し終わる前にAppActivateやMsgboxが動いてしまって、shit+tabが闇に葬られてしまったんだと思います。
詳しい理屈はわかりません。でも、動けばヨシ!!!!!
偶然この記事にたどり着いたかたのお役に立てば幸いです。