[三流君] [VBAで楽しく] [VBA IE 操作]
−−> No.156 TypeNameとShell.Applicationを使い起動済みのIEを探す

TypeNameとShell.Applicationを使い起動済みのIEを探す

概要:

'シェルのオブジェクトを作成する
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
単純に、 For Each で objShell.Windows を指定して、回し、 初めて使った、TypeName関数で、オブジェクトのタイプを表示してみました。 IEやエクスプローラーを複数起動して、実行すると。 タイプは:IShellFolderViewDual2 タイプは:HTMLDocument タイプは:HTMLDocument タイプは:IShellFolderViewDual2 と、値が取れます。

/* * 3.見つけたObjectに対して、処理を行う */

タイプは:HTMLDocument コイツがアヤシイデス(原稿書いてる今は、確信してるんだけど(笑)) この、オブジェクトに対して、処理を行ってみます。
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
単純に、 TypeName(objWindow.document) = "HTMLDocument" だったら、 .Title や .URL と アクセスしてます。 使いやすいように、1つ変数を用意して、 ~~~~~~~~~~~~~~~~~ 見つけたオブジェクトを代入して、操作することも出来ます。
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
手抜きで、IEを見つけたら、 Set objIE = objWindow と代入後、Exit Forしてますが、実際はURLやタイトルなどで、 目的のIEか?チェックしてください(複数IEが起動しているときを考慮してね) objIEに代入されているので、あとは、いつもの操作を行えばOKです。 好きに操作してください。 objIE.Navigate "http://blog.melma.com/00034126/" なんて感じで、指定ページに飛ばしたり、 objIE.Quit で、閉じたりしてます。

/* * 4.終わりの挨拶 */

今回は、 起動済みのIEをShellアプリケーションから探ってみました。 ポイントは、TypeName関数で、 Shellが持っている(管理している)ウインドウを1つ1つ オブジェクトの名前で判断してるところです。 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 いつも失敗?の負け組のKen3でした。 ~~~~~~~(↑オイオイ)

フィードバック

起動済みIE、操作済み、既存の表示済みWEB画面を操作したい

document.URLで一致するIEを判断して、使用してみました。

ソースコードと簡単な解説は [XXXXさんへ 起動済みIE、操作済み、既存の表示済みWEB画面を操作したい]を見てください

起動しているIEを全て閉じたい。

起動しているIEを全て閉じたい : http://www.youtube.com/watch?v=uQKlDRNm4k8
>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 を 入れてみました。
これで、確認してみてください。

Sub bbb()  'ここで、.Quitで終わらせる。
    Dim objShell  As Object
    Dim objWindow As Object
    Dim objIE     As Object
    
    Set objShell = CreateObject("Shell.Application")
      
    For Each objWindow In objShell.Windows
        Debug.Print objShell.Windows.Count
        Set objIE = objWindow
        MsgBox "確認" & objIE & objShell.Windows.Count
        objIE.Quit
    Next
    Set objShell = Nothing

End Sub
↑、カウンターの減り方が変ですよね。※あっ、そもそも減っちゃまずいのかなぁ。 ※ループ中にobjShell.Windowsの内容が変化してしまうので、 For Each objWindow In objShell.Windows で 順番に取得できないみたいです。 なので、後ろからまわしてみる。そんな処理に変更してみました。
Sub ccc()  'ここで、.Quitで終わらせる。
    Dim objShell  As Object
    Dim objIE     As Object
    Dim n         As Integer
    
    Set objShell = CreateObject("Shell.Application")
      
    '後ろから消してく。
    For n = objShell.Windows.Count To 1 Step -1  'MAXから-1ひいてく感じ
        Set objIE = objShell.Windows(n - 1) 'n番目のウインドウを代入
        MsgBox "確認" & objIE
        objIE.Quit
    Next
    Set objShell = Nothing

End Sub
※objShell.Windows(0)から始まっているので、n-1としてます。 ※※IEだけじゃなくて、C:やD:全てのファイルエクスプローラーも閉じちゃうけど。 疑問は、解決されましたか? 何かの参考となれば、幸いです。

ページフッター リンクや広告、質問送信など

三流解説を読んでいただき、どうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

[三流君 VBAでWebBrowser IEを操作する] / [三流君 VBAで楽しくプログラミング] / [AB型の変わり者 三流プログラマー Ken3 三流君Top]

大分類:[Document.Forms(入力処理)] / [Document.Links(リンク情報)] / [Document.Images(画像情報)] / [Document.Frames(フレーム処理)]
サンプル・例題:[過去のメルマガ記事一覧] / [少し大きなIE操作サンプル] / [小さなコードでIE操作の動作確認]

F1でヘルプを見たり、デバック時にDebug.Print使ったり、イミディエイト ウインドウで簡単な確認したり。
なれると当たり前に操作している方法が↓かなぁ。
[F1ヘルプ マクロ記録ほか]・・・基本のF1を押してヘルプを見る方法など
[実行時エラー、デバッグモード]・・・デバッグの流れを簡単に(ハマった時はツライけど)
[イミディエイト ウインドウ と Debug.Print]・・・プログラム作成時に便利なイミディエイト ウインドウ
[VBA ウォッチ式とSTOPを使ってみた]・・・STOPで止め、ウォッチ式でオブジェクトの中身を確認する方法など
[参照設定のお話]・・・設定すると便利な(設定しないと使えない)、参照設定のお話

項目別に↓にプログラマーの本音?それとも建て前?的な記事をまとめました。お探しのジャンルを選択してください。
[プログラムは心? spirit]・・・プログラマー 心・気質・魂
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話

項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
[VBAでIE ウェブブラウザーを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[MSアクセス から エクセル を呼ぶ Excel.Application]・・・AccessからExcelを操作したりデータの書き出しなどです
[アウトルック メールの操作 Outlook.Application]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[エクセル ユーザーフォームを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[エクセルからアクセスを操作する]・・・ExcelからAccessのマクロを起動してみました、
[エクセル関係 関数、その他]・・・その他Excel関係です

Access関係:
[アクセス ユーザーフォーム/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[アクセス レポート操作]・・・レポートを操作してみました
[アクセス クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[テキストファイルの操作(Open,Close,Print,Input)]・・・普通のテキストファイルを使ったサンプルです

Blog:[三流君の作業日記]/ [objIEを使用したサンプルコードを見る]/ 広告-[通販人気商品の足跡]

質問や要望など メッセージを送る(三流君に連絡する)

三流プログラマーのKen3 が 皆さんの質問にお答えします
と カッコつけて言っても、実力不足ですべての質問に回答することはできないのが現実なのですが、できる範囲で 三流的な逃げ手 や 解決方法 を探します(回答します)。

感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。

あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。



[トップページへ 戻る] / [VBA TOP] / [WebBrowser IEの操作 TOPへ]