マウスを操作するマクロをつくるためには、事前にWindows API関数を宣言しておく必要があります。
『API』は、プログラミングの世界ではよく登場する言葉ですが『Application Programming Interface』の頭文字をとって使われています。
ものすごくカンタンに言ってしまえば、アプリとアプリをつなぐためのものです。
今回ご紹介するものは、エクセルVBAのマクロでWindowsの操作を実行を可能にするためのもので、『これからWindowsの関数をつかうよ!』と宣言する作法だと言えるでしょう。
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ビットの場合
'使用しているパソコンが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
マウス位置を座標で取得するならこれだね。
マウスの移動やクリック操作をするマクロ
マウスの移動やクリックなどの操作をするマクロを紹介します。
なお、連続で処理をすると一瞬でマウスの移動が完了してしまいますので、正常に動作ができているか確認するためにサンプルコードでは、指定した時間だけ処理を止める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
このサンプルコードでは、インプットボックスに入力した数値を変数のXPosとYposに代入します。
実際のマクロでもよくあるように、数値以外の文字列を入力された場合や、最小値や最大値などの入力を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 マウスポインターの移動)が起動します。
クリックするマクロをクリックする
- 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
ワークシート上で選択する対象が変わったときに起動するマクロです。
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
先ほどのシンプルなクリックをするコードとの大きな違いとして、マウスをクリックし、ポインターを移動する処理をくり返すことで、画面の右下に向かって移動していくマクロです。
マクロで処理する手順
- シート上の[マクロ起動ボタン]をクリックする
- [マウスをクリックするマクロ2]が起動する
- [マウスをクリックするマクロ2]によってマウスのクリック操作を実行する
- クリックされた位置のセルの色を変えるマクロが起動する
- 手順の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座標を受け取るためのもので、それぞれをxpos・yposという名前にして、数値型(Long)として宣言しています。
マウスポインターの位置を受けとるためには、ユーザー定義型(構造体)をつかうんだね。
ユーザー定義型(構造体)の使いかたについては、別の記事で解説しています。
詳しく知りたい人は以下のリンクよりご覧ください。
サンプルコード(マウスポインターの位置を取得するマクロ)の実行結果
X座標733:Y座標602
デバッグプリントで座標を表示するコードなので、イミディエイトウィンドウにマウスポインターの座標が表示されました。
マウスポインターの座標をステータスバーに表示するサンプルコード
マウスポインターの座標を取得するマクロを改良して、セルを選択するたびにステータスバーに座標を表示するマクロを作ってみましょう。
まずは、事前準備としてワークシートに以下のコードを書きこみます。
ワークシートに入力する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
サンプルコード(マウスポインターの位置を取得するマクロ2)の実行結果
動画の左下に表示されるステータスバーに座標が出力されます。その座標はセルをクリックするたびに更新されていることがわかります。
マウスポインターの位置を取得する方法がわかったね。
マクロでマウスの移動やクリックを操作する方法まとめ
エクセルVBAでマウスを移動・操作・位置の取得などを実行するマクロをつくるには、Windows APIを宣言セクションで特定のコードをつかって宣言しておく必要がある。
マウスの移動
マウスのクリック操作
マウスポインターの位置取得
これらを組み合わせて使うことで、くり返し作業の自動化などのプログラムも作れるよ。
今回はここまで。
この記事があなたの学習または課題解決に役立てば幸いです。
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント