- ベストアンサー
ExcelVBAで他のアプリのスクロールを操作する方法
- ExcelVBAを使用して他のアプリのスクロールバーを操作する方法について説明します。
- マウス操作のみでスクロールするアプリにおいて、Sendkeysは使用できないため、APIのハンドルを取得してSendMessageを使用します。
- 提供されたVBAコードでは、メモ帳のスクロールを操作しようとしていますが、正常に動作しないようです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 メモ帳の場合は、アプリケーションのウィンドウの下にエディットボックスコントロールが有り、其処で文字列を受け取っているので、エディットボックスコントロールのハンドルを取ってこないといけません。 更に上記の事例は、あくまでもメモ帳の場合ですので、操作対象のアプリケーションのウィンドウ構成如何で、取って来るべきハンドルが異なって来ます。 http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/vb_t02.htm 後、SB_BOTTOMですと、一気に下までスクロールしてしまうので、SB_LINEDOWNやSB_PAGEDOWN等を使用します。参考程度に。 Public Declare Function FindWindowA Lib "User32" (ByVal cnm As String, ByVal cap As String) As Long Public Declare Function FindWindowEx Lib "User32" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChild As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long Public Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Const WM_VSCROLL = &H115 Public Const WM_HSCROLL = &H114 Public Const SB_LINEDOWN = &H1 Public Const SB_TOP = &H6& Public Const SB_BOTTOM = &H7& Sub handle_get() Dim Handle As Long Dim HandleEdit As Long Dim Ap1 As String Ap1 = "a.txt - メモ帳" AppActivate Ap1 Handle = FindWindowA(vbNullString, Ap1) HandleEdit = FindWindowEx(Handle, 0, "Edit", vbNullString) SendMessage HandleEdit, WM_VSCROLL, SB_LINEDOWN, ByVal CLng(0) SendMessage HandleEdit, WM_HSCROLL, SB_LINEDOWN, ByVal CLng(0) End Sub
お礼
machongolaさま 早速のご回答ありがとうございます! >エディットボックスコントロールのハンドルを取ってこないといけません それが足りなかったのですね。やっと分かりました。メモ帳では無事スクロールできました! ご紹介いただいたリンク先の情報も参照していたのに、 実際の操作対象のアプリだと、FindWindowExを通すと、0が返って来てしまっていたため、削除していました。お手間おかけしました。 実際のアプリでは、キャプション名からウィンドウクラス名も取得してみたりしていたのですが、 意味不明な記号「AX:XXX:・・・」になってしまっていて、取ってきているハンドルが違うのかもしれません。 方向性的にはあっているように思いますので、もう少しトライしてみます。 ありがとうございました! 要件はご回答いただけましたので、この質問は閉じさせていただきます。 ご親切に回答ありがとうございました。 またの機会がありましたらよろしくお願いいたします。