VBAでアクティブなIEを操作する方法

このQ&Aのポイント
  • VBAでIEを操作しようとしているが、アクティブなデスクトップ上のIEを操作する方法がわからない。
  • Hwndプロパティが読み取り専用のため、ハンドルから操作するIEを指定できない。
  • VBAでアクティブなIEを操作する方法、および代案があれば教えてほしい。
回答を見る
  • ベストアンサー

VBAでアクティブなIEを操作

現在VBAでIEを操作しようとしております。 URLやタイトルから指定してIEを操作することはできるようになりました。 今度はデスクトップの最善面にあるIEを操作したいと考えています。 下記を参考にして考えていますが、Hwndプロパティが読み取り専用らしく ハンドルから操作するIEを指定することができません。 http://okwave.jp/qa/q2147057.html そもそもVBAで可能なのかについても よく分からないのですが、恐れ入りますが代案を含め方法があれば教えてください。 ひとまず、煮詰まっていますが、 今残っているコードを載せておきます。 Public Declare Function GetForegroundWindow Lib "user32" () As Long ’--------------- Sub shell_test() Dim objie As Object Dim a as long Set obj = CreateObject("shell.application") a = GetForegroundWindow Debug.Print a End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.3

ShellWindowsで列挙してGetForegroundWindowが返すハンドルと一致するかで判別するとか。 Dim o As New SHDocVw.ShellWindows Dim ie As InternetExplorer For Each ie In o If ie.Hwnd = GetForegroundWindow Then '何か処理 Exit For End If Next お望みのハンドルからIEオブジェクトを得るには、 >GetForegroundWindow がIEFrameなら、その子孫ウィンドウのInternet Explorer_Serverに対して WM_HTML_GETOBJECTメッセージを送信すればHTMLDocument2オブジェクトが得られるので parentWindowプロパティが返すIHTMLWindow2オブジェクトを IUnknown_QueryService APIの第一引数に指定して、 第二、第三引数はIID_IWebBrowser2を指定すれば第四引数でIEオブジェクトが得られます。

その他の回答 (2)

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.2

URL指定で参照の取得は出来ます。 'Microsoft Internet Controlsに参照設定 Const url = "https://www.google.co.jp/?gws_rd=ssl" Dim o As New SHDocVw.ShellWindows Dim ie As Object Set ie = o.FindWindowSW(url, Empty, 1, 0, 1)

momomo100
質問者

お礼

非常に参考になりました。ありがとうございます。 同じURLのページを複数開いていることが多く、 その場合意図したページとは違う参照が入ってしまうことがありました。。。

回答No.1

>そもそもVBAで可能なのかについても この手の質問する方は、プログラミングを甘く見ている方に多い。一つの事柄を覚えれば、すべて理解してしいると、誤解する。特にネット関連の知識を保有している方に多い。 まず、「オブジェクト指向のプログラミング」を勉強しよう。すでに30年前から言われ、20年前ぐらいから実用化した技術だ。50歳以上の方にはなじみが薄い技術だ。 どこかの馬鹿が、「オブジェクト指向」とはクラスライブラリーの作成と操作だ! と定義した馬鹿者がいるが、確かにそれは一部だた、本筋ではない。 「オブジェクト指向」と共に発達したのがカプセル化であり、API、SPI、インターフェースの開発、そしてフレームワークと言われる究極的なカプセル化及び標準化技術だ。 これらは表裏一体であり、きっても切れない関係にある。 >今度はデスクトップの最善面にあ 本題だが、 >Set obj = CreateObject("shell.application") これって、何を意味するか、分析しましたでしょうか? これがちゃんと意味がわかれば、こんな質問はしないはずです。そこから勉強しよう。 ヒントとしては、 ”shell.application” でぐぐってみれば、すぐに、わかるはずです。下記は検索例です https://www.google.co.jp/search?q=%E2%80%9Dshell.application%E2%80%9D+%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9+%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88&oq=%E2%80%9Dshell.application%E2%80%9D%E3%80%80%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9%E3%80%80%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88&aqs=chrome..69i57.9686j0j7&sourceid=chrome&es_sm=122&ie=UTF-8 この結果から http://answers.microsoft.com/ja-jp/windows/forum/windows_7-windows_programs/shellapplication%E3%82%AA%E3%83%96%E3%82%B8/6c64c414-1f46-45c1-88c9-0df18574504 を見ると http://msdn.microsoft.com/ja-jp/library/cc422072.aspx 本家の解説のページに突き当たる。この解説のTOPが http://msdn.microsoft.com/ja-jp/library/hh846418(v=vs.85).aspx であることがすぐわかるはず。そこのタイトルは「Windows Shell」となっている。そのシェルの意味は https://www.google.co.jp/search?q=Shell%E3%81%A8%E3%81%AF&oq=Shell%E3%81%A8%E3%81%AF&aqs=chrome..69i57.28641j0j7&sourceid=chrome&es_sm=122&ie=UTF-8 でわかるはず。一般的な意味だが、その意味を踏襲して、「Windows Shell」と言うソフトの名前になっている。つまりWindowsのシェルはエイクスプローラーって事になる。元の意味とは離れているが、CUI中心からGUIになってから、ユーザー操作の窓口がエクスプローラと言う意味では、Shellとなずけてもおかしくは無い。 そのソフトのインターフェースはC++ C#等に提供されるAPIとともに、COMとしても提供されている。このCOMインターフェースを使う事によって、COMに対応しているスクリプトエンジンからでも使えるようになっている。 それが、オブジェクト指向の真髄でしょう。オブジェクト化というカプセルかで(いわゆるブラックボックスで中身は、エンドユーザーが知らなくてもいい)、インプットとアウトプットがわかるだけで、いいわけだ。 Javaだと、もっと深くカプセルかしてフレームワークが提供されている。 エンドユーザーの、プログラマーは、その中身を知る必要が無い。INとOutだけ(リファレンスなどの仕様書)さえ見て組み立てればいいだけ。 >今度はデスクトップの最善面にあ 上記、リファレンスサイトを見れば、すぐに見つかるはず。このようなリファレンスサイトになれるのも、修行のうち。なれれば、ここに質問する事もなくなるはず。 何度でも繰り返して質問する方は、才能がないので、はやく足をあらったほうがいいでしょう。

momomo100
質問者

お礼

貴重なご意見ありがとうございます。 おっしゃる事はごもっともです。精進させていただきます。

関連するQ&A

  • Excel VBAでIE「ダウンロードの表示」生成

     Internet Explorer で、「ダウンロードの表示」のDialogウィンドウをショートカット(Ctrl + J )を使って表示させたいのですが、Excel VBA で以下のコードで試したのですが、うまくいきません。どういうコードを書いたらよいのでしょうか?アクセスキーを使った方法では、「ツール」で N  に該当するのが「ダウンロードの表示」と「Send To Note」の2つあって起動できません。  よろしくお願いします。 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds 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 Const WM_KEYDOWN = &H100 Public Const WM_KEYUP = &H101 Public Const VK_CONTROL = &H11 Public Const VK_J = &H4A Public Const navOpenInNewTab = &H800 Sub Test() Dim objIE As Object Dim hWnd_objIE As Long Dim Ret As Long 'IE起動 Set objIE= CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.navigate "https://www.google.co.jp/", navOpenInNewTab Do While objIE.Busy = True Or objIE.readyState <> 4 DoEvents Loop 'objIEのhWnd取得 hWnd_objIE = objIE.hwnd 'IEの親ウィンドウのhWnd取得する 'hWnd_objIE のウィンドウにPostMessageする Ret = PostMessage(hWnd_objIE, WM_KEYDOWN, VK_CONTROL, 0) Ret = PostMessage(hWnd_objIE, WM_KEYDOWN, VK_J, 0) Sleep 100 Ret = PostMessage(hWnd_objIE, WM_KEYUP, VK_CONTROL, 0) Ret = PostMessage(hWnd_objIE, WM_KEYUP, VK_J, 0) End Sub

  • エクセルマクロでIE操作

    IEをエクセルマクロで操作する際に現在は下記のようなコードで立ち上げでいます。 この時、1回目の処理が終わり、もう一度同じボタンを押してコードを実行する際 あたにIEが立ち上がってしまいます。 同じURLのIEがすでに立ち上がっている際には そのIEを利用して処理を行うにはどのようにしたらよいでしょうか? ption Explicit 'Sleepを使用する場合のお約束 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Declare Function CloseWindow Lib "User32" (ByVal hwnd&) As Long Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Long) As Long Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Dim objIE As Object '変数を定義 Dim Obj As Object '変数を定義 Sub 間接() 'IEテストする。 Dim txtSelect As HTMLSelectElement Dim objTAG As Object 'IEの起動 Dim objIE As Object '変数を定義します。 Set objIE = New InternetExplorerMedium objIE.Visible = True '可視、Trueで見えるようにします。 '処理したいページを表示します。 objIE.Navigate "https://www.google.co.jp/?gws_rd=ssl" Sleep (1000) Do While objIE.ReadyState <> 4 'サイトが開かれるまで待つ(お約束) Do While objIE.Busy = True 'サイトが開かれるまで待つ(お約束) Loop Loop

  • VBAでIE操作をするサンプル

    VBAでIE操作をするサンプルをネットでいくつか見ているのですが Sub Sample1() Dim objShell As Object Dim objIE As New InternetExplorer Set objShell = CreateObject("Shell.Application") objIE.Visible = True objIE.Navigate "http://www.yahoo.co.jp/" Set objIE = Nothing Set objShell = Nothing End Sub Sub Sample2() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.Navigate "http://www.yahoo.co.jp/" Set objIE = Nothing End Sub ではどちらを使った方がいいのでしょうか? 圧倒的にSample2の方がネットでは多いのですが Sample1のやり方もあることを知りました。 Sample1の方法でブラウザを開くメリットはあるのでしょうか?

  • vbaでIEの操作

    こんばんは。やりたいことができないので教えてください。 vbaで指定のurlを開きたいです。 エクセル2003とIE8です。 Sub test001() Dim ObjIE As Object Set ObjIE = CreateObject("InternetExplorer.application") ObjIE.Visible = True ObjIE.navigate "http://jp.msn.com/" Do While ObjIE.Busy = True '表示させるまで待つ DoEvents Loop End Sub これでIEを立ち上げてURLを開けるのですが これでは新しいウインドウで開いてしまいます。 現在IEを立ち上げていて、上記のコードを実行すると 新たなタブで開きたいですが解決策はありますか? ObjIE.Visible = True が原因かと思い、これを抜かしてみましたが そうすると何も起こりません。 VBAで既に開いているIEの新しいタブでURLを開く方法をご教授ください!よろしくお願いします。

  • VBAからIEの操作

    グーグルをIEで開いてVBA(語句)を検索して見終わったら IEを閉じる作業をしたいのですが、検索窓にVBA(語句)を 入力するところでエラーとなります。初心者ですが、なんとか 勉強したいのでよろしくお願いいたします。 Sub ie_test_Navigate() Dim objIE As Object Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.Navigate "http://www.google.co.jp/" IE.document.all.q.Value = "VBA" IE.document.all.btnG.Click If MsgBox("IEを閉じますか?", vbYesNo, "終了確認") = vbYes Then objIE.Quit End If Set objIE = Nothing End Sub

  • VBAIE操作 IEを最大化するには?

    いつもお世話になっております。 エクセルを使ってIEのブラウザを立ち上げて そのブラウザを最大化したいのですがうまくできません。 --------------------------------------------------------- Private Declare Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function ShowWindow Lib "USER32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long Sub test() Dim objIE As Object Dim ieHwnd As Long ieHwnd = FindWindow("IEFrame", vbNullString) 'IEのウィンドウハンドル取得 Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate "http://www.ocn.ne.jp/" objIE.Visible = True '意味なし Do While objIE.Busy = True Or objIE.ReadyState <> 4 DoEvents Loop '意味なし Application.Wait Time:=Now + TimeValue("00:00:01") Call ShowWindow(ieHwnd, 3) '最大化 Set objIE = Nothing End Sub --------------------------------------------------------- をF5で実行するとブラウザは立ち上がりますが、最大化されません。 しかし、 Call ShowWindow(ieHwnd, 3) '最大化 の部分にブレークポイントを設置して、 一度止めてF5を押して実行すると、ちゃんと最大化されます。 きちんと最初から最後までF5で実行してブラウザを立ち上げ最大化したいのですが どうすればいいでしょうか? ご回答よろしくお願いします。

  • vba IE操作で こういう事ってできない?

    vba IE操作で こういう事ってできないのでしょうか? Dim objIE As InternetExplorer Sub test() Dim myObj As Object Dim myStr As String Set objIE = CreateObject("InternetExplorer.Application") objIE.Navigate "http://employment.en-japan.com/search/search_list.cfm?area=23&startRow=1&m=1&job=100000" objIE.Visible = True Call iewait For Each myObj In objIE.Document.all.tags("a") If myObj.outerText = "詳細を見る" Then myObj.Click Call iewait Debug.Print objIE.LocationName objIE.GoBack Call iewait End If Next objIE.Quit Set objIE = Nothing End Sub Sub iewait() Const READYSTATE_COMPLETE As Long = 4 Do Until objIE.ReadyState = READYSTATE_COMPLETE Loop Do While objIE.Busy = True DoEvents Loop End Sub このコードを実行して、 1ページ目の「詳細を見る」をクリックして、2ページ目のタイトルを抜き出し 1ページ目に戻り、次の「詳細を見る」をクリックして、2ページ目のタイトルを抜き出し・・・ と言う処理を繰り返したいのですが、 1回目のmyObj.Clickを通った後(Call iewaitの後かも?)に、 myObjの値が変数なしになってしまい、 2回目のIf myObj.outerText = "詳細を見る" Thenで 書き込みできません。(Error 70) になります。 1ページ目のリンクをクリックして、戻って また1ページ目のリンクをクリックして・・・ と言う処理をしたい場合どうすればよろしいでしょうか?

  • excel VBAの操作について(新しいタブの操作

    excel VBAでIEを操作して、必要箇所に入力後実行ボタンをクリックすると新しいタブで表示された画面をすべてコピーしたいのですが、新しいタブの操作方法が分かりません。分かる方宜しくお願い致します。 Dim objIE As InternetExplorer Set objIE = New InternetExplorerMedium objIE.Visible = true objIE.Navigate “アドレス” ‘IEに入力 Call IEButtonClick(objIE,”実行ボタン”) End sub

  • Excel2003VBAでクリップボードにあるビットマップの操作について

    Excel2003VBAにおいてクリップボードにあるビットマップの画像の任意の1pxの色を、 ペイントのスポイトツールのように取得するマクロを作成したいのですが GetPixelという関数で画像の任意1pxの色を取得できる所までは調べられたのですが、 それをクリップボードの画像で使用することができませんでした。 以下は、GetPixel関数を試してみた時のソースになります。 '------------------------------------------------------------------ Option Explicit Declare Function GetDesktopWindow Lib "user32" () As Long Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long) As Long Sub ピクセル色獲得() Dim hwnd As Long Dim hdc As Long hwnd = GetDesktopWindow() hdc = GetWindowDC(hwnd) Debug.Print Hex(GetPixel(hdc, 100, 200)) End Sub '------------------------------------------------------------------ 上記ソースで任意1pxの色を取得できたため クリップボードの画像の色を取得するマクロを下記のように作成しました。 '--------------------------------------------------------------- Option Explicit Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long) As Long Sub クリップボードピクセル色獲得() Dim CB As Variant Dim i As Long CB = Application.ClipboardFormats Debug.Print Hex(GetPixel(CB, 100, 200)) End Sub '--------------------------------------------------------------- 型が一致しません と言われ動きません。 以上です、よろしくお願いいたします。

  • エクセル VBA で IE操作 

    エクセルVBAにて IEを操作し リンクをクリックするには どのような記述になりますでしょうか? たとえば http://okwave.jp/mypage へアクセスし画面右上 カテゴリ をクリック 次に Excel(エクセル) をクリック という具合に 画面に表示されている文字を順番にクリックしたいです。 マクロを見つけてきましたが クリックというのはどう記述していいやらさっぱりです。 Sub testIE() Dim objIE As InternetExplorer 'IEオブジェクトを準備 Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット objIE.Visible = True 'IEを表示 objIE.navigate "http://okwave.jp/mypage" 'IEでURLを開く Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE '読み込み待ち DoEvents Loop

専門家に質問してみよう