※本ブログのページには広告主との提携による広告や宣伝、プロモーションが含まれます。
 当ブログを経由しての商品の購入や、サービスの申し込みが発生すると提携企業からの成果報酬を受けとる場合があります。

エクセルVBA|マクロでマウスの移動やクリックを操作する方法

 マウスを操作するマクロをつくるためには、事前にWindows API関数を宣言しておく必要があります。
API』は、プログラミングの世界ではよく登場する言葉ですが『Application Programming Interface』の頭文字をとって使われています。

ものすごくカンタンに言ってしまえば、アプリとアプリをつなぐためのものです。

 今回ご紹介するものは、エクセルVBAのマクロでWindowsの操作を実行を可能にするためのもので、これからWindowsの関数をつかうよ!』と宣言する作法だと言えるでしょう。

 マウスを操作するマクロで必要な3つの宣言を書くことで「マウスポインター移動」、「クリック操作」、「ポインターの座標取得」ができるようになるのでこれらの使いかたをサンプルを通して案内していきます。

APIが公開されると、他のアプリと連携できて便利になるんだよ。

独学でプログラミングをはじめてみたけど、このままの学習方法に不安を感じているのなら、
オンラインスクールで現役エンジニアのサポートがあるテックアカデミーがおすすめ。
スキマ時間に学べて仕事も保証。必ず副業、始められます。まずは無料でプログラミング体験

マウスの移動やクリックを操作するAPIの宣言

 ここで紹介するマクロをつくる前に、使っているパソコンが32ビットか64ビットかを確認しておきましょう。

それぞれで宣言するコードが異なりますので、簡単に確認する方法について掲載しておきます。

システムの種類(32ビット or 64ビット)の確認には、以下の方法があります。

  1. キーボードの[Windowsマーク]キーと[ X ]キーを同時押し
  2. [システム]をクリックする
  3. [システムの種類]を確認する

または、以下の手順でも確認ができます。(Windows 11)

  1. [スタート]から[設定]をクリックする
  2. [システム]をクリックする
  3. [バージョン情報]を確認する
  4. [システムの種類]を確認する
システムの種類の確認方法
パソコンのシステム情報を表示するための手順を説明する画像

デバイスの仕様に以下のように表示されています。

デバイス名 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に入力してください。

  
Option Explicit
'使用しているパソコンが64ビットの場合はこちらを宣言
Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
  
Option Explicit
'使用しているパソコンが32ビットの場合はこちらを宣言
Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long

マウスを移動するコードを実行したいならこれだね。

マウスをクリック操作をするために必要な宣言(Mouseevent)

以下のコードをVBEに入力してください。

  
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)
  
Option Explicit
'使用しているパソコンが32ビットの場合はこちらを宣言
Declare Sub mouse_event Lib “user32” (ByVal dwFlags As Long, Optional ByVal dx As Long = 0, Optional ByVal

マウスの位置を取得するために必要な宣言(GetCursorPos)

 以下のコードをVBEに入力してください。

  
Option Explicit
'使用しているパソコンが64ビットの場合はこちらを宣言
Declare PtrSafe Function GetCursorPos Lib “user32” (lpPoint As coord) As Long
  
Option Explicit
'使用しているパソコンが32ビットの場合はこちらを宣言
Declare Function GetCursorPos Lib “User32” (lpPoint As coord) As Long

マウス位置を座標で取得するならこれだね。

独学だと中々スキルが身についた実感が湧かない。学習環境を見直してみませんか?

エクセルで繰り返しや転記作業で苦しい思いをした経験はありませんか?
今まで苦労してきたその作業を簡単なプログラムをおぼえるだけで解決できる可能性があります。
なるべくお金や時間をかけずにエクセルマクロVBAを習得したい人にはこちらの「1日速習講座」がおすすめです。

マウスの移動やクリック操作をするマクロ

 マウスの移動やクリックなどの操作をするマクロを紹介します。

なお、連続で処理をすると一瞬でマウスの移動が完了してしまいますので、正常に動作ができているか確認するためにサンプルコードでは、指定した時間だけ処理を止めるSleep関数を使っています。

マウスを動かす操作のマクロのサンプルコード

  
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座標500Y座標400に移動します。

18行目

 SetCursorPos 500, 800でマウスの位置をX座標500Y座標800に移動します。

23行目

SetCursorPos 1200, 800でマウスの位置をX座標1200Y座標800に移動します。

28行目

SetCursorPos 1200, 400でマウスの位置をX座標1200Y座標400に移動します。

33行目

SetCursorPos 500, 400でマウスの位置をX座標500Y座標400に移動します。

サンプルコード(マウスポインターの移動)の実行結果
マウスを移動するマクロの実行結果

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

実行結果についての注意点

実行結果をわかりやすくするためにセルに色と番号をつけていますが、現在使用しているパソコン環境(FullHDで表示倍率100%)での位置です。そのため、お使いの環境によっては異なる結果となる可能性があります。

これで移動させたい座標さえわかれば、マウスの移動はできるね。

任意の位置にマウスを動かす操作のマクロのサンプルコード

  
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行目

座標を代入するための変数としてXposYposを宣言します。

13行目から16行目

インプットボックスで宣言した変数に座標を代入します。XposにはX座標の数値を、YposにはY座標の数値を代入しています。

インプットボックスでは、Type引数で数値のみ入力できるように制限をしています。

くり返し文のDoLoopステートメントの条件にはXpos200以上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を組み合わせると、左ボタンをクリックだね。

  
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 マウスポインターの移動)が起動します。

  1. X座標860、Y座標600にマウスポインターを移動する
  2. マウスの左ボタンをおす・はなす操作(クリック)をする
  3. [マウス移動]をクリックすることで他のマクロ(Sub マウスポインターの移動)が起動する

これでマクロをつかってマウス操作のクリックはできるようになったね。

マウスの移動とクリック操作をくり返すマクロのサンプルコード

 前項のクリック操作のマクロを改良して、結果をわかりやすくするための他のマクロと組み合わせて動かしてみましょう。

まずは事前準備として、マクロの動作をみやすくするための処理を書いていきます。

 ワークシートモジュールにコードを書きこんでいきます。

VBEで以下の画面にしたがってコード入力画面を表示してください。

ワークシートにコードを書くための手順

 こちらのサンプルマクロでは、以下の2つの処理をマクロに書きこみます。

  • セルをクリックするとセルの色を赤色に変更する
  • ボタンをクリックすると他のマクロ(処理)を起動する
  
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文の条件式でTaeget1つのセルであり、そのセルの背景色が赤色でないときはセルの背景色を赤色にします。

08行目

ElseIf文の条件式でTaeget1つのセルであり、そのセルの背景色が赤色のときはセルの背景色を元(無色)にもどします。

ワークシートイベントについて

If文による条件式について

標準モジュールには、以下の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

 先ほどのシンプルなクリックをするコードとの大きな違いとして、マウスをクリックし、ポインターを移動する処理をくり返すことで、画面の右下に向かって移動していくマクロです。

  1. シート上の[マクロ起動ボタン]をクリックする
  2. [マウスをクリックするマクロ2]が起動する
  3. [マウスをクリックするマクロ2]によってマウスのクリック操作を実行する
  4. クリックされた位置のセルの色を変えるマクロが起動する
  5. 3と4を、20回くり返す

19行目と20行目

15行目に宣言した変数に座標となる数値を代入しています。

サンプルマクロのコードでは、xposには50、yposには300を代入しています。

22行目

ForNextステートメントを利用して変数i0~20までの間処理をくり返す指定をしています。

つまり合計21回の処理がおこなわれます。

24行目

SetCursorPos xpos, yposでマウスポインターを移動します。

移動する位置はそれぞれの変数に代入されている数値によって決まります。

27行目と30行目

mouse_event 2、mouse_event 4 でマウスの左ボタンのクリックを実行します。

33行目と34行目

xposの数値に82を加算、yposの数値に30を加算します。

※ここまでの処理がくり返されます

くり返し文について

文章でイメージがわきにくい人は、以下の動画で実行結果を確認してね。

マウスクリックでセルの色が変わるから、処理が行われたことがわかるね。

マウスポインターの位置を取得するマクロのサンプルコード

 マウスのポインターがある位置の座標を取得するためのサンプルコードです。

  
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座標を受け取るためのもので、それぞれをxposyposという名前にして、数値型(Long)として宣言しています。

06行目から09行目

Typeステートメントをつかって構造体を宣言しておきます。

先述のとおり、Coordinate(座標)という構造体名の中に変数xposyposを宣言しています。

19行目

先で宣言した構造体のCoordinate(座標)をオブジェクトとして定義し、初期化しています。

サンプルマクロのコードでは、オブジェクト名をlocationにしています。

22行目

GetCursorPosに19行目で宣言したオブジェクトlocationで座標を受け取ります。

24行目

locationオブジェクトのxposyposに代入されている値をイミディエイトウィンドウに表示します。

マウスポインターの位置を受けとるためには、ユーザー定義型(構造体)をつかうんだね。

ユーザー定義型(構造体)について

X座標733:Y座標602

 デバッグプリントで座標を表示するコードなので、イミディエイトウィンドウにマウスポインターの座標が表示されました。

マウスポインターの座標をステータスバーに表示するサンプルコード

 マウスポインターの座標を取得するマクロを改良して、セルを選択するたびにステータスバーに座標を表示するマクロを作ってみましょう。

まずは、事前準備としてワークシートに以下のコードを書きこみます。

  
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    マウスポインターの位置を取得するマクロ2

End Sub

標準モジュールに書きこむコードは以下のとおり。

  
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.StatusBarlocationxposyposを代入することでステータスバーに座標が表示されます。

 動画の左下に表示されるステータスバーに座標が出力されます。その座標はセルをクリックするたびに更新されていることがわかります。

マウスポインターの位置を取得する方法がわかったね。

マクロでマウスの移動やクリックを操作する方法まとめ

 エクセルVBAでマウスを移動・操作・位置の取得などを実行するマクロをつくるには、Windows APIを宣言セクションで特定のコードをつかって宣言しておく必要があります。

  • 32ビットと64ビットで宣言するコードが異なる
  • マウスポインターの移動はX座標とY座標の数値で指定する
  • 32ビットと64ビットで宣言するコードが異なる
  • 左ボタンを おすと はなす・右ボタンを おす と はなす・中央ボタンを おす と はなすを数値で指定する
  • 32ビットと64ビットで宣言するコードが異なる
  • ユーザー定義型(構造体)と合わせて宣言して、取得したX座標とY座標を受け取る

これらを組み合わせて使うことで、くり返し作業の自動化などのプログラムも作れるよ。

今回はここまで。
この記事があなたの学習または課題解決に役立てば幸いです。

コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。

コメント

タイトルとURLをコピーしました