読者です 読者をやめる 読者になる 読者になる

t-hom’s diary

主にVBAネタを扱っているブログです。

VBA 画面の任意の箇所をクリックさせるマクロ

ネットで色々と探したけれど、なかなかシンプルなコードが無かったので、可能な限りシンプルに、張り付けてそのまま動く形で公開しておく。
以下のマクロを実行すると、左から100ピクセル、上から35ピクセルの位置にカーソルが移動して、そこがクリックされる。

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 dwDate As Long = 0, _
    Optional ByVal dwExtraInfo As Long = 0)

Sub マウスで画面の任意の位置をクリック()
    SetCursorPos 100, 35  '左から100ピクセル、上から35ピクセルの位置にカーソルを移動
    mouse_event 2  '左ボタン押下のコード
    mouse_event 4  '左ボタン解放のコード
End Sub

他のサイトのサンプルでは、次のように定数を宣言して16進数を代入し、他の引数も省略せずに次のように書かれている。

    Const MOUSEEVENTF_LEFTDOWN = &H2
    Const MOUSEEVENTF_LEFTUP = &H4
    '~中略~
    mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
    mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0

ただ、クリックするたびに0, 0, 0, 0を渡すのはコードが煩雑に見えるので、宣言側で工夫して省略できるようにした。
また、とりあえず「シンプルに見えて動くコード」にしたかったので左ボタンだけなら直接Longのリテラルで良いかと思い、定数にはしなかった。
「&H」から始まる数字は16進数であるが、2と4は10進数でも16進数でも同じなので省略した。
※&H10は十進数の16である。

ちなみに右クリックのコードは押下が8(または&H8)、解放が16(または&H10)である。

VBAで他アプリを操作する際に、オブジェクトの直接操作ができればそれに越したことはないが、そもそも外部から操作される前提で作成されていないアプリもあるので、そのようなケースではキーボード操作やマウス操作をVBAでエミュレートするしかない。

実際には解像度やタスクバーの配置などのPC環境によってウインドウが表示される位置は異なるため、マウス操作を行うマクロを広く配布するつもりならそのあたりの解消も必要かと思う。(マクロを使う場合の設定を統一してもらうか、また別のAPIで設定を取得してマクロ側で調整をかけるか等。)

出来ればこういう不安定な手段に頼りたくはないが、最終手段としてこうしたテクニックを覚えておくと作れるものの幅が広がって良いと思う。

今回のマクロではWin32APIを使用して(つまりWindows OSの力を借りて)マウス移動とクリックを実現している。
Windows APIを使うとVBA単体では実現できない色々な操作ができるようになる。
詳しく学びたい方はこちらの書籍がオススメ。

大村あつし の Excel VBA  Win64/32 APIプログラミング

大村あつし の Excel VBA Win64/32 APIプログラミング

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。