マウスを操作するマクロをつくるためには、事前にWindows API関数を宣言しておく必要があります。
『API』は、プログラミングの世界ではよく登場する言葉ですが『Application Programming Interface』の頭文字をとって使われています。
ものすごくカンタンに言ってしまえば、アプリとアプリをつなぐためのものです。
今回ご紹介するものは、エクセルVBAのマクロでWindowsの操作を実行を可能にするためのもので、『これからWindowsの関数をつかうよ!』と宣言する作法だと言えるでしょう。
マウスを操作するマクロで必要な3つの宣言を書くことで「マウスポインター移動」、「クリック操作」、「ポインターの座標取得」ができるようになるのでこれらの使いかたをサンプルを通して案内していきます。

APIが公開されると、他のアプリと連携できて便利になるんだよ。
オンラインスクールで現役エンジニアのサポートがあるテックアカデミーがおすすめ。
スキマ時間に学べて仕事も保証。必ず副業、始められます。まずは無料でプログラミング体験
マウスの移動やクリックを操作するAPIの宣言
ここで紹介するマクロをつくる前に、使っているパソコンが32ビットか64ビットかを確認しておきましょう。
それぞれで宣言するコードが異なりますので、簡単に確認する方法について掲載しておきます。
システムの種類(32ビット or 64ビット)の確認には、以下の方法があります。
- キーボードの[Windowsマーク]キーと[ X ]キーを同時押し
- [システム]をクリックする
- [システムの種類]を確認する
または、以下の手順でも確認ができます。(Windows 11)
- [スタート]から[設定]をクリックする
- [システム]をクリックする
- [バージョン情報]を確認する
- [システムの種類]を確認する


デバイスの仕様に以下のように表示されています。
デバイス名 XXX-XXXX
プロセッサ Intel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz 1.19 GHz
実装 RAM 16.0 GB (15.8 GB 使用可能)
デバイス ID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
プロダクト ID #####-#####-#####-XXXXX
システムの種類 64 ビット オペレーティング システム、x64 ベース プロセッサ
ペンとタッチ このディスプレイでは、ペン入力とタッチ入力は利用できません
※ここでは代替文字としてXや#のにしていますが、本来は文字や数値が入力されています。

赤字の部分を確認だね。このパソコンは64ビット版だってわかるね。
マウスを動かす操作をするために必要な宣言(SetCursorPos)
以下のコードをVBEに入力してください。
パソコンが64ビットの場合
Option Explicit
'使用しているパソコンが64ビットの場合はこちらを宣言
Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
パソコンが32ビットの場合
Option Explicit
'使用しているパソコンが32ビットの場合はこちらを宣言
Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long

マウスを移動するコードを実行したいならこれだね。
マウスをクリック操作をするために必要な宣言(Mouseevent)
以下のコードをVBEに入力してください。
パソコンが64ビットの場合
Option Explicit
'使用しているパソコンが64ビットの場合はこちらを宣言
Declare PtrSafe Sub mouse_event Lib “user32” (ByVal dwFlags As Long, Optional ByVal dx As Long = 0, Optional ByVal dy As Long = 0, Optional ByVal dwDate As Long = 0, Optional ByVal dwExtraInfo As Long = 0)
パソコンが32ビットの場合
Option Explicit
'使用しているパソコンが32ビットの場合はこちらを宣言
Declare Sub mouse_event Lib “user32” (ByVal dwFlags As Long, Optional ByVal dx As Long = 0, Optional ByVal

クリック操作をするならこれだね。
マウスの位置を取得するために必要な宣言(GetCursorPos)
以下のコードをVBEに入力してください。
パソコンが64ビットの場合
Option Explicit
'使用しているパソコンが64ビットの場合はこちらを宣言
Declare PtrSafe Function GetCursorPos Lib “user32” (lpPoint As coord) As Long
パソコンが32ビットの場合
Option Explicit
'使用しているパソコンが32ビットの場合はこちらを宣言
Declare Function GetCursorPos Lib “User32” (lpPoint As coord) As Long

マウス位置を座標で取得するならこれだね。
マウスの移動やクリック操作をするマクロ
マウスの移動やクリックなどの操作をするマクロを紹介します。
なお、連続で処理をすると一瞬でマウスの移動が完了してしまいますので、正常に動作ができているか確認するためにサンプルコードでは、指定した時間だけ処理を止めるSleep関数を使っています。
マウスを動かす操作のマクロのサンプルコード
入力するVBAコード
Option Explicit
'Sleep関数をつかうための宣言(64ビットの場合)
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'使用しているパソコンが64ビットの場合はこちらを宣言
'マウスの移動の操作をするための宣言
Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Sub マウスポインターの移動()
'マウスを移動(横500・縦400の位置) → 1
SetCursorPos 500, 400
MsgBox "マウスポインターX座標500・Y座標400"
Call Sleep(1500)'1.5秒処理をとめる
'マウスを移動(横500・縦800の位置) → 2
SetCursorPos 500, 800
MsgBox "マウスポインターX座標500・Y座標800"
Call Sleep(1500)'1.5秒処理をとめる
'マウスを移動(横1200・縦800の位置) → 3
SetCursorPos 1200, 800
MsgBox "マウスポインターX座標1200・Y座標800"
Call Sleep(1500)'1.5秒処理をとめる
'マウスを移動(横1200・縦400の位置) → 4
SetCursorPos 1200, 400
MsgBox "マウスポインターX座標1200・Y座標400"
Call Sleep(1500)'1.5秒処理をとめる
'マウスを移動(横500・縦400の位置) → 1
SetCursorPos 500, 400
MsgBox "マウスポインターX座標500・Y座標400"
End Sub
13行目
SetCursorPos 500, 400でマウスの位置をX座標500、Y座標400に移動します。
18行目
SetCursorPos 500, 800でマウスの位置をX座標500、Y座標800に移動します。
23行目
SetCursorPos 1200, 800でマウスの位置をX座標1200、Y座標800に移動します。
28行目
SetCursorPos 1200, 400でマウスの位置をX座標1200、Y座標400に移動します。
33行目
SetCursorPos 500, 400でマウスの位置をX座標500、Y座標400に移動します。

このサンプルコードでは、上の画像の[ 1 ] → [ 2 ] → [ 3 ] → [ 4 ] → [ 1 ] と書いたセル内にマウスポインターを移動させるマクロです。
実行結果についての注意点

これで移動させたい座標さえわかれば、マウスの移動はできるね。
任意の位置にマウスを動かす操作のマクロのサンプルコード
入力するVBAコード
Option Explicit
'使用しているパソコンが64ビットの場合はこちらを宣言
'マウスの移動の操作をするための宣言
Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Sub ユーザ指定の座標にマウスポインターを移動()
'座標を代入する変数を宣言する
Dim Xpos As Long, Ypos As Long
'繰り返し処理のDo Loopで不正な入力の場合はインプットボックスを表示し続ける
Do Until Xpos >= 200 And Xpos <= 1600 And Ypos >= 200 And Ypos <= 900
Xpos = Application.InputBox("X座標を200~1600の数値で入力してください。", Type:=1)
Ypos = Application.InputBox("Y座標を200~900の数値で入力してください。", Type:=1)
Loop
'入力した座標にマウスを移動する
SetCursorPos Xpos, Ypos
MsgBox "マウスポインター(X座標" & Xpos & ":Y座標" & Ypos & ")"
End Sub
10行目
座標を代入するための変数としてXposとYposを宣言します。
13行目から16行目
インプットボックスで宣言した変数に座標を代入します。XposにはX座標の数値を、YposにはY座標の数値を代入しています。
インプットボックスでは、Type引数で数値のみ入力できるように制限をしています。
くり返し文のDoLoopステートメントの条件にはXposは200以上1600以下の範囲で入力するようにユーザーに促します。
また、Yposには200以上900以下の範囲で入力するようにユーザーに促します。
仮に、それぞれの変数に入力された値が条件に指定した範囲外であれば、インプットボックスを表示し続ける動作になります。
19行目
SetCursorPos Xpos, Yposで入力した入力した座標にマウスポインターを移動します。

このサンプルコードでは、特定の範囲かつ数値のみの入力に制限しているよ。
インプットボックスによる注意点
インプットボックスはユーザーから値を受け取るためのものですが、意図しない入力がされたときにエラーが発生しないように対策をしておく必要があります。
インプットボックスで入力制限をする方法についてはこちらの記事で解説しています。
マウスのクリック操作をするマクロのサンプルコード
ここでは、マウスの操作をおこなうマクロのサンプルコードを紹介します。
マウスの操作には以下の引数があるため、実行したい操作ごとにプログラムで値を指定します。
値 | パラメータ | 操作内容 |
---|---|---|
2 | MOUSEEVENTF_LEFTDOWN | 左ボタンおす |
4 | MOUSEEVENTF_LEFTUP | 左ボタンはなす |
8 | MOUSEEVENTF_RIGHTDOWN | 右ボタンおす |
10 | MOUSEEVENTF_RIGHTUP | 右ボタンはなす |
20 | MOUSEEVENTF_MIDDLEDOWN | 中央ボタンおす |
40 | MOUSEEVENTF_MIDDLEUP | 中央ボタンはなす |
※ ボタンは左(LEFT)、右(RIGHT)、中央(MIDDLE)の3つとなっており、動作はDOWN(おす)、UP(はなす)となります。

2 と 4を組み合わせると、左ボタンをクリックだね。
入力するVBAコード
Option Explicit
'使用しているパソコンが64ビットの場合はこちらを宣言
'マウスの移動の操作をするための宣言
Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
'使用しているパソコンが64ビットの場合はこちらを宣言
'マウスのボタンを操作をするための宣言
Declare PtrSafe Sub mouse_event Lib "User32" (ByVal dwFlags As Long, Optional ByVal dx As Long = 0, Optional ByVal dy As Long = 0, Optional ByVal dwDate As Long = 0, Optional ByVal dwExtraInfo As Long = 0)
Sub マウスをクリックするマクロ()
'マウスポインターをX座標860・Y座標600まで移動する
SetCursorPos 860, 600
'マウスの左クリック(おす)
mouse_event 2
'マウスの左クリック(はなす)
mouse_event 4
End Sub
14行目
SetCursorPos 860, 600にマウスポインターを移動します。
[マウス移動]ボタンの位置にポインターが移動します。
17行目
mouse_event 2 でマウスの左ボタンをおすを実行します。
20行目
mouse_event 4 でマウスの左ボタンをはなすを実行します。
17行目とのくみ合わせでクリック操作になります。
サンプルコード(マウスをクリックするマクロ)では、前項で作成したマクロの”マウスを動かす操作のマクロ“を動かすためのボタンをクリックしてみます。
(※フォームボタンを押すことでマクロを起動して、別のフォームボタンをクリックされます。あまり実用的な使いかたで見られませんが、クリック操作をするマクロが正常に動作するかを確認するためのものです。)

画像の左上にある[クリックするマクロ]ボタンをクリックすることで、ワークシート上にある[マウス移動]ボタンをクリックします。
[マウス移動]ボタンがクリックされると、先に紹介したサンプルコード(Sub マウスポインターの移動)が起動します。
クリックするマクロボタンをクリックすると発生する動作
- X座標860、Y座標600にマウスポインターを移動する
- マウスの左ボタンをおす・はなす操作(クリック)をする
- [マウス移動]をクリックすることで他のマクロ(Sub マウスポインターの移動)が起動する

これでマクロをつかってマウス操作のクリックはできるようになったね。
マウスの移動とクリック操作をくり返すマクロのサンプルコード
前項のクリック操作のマクロを改良して、結果をわかりやすくするための他のマクロと組み合わせて動かしてみましょう。
まずは事前準備として、マクロの動作をみやすくするための処理を書いていきます。
ワークシートモジュールにコードを書きこんでいきます。
VBEで以下の画面にしたがってコード入力画面を表示してください。

こちらのサンプルマクロでは、以下の2つの処理をマクロに書きこみます。
マクロで処理する手順
ワークシートに入力するVBAコード
Option Explicit
'--------------------
'セルがクリックされたとき、セルの色が赤色にする(赤色の場合は色をクリアする)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count = 1 And Target.Interior.ColorIndex <> 3 Then
Target.Interior.ColorIndex = 3
ElseIf Target.Count = 1 And Target.Interior.ColorIndex = 3 Then
Target.Interior.ColorIndex = 0
End If
End Sub
'--------------------
'シート上のボタンをクリックしたときの処理(標準モジュールの別のマクロを起動する)
Private Sub CommandButton1_Click()
マウスをクリックするマクロ2
End Sub
ワークシート上で選択する対象が変わったときに起動するマクロです。
04行目
ワークシートイベントのSelectionChangeを利用して、選択しているセルが変更されたら起動するようにします。
引数のTaegetには選択されたセル範囲が代入されます。
06行目
If文の条件式でTaegetが1つのセルであり、そのセルの背景色が赤色でないときはセルの背景色を赤色にします。
08行目
ElseIf文の条件式でTaegetが1つのセルであり、そのセルの背景色が赤色のときはセルの背景色を元(無色)にもどします。
ワークシートイベントについて
If文による条件式について
標準モジュールには、以下のVBAコードを入力します。
標準モジュールに入力するVBAコード
Option Explicit
'====================================
'マウスの移動・クリック操作をつかうための宣言(64ビット版)
'====================================
Declare PtrSafe Function SetCursorPos Lib "User32" (ByVal x As Long, ByVal y As Long) As Long
Declare PtrSafe Sub mouse_event Lib "User32" (ByVal dwFlags As Long, Optional ByVal dx As Long = 0, Optional ByVal dy As Long = 0, Optional ByVal dwDate As Long = 0, Optional ByVal dwExtraInfo As Long = 0)
'====================================
Sub マウスをクリックするマクロ2()
'X座標とY座標を代入する変数とくり返し用カウンタ変数を宣言する
Dim xpos As Long, ypos As Long
Dim i As Long
'X座標とY座標の初期位置を以下に指定する
xpos = 50
ypos = 300
For i = 0 To 20
'マウスポインターをXPos・YPosまで移動する
SetCursorPos xpos, ypos
'マウスの左クリック(おす)
mouse_event 2
'マウスの左クリック(はなす)
mouse_event 4
'X座標に82を加算、Y座標に30を加算する
xpos = xpos + 82
ypos = ypos + 30
Next i
End Sub
先ほどのシンプルなクリックをするコードとの大きな違いとして、マウスをクリックし、ポインターを移動する処理をくり返すことで、画面の右下に向かって移動していくマクロです。
マクロで処理されるながれ
- シート上の[マクロ起動ボタン]をクリックする
- [マウスをクリックするマクロ2]が起動する
- [マウスをクリックするマクロ2]によってマウスのクリック操作を実行する
- クリックされた位置のセルの色を変えるマクロが起動する
- 3と4を、20回くり返す
19行目と20行目
15行目に宣言した変数に座標となる数値を代入しています。
サンプルマクロのコードでは、xposには50、yposには300を代入しています。
22行目
ForNextステートメントを利用して変数iが0~20までの間処理をくり返す指定をしています。
つまり合計21回の処理がおこなわれます。
24行目
SetCursorPos xpos, yposでマウスポインターを移動します。
移動する位置はそれぞれの変数に代入されている数値によって決まります。
27行目と30行目
mouse_event 2、mouse_event 4 でマウスの左ボタンのクリックを実行します。
33行目と34行目
xposの数値に82を加算、yposの数値に30を加算します。
※ここまでの処理がくり返されます
くり返し文について

文章でイメージがわきにくい人は、以下の動画で実行結果を確認してね。
サンプルコード(マウスをクリックするマクロ2)の実行結果

マウスクリックでセルの色が変わるから、処理が行われたことがわかるね。
マウスポインターの位置を取得するマクロのサンプルコード
マウスのポインターがある位置の座標を取得するためのサンプルコードです。
マウスのポインター座標を取得するVBAコード
Option Explicit
'====================================
'マウスポインターの位置を代入するためのユーザー定義型宣言
'====================================
Type Coordinate
xpos As Long
ypos As Long
End Type
'====================================
'マウスの位置取得の関数をつかうための宣言(64ビット版)
'====================================
Declare PtrSafe Function GetCursorPos Lib "User32" (lpPoint As Coordinate) As Long
Sub マウスポインターの位置を取得するマクロ()
'ユーザー定義型の変数を宣言する
Dim location As Coordinate
'マウスポインターの位置を取得する
GetCursorPos location
Debug.Print "X座標" & location.xpos & ":Y座標" & location.ypos
End Sub
マウスの移動やクリック操作のときと同じ手順で、位置を取得するためにAPIの『GetCursorPos』を使うための宣言をします。
マウスの移動やクリック操作とはっきり異なる点として、ユーザー定義型(構造体)も合わせて宣言しておく必要があります。
サンプルコードにて、Coordinate(座標)と名付けたユーザー定義型(構造体)は『GetCursorPos』で取得した、X座標とY座標を受け取るためのもので、それぞれをxpos・yposという名前にして、数値型(Long)として宣言しています。
06行目から09行目
Typeステートメントをつかって構造体を宣言しておきます。
先述のとおり、Coordinate(座標)という構造体名の中に変数xpos・yposを宣言しています。
19行目
先で宣言した構造体のCoordinate(座標)をオブジェクトとして定義し、初期化しています。
サンプルマクロのコードでは、オブジェクト名をlocationにしています。
22行目
GetCursorPosに19行目で宣言したオブジェクトlocationで座標を受け取ります。
24行目
locationオブジェクトのxpos・yposに代入されている値をイミディエイトウィンドウに表示します。

マウスポインターの位置を受けとるためには、ユーザー定義型(構造体)をつかうんだね。
ユーザー定義型(構造体)について
サンプルコード(マウスポインターの位置を取得するマクロ)の実行結果
デバッグプリントで座標を表示するコードなので、イミディエイトウィンドウにマウスポインターの座標が表示されました。
マウスポインターの座標をステータスバーに表示するサンプルコード
マウスポインターの座標を取得するマクロを改良して、セルを選択するたびにステータスバーに座標を表示するマクロを作ってみましょう。
まずは、事前準備としてワークシートに以下のコードを書きこみます。
ワークシートに入力するVBAコード
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
マウスポインターの位置を取得するマクロ2
End Sub
標準モジュールに書きこむコードは以下のとおり。
標準モジュールに入力するVBAコード
Option Explicit
'====================================
'マウスポインターの位置を代入するためのユーザー定義型宣言
'====================================
Type Coordinate
xpos As Long
ypos As Long
End Type
'====================================
'マウスの位置取得の関数をつかうための宣言(64ビット版)
'====================================
Declare PtrSafe Function GetCursorPos Lib "User32" (lpPoint As Coordinate) As Long
Sub マウスポインターの位置を取得するマクロ2()
'ユーザー定義型の変数を宣言する
Dim location As Coordinate
'マウスポインターの位置を取得する
GetCursorPos location
'マウスポインターの座標をステータスバーに表示する
Application.StatusBar = "X座標" & location.xpos & ":Y座標" & location.ypos
End Sub
26行目
Application.StatusBarにlocationのxposとyposを代入することでステータスバーに座標が表示されます。
サンプルコード(マウスポインターの位置を取得するマクロ2)の実行結果
動画の左下に表示されるステータスバーに座標が出力されます。その座標はセルをクリックするたびに更新されていることがわかります。

マウスポインターの位置を取得する方法がわかったね。
![]() |
![]() |
マクロでマウスの移動やクリックを操作する方法まとめ
エクセルVBAでマウスを移動・操作・位置の取得などを実行するマクロをつくるには、Windows APIを宣言セクションで特定のコードをつかって宣言しておく必要があります。
マウスを操作するための3つの宣言文
マウスの移動
マウスのクリック操作
マウスポインターの位置取得

これらを組み合わせて使うことで、くり返し作業の自動化などのプログラムも作れるよ。
今回はここまで。
この記事があなたの学習または課題解決に役立てば幸いです。
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント