情シス担当の備忘録

VBA・労働法とか。

【ExcelVBA】手作りRPAでのミスの備忘録(keybd_event)

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が闇に葬られてしまったんだと思います。

詳しい理屈はわかりません。でも、動けばヨシ!!!!!

偶然この記事にたどり着いたかたのお役に立てば幸いです。