質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

11628閲覧

エクセルvba マウス操作による範囲選択のやり方

expy

総合スコア103

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2018/12/06 03:15

前提・実現したいこと

エクセル2013 VBAでのマウス操作で範囲選択を行いたいです。
(対象はエクセルのセルではなく、例えばデスクトップだったり、IEだったりします)

該当のソースコード

excelvba

1Declare PtrSafe Function SetCursorPos Lib "User32" (ByVal x As Long, ByVal y As Long) As Long 2Declare PtrSafe Sub mouse_event Lib "User32" ( _ 3 ByVal dwFlags As Long, _ 4 Optional ByVal dx As Long = 0, _ 5 Optional ByVal dy As Long = 0, _ 6 Optional ByVal dwDate As Long = 0, _ 7 Optional ByVal dwExtraInfo As Long = 0) 8Sub main() 9 SetCursorPos 800, 400 '左から800ピクセル、上から400ピクセルの位置にカーソルを移動 10 mouse_event 2 '左ボタン押下(範囲選択のクリックのつもり) 11 SetCursorPos 1000, 600 '範囲選択のマウス移動のつもり 12 mouse_event 4 '左ボタン解放 13end Sub

補足情報

マウスの位置指定、
左クリック押しっぱなし、
マウス位置指定(移動のつもり)、
左クリック離す
の動作を行いたかったのですが、うまくいきません。
範囲選択のapiが見つかりません。
どのように行えば良いでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

beginner_t

2018/12/06 03:21

操作対象がエクセルではないアプリケーション等ということですが、エクセルのVBAを使わないといけない理由があれば教えてください。特段、エクセルでなくても操作できれば良いということであれば、別のマクロソフトを推奨します。
expy

2018/12/06 04:37

セキュリティがガチガチで、インストール等が禁止となっています。
guest

回答1

0

ベストアンサー

やっていること自体は問題なさそうですが、ノータイムで連続処理すると反映が追い付かないようですね。

例えば以下のようにSleepで短いウェイトを挟んであげることで、私の環境では動作しました。

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) 'Sleep用のAPI宣言 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'mouse_event用の定数宣言 Private Const MOUSEEVENTF_ABSOLUTE = &H8000 Private Const MOUSEEVENTF_MOVE = &H1 Private Const MOUSEEVENTF_LEFTDOWN = &H2 Private Const MOUSEEVENTF_LEFTUP = &H4 Private Const MOUSEEVENTF_RIGHTDOWN = &H8 Private Const MOUSEEVENTF_RIGHTUP = &H10 Private Const MOUSEEVENTF_MIDDLEDOWN = &H20 Private Const MOUSEEVENTF_MIDDLEUP = &H40 Sub main() SetCursorPos 800, 300 '左から800ピクセル、上から400ピクセルの位置にカーソルを移動 Sleep 100 mouse_event MOUSEEVENTF_LEFTDOWN '左ボタン押下(範囲選択のクリックのつもり) Sleep 100 SetCursorPos 1000, 600 '範囲選択のマウス移動のつもり Sleep 100 mouse_event MOUSEEVENTF_LEFTUP '左ボタン解放 End Sub

お試しください。

投稿2018/12/06 04:54

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

expy

2018/12/06 05:18

できました! ありがとうございました。
jawa

2018/12/06 05:58

無事解決されたようで、なによりです。 余談ですが、 `mouse_event MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_MOVE, x座標, y座標` でもマウスの移動は可能です。 ただ、座標の指定方法がマウスの最小移動量であるミッキー数という単位での指定となっており、OSや環境設定に依存する単位のため扱い難いです。 このためピクセル単位で座標指定ができるSetCursorPosを利用される方が多いようですね。 ミッキー数はマイクロソフトが作り出した単位のようで、mouse_eventの説明にも「ミッキーの詳細については、MSDN ライブラリの[検索]タブで「(" ミッキー " OR "mickey") AND (" マウス " OR "mouse")」を検索」と記載されていました。 …開発者の遊び心ですね(^-^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問