(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