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

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

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

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

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

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に入力してください。

パソコンが64ビットの場合

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

パソコンが32ビットの場合

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

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

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

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

パソコンが64ビットの場合

'使用しているパソコンが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ビットの場合

'使用しているパソコンが32ビットの場合はこちらを宣言 
Declare Sub mouse_event Lib “user32” (ByVal dwFlags As Long, Optional ByVal dx As Long = 0, Optional ByVal

クリック操作をするならこれだね。

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

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

パソコンが64ビットの場合

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

パソコンが32ビットの場合

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

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

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

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

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

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

なお、連続で処理をすると一瞬でマウスの移動が完了してしまいますので、正常に動作ができているか確認するためにサンプルコードでは、指定した時間だけ処理を止める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
サンプルコード(マウスポインターの移動)の実行結果
マウスを移動するマクロの実行結果

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

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

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

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

入力する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

このサンプルコードでは、インプットボックスに入力した数値を変数のXPosYposに代入します。
実際のマクロでもよくあるように、数値以外の文字列を入力された場合や、最小値や最大値などの入力をDo Until~Loop文とType引数で制限しています。

このサンプルコードでは、特定の範囲かつ数値のみの入力に制限しているよ。

インプットボックスはユーザーから値を受け取るためのものですが、意図しない入力がされたときにエラーが発生しないように対策をしておく必要があります。

インプットボックスで入力制限をする方法についてはこちらの記事で解説しています。

マウスをクリック操作するマクロのサンプルコード

ここでは、マウスの操作をおこなうマクロのサンプルコードを紹介します。マウスの操作には以下の引数があるため、実行したい操作ごとにプログラムで値を指定します。

パラメータ 操作内容
2 MOUSEEVENTF_LEFTDOWN 左ボタンおす
4 MOUSEEVENTF_LEFTUP 左ボタンはなす
8 MOUSEEVENTF_RIGHTDOWN 右ボタンおす
10 MOUSEEVENTF_RIGHTUP 右ボタンはなす
20 MOUSEEVENTF_MIDDLEDOWN 中央ボタンおす
40 MOUSEEVENTF_MIDDLEUP 中央ボタンはなす

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

サンプルコード(マウスをクリックするマクロ)では、前項で作成したマクロの”マウスポインターの移動”を動かすためのボタンをクリックしてみます。
※フォームボタンを押すことでマクロを起動して、別のフォームボタンをクリックするようにしています。実用的な使いかたではありませんが、クリック操作をするマクロが正常に動作するかを確認するためです。

マウスポインターの移動

画像の左上にある[クリックするマクロ]をクリックすることで、ワークシート上にある[マウス移動]をクリックします。[マウス移動]ボタンがクリックされると、サンプルコード(Sub マウスポインターの移動)が起動します。

クリックするマクロをクリックする

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

ワークシート上で選択する対象が変わったときに起動するマクロです。

If Target.Count = 1 And Target.Interior.ColorIndex <> 3 Then

上記のIf文による条件は、選択されたセルの個数が1つであり、セルの色が3(赤)ではないとき。
実行される処理は、セルの背景色を3(赤)にする。

ElseIf Target.Count = 1 And Target.Interior.ColorIndex = 3 Then

もう一方の条件式では、選択されたセルの個数が1つであり、セルの色が3(赤)のとき。
実行される処理は、セルの背景色をクリア(無色に)する。

VBAで分岐の数を増やしたり、条件をもっと細かく設定して処理をわけたいけど、書き方がわからない。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

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

マクロで処理する手順

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

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

繰り返し文ができると、事務作業の負担が劇的に変わる。繰り返し文の書きかたについては以下の記事で解説していますので、こちらも合わせてご覧ください。

サンプルコード(マウスをクリックするマクロ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座標受け取るためのもので、それぞれをxposyposという名前にして、数値型(Long)として宣言しています。

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

ユーザー定義型(構造体)の使いかたについては、別の記事で解説しています。
詳しく知りたい人は以下のリンクよりご覧ください。

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


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

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

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

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

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

マウスの移動

  • 32ビットと64ビットで宣言するコードが異なる
  • マウスポインターの移動はX座標とY座標の数値で指定する

マウスのクリック操作

  • 32ビットと64ビットで宣言するコードが異なる
  • 左ボタンを おすと はなす・右ボタンを おす と はなす・中央ボタンを おす と はなすを数値で指定する

マウスポインターの位置取得

  • 32ビットと64ビットで宣言するコードが異なる
  • ユーザー定義型(構造体)と合わせて宣言して、取得したX座標とY座標を受け取る

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

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

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

コメント

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