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

TypeNameとShell.Applicationを使い起動済みの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でした。 ~~~~~~~(↑オイオイ)

フィードバック

VBA系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.156を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります


ページフッター(リンクや広告など)

[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます


広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列