概要: 'シェルのオブジェクトを作成する Set objShell = CreateObject("Shell.Application") ここから、ウインドウの数だけまわし、起動中のIEを探してみました。 For Each objWindow In objShell.Windows Debug.Print "タイプは:" & TypeName(objWindow.document) 'HTMLDocumentだったら If TypeName(objWindow.document) = "HTMLDocument" Then 'オブジェクトを代入する Set objIE = objWindow nFLG = True '見つけたよ Exit For '初めに見つけたオブジェクトを代入 End If Next ※メルマガ記事ではオブジェクトの参照設定をしていませんができれば、下記を参考に参照設定してください。 [Microsoft Internet Controls,Microsoft HTML Object Library を参照設定する](このほうが開発時、操作時に楽) |
2017/08/08 追記:下記解説動画も参考に、Excel UserFormで起動済みIEを探し処理する方法です
解説とサンプルzipファイルは[Excel Formから起動済みのIEを選択 Bodyの値を取得するテスト]を参考にしてください。
リンク 分類:
[Document(文章)からデータを取得]
/ [Form入力処理]
/ [Linkリンク情報]
/ [Image画像情報]
/ [Frameフレーム処理]
サンプル:
[IEを使ったVBAのサンプル]
/ [小さなVBAでIE操作のコード]
やっと、下記、メルマガで発行した内容です。何かの参考となれば幸いです。
過去のメルマガ[IE操作系の記事一覧]もヨロシクです。
<TypeNameとShell.Applicationを使い起動済みのIEを探す>
どうも、三流プログラマーのKen3です。 今回は、 起動しているIEを探してみます。 今回の、サンプルファイルは、 http://www.ken3.org/vba/lzh/vba156.lzh にvba156.xls(Excel2000版)が保存されています。 ※IEを起動したり、テストでファイルエクスプローラーを立ち上げたりして 遊んでみてください。 関連項目、 VBAでInternetExplorer.Applicationを操作する(IE操作) http://www.ken3.org/cgi-bin/group/vba_ie.asp もヨロシクね。/* * 1.今回のキッカケ */
VBA系の掲示板 http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi で、 ---- excelvbaでIEを立ち上げて、ビジーかどうかを取得する方法はわかりましたが、IE のサブウィンドウがビジーかどうかを取得し、サブウィドウが表示されるまで待つ 、というのを作りたいんですがどうするのでしょう。 サブウィンドウのIDを取得してから Do While objIE.Busy = True DoEvents Loop とするのでしょうか。 サブウィンドウのIDはどう取得するのでしょう。 ---- と、質問をいただきました。 う〜ん、、、どうするんだろう? いままで、CreateObjectを使って新規にIEを起動したり、 例)IEのオブジェクトを作成 Dim objIE As Object 'IEオブジェクト参照用 'インターネットエクスプローラーのオブジェクトを作る objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True '見えるようにする(お約束) や、 フォームにWEBのコントロールを貼ったりして、IEをコントロールしてました。 自分のプログラムからオブジェクトを作成して、目的の動作、作業を行っていました。 ^^^^^^^^^^^^^^^^ 今回の開いた別IEを参照したい や よくある話で、IEでwebページを見ていたら、 ツールを起動して、作業したい、そんな要望もあると思います。 ※データをgetするツールを作ったとして、 自分のフォームや自分の起動したIEだけじゃなくて、 既に起動済みのIEに対して、何か処理を行いたい・・・など。/* * 2.Shell.Applicationのウインドウをループで探る */
googleで探ると、いろいろと方法ありそうです。 チョット目を引いたのが、 Shell.Applicationのウインドウをループで探しているプログラムでした。 IEとShellは密接な関係があるのか?一部なのか? Shell.ApplicationからIEを探すことが出来るみたいです。 http://www.microsoft.com/JAPAN/developer/library/jptech/msdnnews/web.htm を見ると、なんとなく、そんな感じもしなくも無く (記事はフォルダーのカスタマイズで関係ない記事なんですが、) Shellが持っている(管理している)ウインドウを表示する。
Sub aaa() 'オブジェクトを格納する変数 Dim objShell As Object, objWindow As Object 'シェルのオブジェクトを作成する Set objShell = CreateObject("Shell.Application") 'ウインドウの数だけまわすぞ For Each objWindow In objShell.Windows 'TypeNameでオブジェクト変数のタイプを表示する MsgBox "タイプは:" & TypeName(objWindow.document) Debug.Print "タイプは:" & TypeName(objWindow.document) Next Set objShell = Nothing End Sub |
Sub aaa() 'オブジェクトを格納する変数 Dim objShell As Object, objWindow As Object 'シェルのオブジェクトを作成する Set objShell = CreateObject("Shell.Application") 'ウインドウの数だけまわすぞ For Each objWindow In objShell.Windows 'TypeNameでオブジェクト変数のタイプを表示する MsgBox "タイプは:" & TypeName(objWindow.document) Debug.Print "タイプは:" & TypeName(objWindow.document) 'HTMLDocumentだったら If TypeName(objWindow.document) = "HTMLDocument" Then 'URLとタイトルを表示する MsgBox "IEみつけたよ" & objWindow.document.Title Debug.Print "タイトル:" & objWindow.document.Title Debug.Print "URL:" & objWindow.document.URL End If Next Set objShell = Nothing End Sub |
Sub bbb() 'オブジェクトを格納する変数 Dim objShell As Object, objWindow As Object Dim objIE As Object '見つけたか判断用のフラグ Dim nFLG As Boolean nFLG = False 'シェルのオブジェクトを作成する Set objShell = CreateObject("Shell.Application") 'ウインドウの数だけまわすぞ For Each objWindow In objShell.Windows Debug.Print "タイプは:" & TypeName(objWindow.document) 'HTMLDocumentだったら If TypeName(objWindow.document) = "HTMLDocument" Then 'オブジェクトを代入する Set objIE = objWindow nFLG = True '見つけたよ Exit For '初めに見つけたオブジェクトを代入 End If Next Set objShell = Nothing 'フラグをチェックして、ページに飛ばす If nFLG = True Then 'テストで日記ページに飛ばす objIE.Navigate "http://blog.melma.com/00034126/" '↑いつものように、使えることを確認 If MsgBox("確認 IEを.QUITで閉じますか?", vbYesNo) = vbYes Then objIE.Quit '.quitメソッドを使ってみた End If Else MsgBox "IEのオブジェクトを見つけられなかったです" End If End Sub |
document.URLで一致するIEを判断して、使用してみました。
ソースコードと簡単な解説は [XXXXさんへ 起動済みIE、操作済み、既存の表示済みWEB画面を操作したい]を見てください
>NO156を参考にさせていただき、起動済みのIEを探して、順にすべてをQUITし、新しくIEを立ち上げたいのですが、 >すべて処理(QUIT)する前にループを抜けてしまいます。 >ちなみにIE数を確認しているかmsgboxで確認したのですが、起動分数えていました。(ほとんどパクっているので当然ですよね・・・すんません。) >Private Sub CommandButton1_Click() > Set objShell = CreateObject("Shell.Application") > For Each objWindow In objShell.Windows > Set objIE = objWindow > MsgBox "確認" & objIE > objIE.Quit > Next > 'Set objShell = Nothing > >Set objIE = CreateObject("InternetExplorer.application") > objIE.Visible = True >話がうまくまとめられず申し訳ないのですが、msgboxで確認した起動数と、 >数えているはずなのに処理せず抜けてしまう矛盾に疑問を感じ質問したしだいです。 For Each objWindow In objShell.Windows のループで、中身がリアルタイムに変わっていくと (ここでは、ループの中で .Quit してます。) うまく全てを取れないみたいです。 ↓Debug.Print objShell.Windows.Count を 入れてみました。 これで、確認してみてください。
|
|
三流解説を読んでいただき、どうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。
[三流君 VBAでWebBrowser IEを操作する] / [三流君 VBAで楽しくプログラミング] / [AB型の変わり者 三流プログラマー Ken3 三流君Top]
大分類:[Document.Forms(入力処理)]
/ [Document.Links(リンク情報)]
/ [Document.Images(画像情報)]
/ [Document.Frames(フレーム処理)] | |
F1でヘルプを見たり、デバック時にDebug.Print使ったり、イミディエイト ウインドウで簡単な確認したり。 項目別に↓にプログラマーの本音?それとも建て前?的な記事をまとめました。お探しのジャンルを選択してください。 項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。 Excel関係: Access関係: その他:VBAの共通関数やテキストファイルの操作など Blog:[三流君の作業日記]/
[objIEを使用したサンプルコードを見る]/
広告-[通販人気商品の足跡] |
三流プログラマーのKen3 が 皆さんの質問にお答えします
と カッコつけて言っても、実力不足ですべての質問に回答することはできないのが現実なのですが、できる範囲で 三流的な逃げ手 や 解決方法 を探します(回答します)。
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。