• 締切済み

VBAでのカーソル移動とマウスクリック

業務上の単純作業の自動化のため、VBAから他のアプリケーションを操作することが目的です。 以前、ブラウザ上での作業の時に使用した、下記2つのAPIでは今回はマウスカーソルが指定した座標に動いてくれません、、、 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, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) この2つのAPI以外で、カーソル移動とマウスクリックを実現する方法は何かありますでしょうか? 色々な方法を教えていただけるとVBAの勉強にもなり幸いです。 ' // 標準モジュール Option Explicit 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, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long) Private Type POINTAPI     x As Long     y As Long End Type Private Sub クリックテスト() Call SetCursorPos(216, 421) Sleep 400 Call mouse_event(&H2, 0, 0, 0, 0) Call mouse_event(&H4, 0, 0, 0, 0) End Sub

みんなの回答

  • iriyak
  • ベストアンサー率48% (40/82)
回答No.3

こんにちは。 > 業務上の単純作業の自動化 とのことですが対象のアプリケーションがもし Component Object Model のインターフェイスを提供しているのであれば、そのインターフェイス (COM オブジェクト) を利用して目的を達成させるアプローチの方が望ましい場合があります。 例: マイクロソフト社製品は COM オブジェクトを提供しています。VBA からも COM オブジェクトにアクセス出来ます。 対象のアプリケーションがそのようなインターフェイスを提供していない場合は、質問にあるように自前で Win32 API を使用するのも手です。あるいは回答にあるようにそれらを代行するソフトウェアの起動を指示して処理そのものはそちらに委託するか。 私は後者がよいと考えます。というのは UWSC が具備している組み込み手続きが沢山の UWSC ユーザのフィードバックを受けて洗練されているからです。これらを使わない手はありません。ぜひ業務の生産性向上に役立ててほしいと思います。

参考URL:
http://www.uwsc.info/
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 そのコードは、ご本人が書いたものか、他の方が書いたものかは分かりませんが、あまり、他のアプリケーションをVBAから動かすことと考えるのは辞めたほうがよいです。同じOffice でも、うまく行かないこともありますから。 >カーソル移動とマウスクリックを実現する方法は何かありますでしょうか? この前、ここで質問がでていたのですが、 http://www.uwsc.info/ ここのUWSC で、記録を取って動かしみたらいかがですか? たぶん、細かく聞いても、VBAの範囲内では、どうしようもないかもしれません。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

今回は何をやりたいのか、質問の文章にはっきり書くべきです。 前回のコードも何をやっているのか書かず、コードだけ書いて、あとは読者、回答者で解析し、わからないものは判らなくてもよいという風な書き方になっているが、改めてほしい。 APIはそれほどなじみのあるものではない。 読者数万人が、1読するために貴重な時間を費やすのだから。 >VBAから他のアプリケーションを操作することが目的です。 も抽象的。

関連するQ&A

  • マウスイベントが動かない

    エクセルシートのダブルクリック イベントで  Call マウス左クリック  とします。 ret = SetCursorPos(929, 12) カーソル移動と SendKeys " 12345" は動くのですが mouse_event 2, 0, 0, 0, 0 '左ダウン mouse_event 4, 0, 0, 0, 0 '左アップ この二つが 動いてくれません。 遅延させるタイマー入れたり、するのですが同じです。 MODULE の中に入れたり、シートの中に入れても 同じです。 どこが、問題なのでしょうか よろしくどうぞ Sub タイミング() stime = gettickcount Do While gettickcount - stime < 1000 DoEvents Loop Sub マウス左クリック() ret = SetCursorPos(929, 12) mouse_event 2, 0, 0, 0, 0 '左ダウン mouse_event 4, 0, 0, 0, 0 '左アップ ret = SetCursorPos(309, 282) SendKeys " 12345" ret = SetCursorPos(309, 320) SendKeys " 12345" SendKeys " {ENTER}" SendKeys " %(RY)", True Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Public Type POINTAPI X As Long Y As Long End Type  ’位置取得 '------------------------------------------------------------------ Private Declare Sub mouse_event Lib "user32" _ (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As _ Long, ByValcButtons As Long, ByVal dwExtraInfo As Long) Public Declare Function SetCursorPos Lib "user32" _ (ByVal X As Long, ByVal Y As Long) As Long

  • Excel VBA によるマウス操作

    こんばんは。 まず以下のコードをご覧ください。 Public Declare Sub mouse_event Lib "user32.dll" _ (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, _ ByVal dwData As Long, ByVal dwExtraInfo As Long) Public Const MOUSEEVENTF_ABSOLUTE = &H8000& Public Const MOUSEEVENTF_MOVE = &H1 Public Const MOUSEEVENTF_LEFTDOWN = &H2 Public Const MOUSEEVENTF_LEFTUP = &H4 Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 Public Const MOUSEEVENTF_MIDDLEUP = &H40 Public Const MOUSEEVENTF_RIGHTUP = &H10 Public Const MOUSEEVENTF_RIGHTDOWN = &H8 Sub test() Call mouse_event(MOUSEEVENTF_ABSOLUTE, 10, 65500, 0, 0) Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) End Sub ExcelでSub test()を実行し、マウスで画面の左下の「スタート」を左クリックしたのと同じ結果が出ればいいのですが、うまくいきません。 フォームボタンで実行したらしばらくポインターが点滅していました。 クリックはされているようですが、移動ができてないようです。 このAPI関数というものが、このカテゴリーでよいのかも分からない私ですが、どうかご回答よろしくお願いします。

  • VBAでSetTextColorがうまくいかない

    EXCELのVBAでユーザーフォームを使ったグラフィック表示のプログラムを 作っているのですが、SetTextColorでテキスト色の設定をしようと してもうまくいきません。何故か設定しようとする色の値が無視されて 「1304008」が設定されてしまいます。(GetTextColorで確認) そしてそれ以降何を設定してもこの状態のままです。 何か考えられることがありますでしょうか。 下にそのプログラムを示します。 ちなみにSetBKColorやAngleArcなど他のグラフィック命令は問題なく 動いていてSetTextColorだけがうまくいってない状態です。 '------------------------------------------------- ' ユーザーフォーム用プログラム '------------------------------------------------- Private Declare Function GetActiveWindow Lib "user32" () As Long Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _ ByVal hwndParent As Long, _ ByVal hwndChildAfter As Long, _ ByVal lpszClass As String, _ ByVal lpszWindow As String) As Long Private Declare Function GetDC Lib "user32" ( _ ByVal hWnd As Long) As Long Private Declare Function ReleaseDC Lib "user32" ( _ ByVal hWnd As Long, _ ByVal hdc As Long) As Long Private Declare Function SetTextColor Lib "gdi32" _ (ByVal hdc As Long, crColor As Long) As Long Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" _ (ByVal hdc&, ByVal x&, _ ByVal y&, ByVal lpString$, ByVal nCount&) As Long Dim hWnd As Long Dim hdc As Long Public Sub UserForm_Activate() DoEvents hWnd = FindWindowEx(GetActiveWindow, 0, "F3 Server 60000000", "") hdc = GetDC(hWnd) ret = SetTextColor(hdc, RGB(255, 0, 0)) ret = TextOut(hdc, 0, 0, "abc", 3) Call ReleaseDC(hWnd, hdc) End Sub '-------------------------------------------------

  • クリップボードにアクティブウィンドウが貼り付けられません。

    Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Sub Command1_Click() Clipboard.Clear Form2.Picture1.AutoRedraw = True Form1.SetFocus keybd_event vbKeySnapshot, 0, 0, 0 Do While Clipboard.GetFormat(vbCFBitmap) = False DoEvents Loop Form2.Picture1.Picture = Clipboard.GetData() End Sub keybd_eventを使って、こんな感じでForm2のピクチャーにForm1を貼付けしたいのですが、画面全体がコピーされてしまいます。 アクティブウィンドウのみコピーするにはどうしたら良いですか?

  • マウス関連のAPIについて

    マウスがどのフォーム(自分のフォームでないときも)でも左クリックしたときの状態の取得方法を教えてください。 Public Declare Function SetCursorPos& Lib "user32" (ByVal x As Integer, ByVal y As Integer) Public Declare Function GetCursorPos& Lib "user32" (ByRef lpPoint As POINTAPI) で、マウスの位置の取得設定はわかりました。

  • Ctrl+Vのキーストロークを合成したいのですが

    Ctrl+Vのキーストロークを合成して、クリップボードの内容を貼り付けたいと考えています。 いろいろ調べた結果、大体以下のように記述すればよいのではないかとおもったのですが記述に間違いがあるようです。(form上のText1内に張り付けることができません。)恐れ入りますが、何卒ご教授いただきたくお願いいたします。 Option Explicit Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, _ ByVal bScan As Byte, _ ByVal dwFlags As Long, _ ByVal dwExtraInfo As Long) Private Const KEYEVENTF_EXTENDEDKEY = &H1 Private Const KEYEVENTF_KEYUP = &H2 Private Const VK_CONTROL = &H11 Private Sub Command1_Click() Call keybd_event(VK_CONTROL, 0, 0, 0) Call keybd_event(Asc("V"), 0, 0, 0) Call keybd_event(Asc("V"), 0, KEYEVENTF_KEYUP, 0) Call keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0) End Sub ちなみに使用目的につきましては、form1上のWebBrowser1に開いた入力フォームの<input type="file" >に(JavaScriptでフォーカスを移したうえで)ファイルのパスを貼り付けることです。 <input type="file" >はvalueを指定できないようなので、色々考えた結果、上記のようにするしかないかと考えました。もしもほかによい方法があったら恐れ入りますがご教授いただけると大変ありがたいです。よろしくお願いします。

  • Excel VBA でのAPI呼び出しが・・・

    マクロ初級です。 windowsXP(SP3) office2007 Excelのマクロで、APIのSetActiveWindowを使おうとしましたが、宣言のところで エラーがでました。  設定は、  Public Declare Function SetActiveWindow Lib "user32" (ByVal hWnd As Long) As Long  もしくは  Public Declare Function SetActiveWindow Lib "user32" (ByVal hWnd&) As Long  コンパイルエラー  定数、固定長文字列、配列、ユーザ定義型および Declare ステートメントは  オブジェクトモジュールのパブリックメンバとしては使用できません。 ウィンドウをアクティブな状態等に用いたいのですが、定義の仕方が悪いのでしょうか? 皆さま、ご教授下さい。

  • マウスのある個所の色

    お世話になります よろしくお願いします Pictureboxをクリックされたときに そのPictureboxがクリックされた箇所の色を16進数で取得したいのですが うまくいきません どこが間違っているのか教えてもらえないでしょうか? ソースは Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Type POINTAPI x As Long y As Long End Type Private Sub Picture1_Click() Dim Poi As POINTAPI Dim iro As Long GetCursorPos Poi iro = GetPixel(Me.Picture1.hdc, Poi.x, Poi.y) Me.Label2.Caption = Poi.x Me.Label3.Caption = Poi.y Me.Label1.Caption = iro CloseHandle (Me.Picture1.hdc) End Sub GetPixcelの引数に-1しか入りません あと、もし数値で取れたとして それを16進数にする方法を教えてください よろしくお願いします

  • Formを動かせるようにしたい

    お世話になります。 OS XP PRO  VB6(SP5)で開発しています。 ディスプレイのサイズによりFormを動かせたり固定させたりしたいのですが、 規定値は固定にしたいのでFormプロパティのMoveableはFalseにしてあります。 下記のようにプログラミングしたのですが固定されたままです。 Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long Private Declare Function GetSystemMenu Lib "user32" (ByVal _ hwnd As Long _ , ByVal bRevert As Long) As Long Private Declare Function RemoveMenu Lib "user32" ( _ ByVal hMenu As Long, ByVal nPosition As Long, _ ByVal wFlags As Long) As Long Private Declare Function DrawMenuBar Lib "user32" ( _ ByVal hwnd As Long) As Long Private Const MF_BYCOMMAND = &H0 Private Const SC_MOVE = &HF010 Private Sub Form_Load() Dim kk As Long kk = GetSystemMenu(.hwnd, bb) Call RemoveMenu(kk, SC_MOVE, MF_BYCOMMAND) Call DrawMenuBar(.hwnd) End Sub アドバイス頂きたくよろしくお願いします。 以上です。

  • Excel VBAでアプリのウィンドウ名取得

    WindowsXP, Excel2007で、ExcelからIE8にキーコードを送りたいです。 ネットで拾った以下のコードにより、 Option Explicit Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" _ (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Function activate_win(win_name As String) As Long Dim hwindow As Long hwindow = FindWindow(vbNullString, win_name) If hwindow <> 0 Then SetForegroundWindow hwindow activate_win = hwindow End Function Call activate_win("ウィンドウ名") Sendkeys "ABC", True のような形で、メモ帳での動作は確認したのですが、 IEだとウィンドウがアクティブになってくれません。 おそらくウィンドウタイトルを間違えているのだと思われますが、 全角半角などを変えてみたりしても、どう見比べてみても間違いがわかりません。 見た目ではわからない、似た文字だが違うということではないかと思っています。 そこで、開いているアプリのウィンドウ名すべてをメモ帳に書き出すような (あるいは任意のアプリにペーストできるようにするような)コードはないでしょうか? よろしくお願いします

専門家に質問してみよう