(1) VBAでマウスを自動操作する方法
(1-1) マウス操作のために利用する仕組み
(1-2) 構文(HelloWorld)
(1-3) サンプルプログラム
(1) VBAでマウスを自動操作する方法
当記事ではVBAを使ったマウス操作の基本と、サンプルプログラムや操作動画を紹介します。
(1-1) マウス操作のために利用する仕組み
マウス操作にはWindows APIとして提供されるUser32.dllライブラリの関数を利用します。具体的には次の2つの関数を利用します。
(表1)
Windows API名称 | 引数 | 説明 |
SetCursorPos | (ByVal x As Long, ByVal y As Long) | ・カーソル(マウスポインタ)を操作するためのAPIです。 ・引数に画面上の座標(x,y)を引数で指定して、マウスポインタを移動させます。 ・第一引数「x」は画面左端からのピクセル数です。 ・第二引数「y」は画面上端からのピクセル数です。 |
mouse_event | ( _ ByVal dwFlags As Long, _ Optional ByVal dx As Long = 0, _ Optional ByVal dy As Long = 0, _ Optional ByVal dwData As Long = 0, _ Optional ByVal dwExtractInfo As Long = 0) |
・マウスポインタの操作やボタン押下行うためのAPIです。 ・第一引数(dwFlags)の数字を用いてマウスポインタの動作を指示します。 ・例えば引数「2」はマウスの「左クリックを押す」という意味で、引数「4」はマウスの「左クリックを離す」という意味です。 ・通常の感覚では「押す」と「離す」は1セットの動作に思えますが、ここでは区別がされています。 ・第四引数(dwData)はマウスホイールの移動を行う場合のホイールの移動量を指定します。 |
(参考)Windows API
https://docs.microsoft.com/ja-jp/windows/win32/apiindex/windows-api-list?redirectedfrom=MSDN
(図111)
またmouse_eventの引数については次の種類があります。
(表2)
引数 | パラメータ | 機能 |
2 | MOUSEEVENTF_LEFTDOWN | マウス「左」ボタンDOWN(押した) |
4 | MOUSEEVENTF_LEFTUP | マウス「左」ボタンUP(離した) |
20 | MOUSEEVENTF_MIDDLEDOWN | マウス「中央」ボタンDOWN(押した) |
40 | MOUSEEVENTF_MIDDLEUP | マウス「中央」ボタンUP(離した) |
8 | MOUSEEVENTF_RIGHTDOWN | マウス「右」ボタンDOWN(押した) |
10 | MOUSEEVENTF_RIGHTUP | マウス「右」ボタンUP(離した) |
800 | MOUSEEVENTF_WHEEL | マウスホイール移動 (移動量は引数「dwData」で指定) |
(1-2) 構文(HelloWorld)
(1-2-1) SetCursorPos関数
SetCursorPos関数の構文です。これを実行するとマウスポインタが(100px,210px)の位置に移動します。
'SetCursorPos の定義 Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long 'マウスを(100px,210px)の位置に移動 Sub click() SetCursorPos 100, 210 End Sub
(1-2-2) mouse_event関数
mouse_event関数の構文です。これを実行するとマウスポインタが(100px,210px)の位置に移動した後にマウスをクリックします。
'SetCursorPos の定義 Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long 'mouse_eventの定義 Declare Sub mouse_event Lib "user32" ( _ ByVal dwFlags As Long, _ Optional ByVal dx As Long = 0, _ Optional ByVal dy As Long = 0, _ Optional ByVal dwData As Long = 0, _ Optional ByVal dwExtractInfo As Long = 0) Sub click2() 'マウスを(100px,210px)の位置に移動 SetCursorPos 100, 210 'マウスを左クリック(押す) mouse_event 2 'マウスを左クリック(離す) mouse_event 4 End Sub
(1-3) サンプルプログラム
サンプルプログラムを紹介します。このプログラム画面(JSP)にある4つのボタンを順番に押していくプログラムです。VBA側では現在の処理中ボタンや、次のボタン押下までのカウントダウンをおこないます。
(操作動画)完成品を操作したのが下記動画です
(図131)
(サンプルプログラム)
Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long Declare Sub mouse_event Lib "user32" ( _ ByVal dwFlags As Long, _ Optional ByVal dx As Long = 0, _ Optional ByVal dy As Long = 0, _ Optional ByVal dwData As Long = 0, _ Optional ByVal dwExtractInfo As Long = 0) Sub click() Dim w As Worksheet Set w = ThisWorkbook.Worksheets("MOut") Dim i As Integer Dim wt As Integer: wt = 3 '表示更新(★今ココ) w.Cells(16, 1).Value = "" w.Cells(4, 1).Value = "★今ココ" 'JSP画面のボタン押下 SetCursorPos 100, 210 Application.Wait [Now() + "0:00:01.1"] mouse_event 2 mouse_event 4 'カウントダウン For i = 1 To wt w.Cells(6, 3).Value = (wt + 1) - i Application.Wait [Now() + "0:00:01.1"] Next '表示更新(★今ココ、秒数) w.Cells(6, 3).Value = "" w.Cells(4, 1).Value = "" w.Cells(8, 1).Value = "★今ココ" 'JSP画面のボタン押下 SetCursorPos 100, 395 Application.Wait [Now() + "0:00:01.1"] mouse_event 2 mouse_event 4 'カウントダウン For i = 1 To wt w.Cells(10, 3).Value = (wt + 1) - i Application.Wait [Now() + "0:00:01.1"] Next '表示更新(★今ココ、秒数) w.Cells(10, 3).Value = "" w.Cells(8, 1).Value = "" w.Cells(12, 1).Value = "★今ココ" 'JSP画面のボタン押下 SetCursorPos 100, 575 Application.Wait [Now() + "0:00:01.1"] mouse_event 2 mouse_event 4 'カウントダウン For i = 1 To wt w.Cells(14, 3).Value = (wt + 1) - i Application.Wait [Now() + "0:00:01.1"] Next w.Cells(14, 3).Value = "" '表示更新(★今ココ、秒数) w.Cells(12, 3).Value = "" w.Cells(12, 1).Value = "" w.Cells(16, 1).Value = "★今ココ" '画面ボタン押下 SetCursorPos 100, 760 Application.Wait [Now() + "0:00:01.1"] mouse_event 2 mouse_event 4 End Sub