[三流君] [VBAで楽しく] [VBA IE 操作]
−−> No.163 IE _NewWindow2 別窓で開いたオブジェクトの管理

IE _NewWindow2 別窓で開いたオブジェクトの管理

概要:

Dim WithEvents objNEW_IE As InternetExplorer
でオブジェクト変数を定義して_NewWindow2で新規IEを作成、
Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
    Set objNEW_IE = CreateObject("InternetExplorer.Application")
    Set ppDisp = objNEW_IE  '作ったオブジェクトを代入
    objNEW_IE.Visible = True
End Sub
下記のように、作成したIEのイベント(ここでは読み込み完了)で処理したサンプルです
Private Sub objNEW_IE_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    MsgBox "あたらしく開かれたURLは" & URL
End Sub

※メルマガ記事ではオブジェクトの参照設定をしていませんができれば、下記を参考に参照設定してください。
[Microsoft Internet Controls,Microsoft HTML Object Library を参照設定する](このほうが開発時、操作時に楽)
また、VistaとIE7の場合は、 [IE7 操作 Vistaで失敗]も参考にしてください。

リンク 分類: [Document(文章)からデータを取得] / [Form入力処理] / [Linkリンク情報] / [Image画像情報] / [Frameフレーム処理] サンプル: [IEを使ったVBAのサンプル] / [小さなVBAでIE操作のコード]

メルマガ発行内容

やっと、下記、メルマガで発行した内容です。何かの参考となれば幸いです。
過去のメルマガ[IE操作系の記事一覧]もヨロシクです。

IE _NewWindow2 別窓で開いたオブジェクトの管理

どうも、三流プログラマーのKen3です。

今回は、
リンクを右ボタンで新しいウインドウで開く
や
Target=_Blank
など
親ウインドウから子供のウインドウが開かれた時の管理について少し書きます。

IE操作で、何かの参考となれば、幸いです。

/* * 1.今回のキッカケ */

右ボタンなどを押して、新しいウインドウをユーザーの意思で開くことができます。 まぁ、マルチにウインドウを開いて処理を行う、普通のことなのですが、 Webコントロールをフォームに貼ったりして作業していると、 自分(自作プログラム)の配下から離れてしまいます。 そんなことをさせなかったり、 されても、作られたオブジェクトを追ってみたいと思います。 WebBrowser1 とWebのコントロールを作ります。 WebBrowser1_NewWindow2で、新しいウインドウが開かれた時のイベントを受取れます。 これを使用してみます。

/* * 2.新しいウインドウが開く時に発生するイベント_NewWindow2 */

新しいウインドウが開かれると発生するイベントがあります。 IE アプリケーションのイベントを横取りする http://www.ken3.org/vba/backno/vba108.html で、少し、_NewWindow2とWithEventsについて書いてあります、 こちらも合わせて確認してください。 WebBrowserコントロールをフォームに貼り、 下記のプログラムを記述し テストで、初期ページを表示させ、どこかのリンクで新しいウインドウを開きます。
Private Sub UserForm_Initialize()
    Me.WebBrowser1.GoHome  '初期ページを表示する
End Sub
Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
    '新しいウインドウが開かれた時に呼ばれる。
    If MsgBox("新しいウインドウを開きますか?", vbYesNo) = vbYes Then
        Cancel = False    'Yesの時はキャンセルしない
    Else
        Cancel = True     'NOの時は新しいウインドウを開かない
    End If
End Sub
開かれると、_NewWindow2が呼ばれます。 ここでは、 引数のキャンセルの動きと関数の呼ばれるタイミングをチェックしたかったので、 MsgBox("新しいウインドウを開きますか?", vbYesNo) とメッセージ表示後、Yes,Noを判断して、 Cancelの動きをチェックしてみました。 Cancel = Trueとすると、新しいウインドウのオープンをキャンセル(中止)できます。 下記のように、必ず開かせない、そんなこともできます。
Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
    Cancel = True     '必ず新しいウインドウを開かない
End Sub

/* * 3.IE 新しいウインドウを作り オブジェクトを横取り */

開くタイミングはわかったけど、やりたいのは開かれた新規IEの管理でしょ。 作られたウインドウを自分で管理したいと思います。 ※自分でオブジェクトをコントロールしたいんです。 まず、Dim WithEvents で 変数を作成します。 下記、簡単なテストプログラムです。 Dim WithEvents objNEW_IE As InternetExplorer
Private Sub UserForm_Initialize()
    Me.WebBrowser1.GoHome  '初期ページを表示する
End Sub
Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)

    Set objNEW_IE = CreateObject("InternetExplorer.Application")
    Set ppDisp = objNEW_IE  '作ったオブジェクトを代入

    objNEW_IE.Visible = True

End Sub
Private Sub objNEW_IE_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    MsgBox "あたらしく開かれたURLは" & URL
End Sub
ポイントは、まず、 Dim WithEvents objNEW_IE As InternetExplorer と、イベントを横取りできるようなオブジェクトの入れ物を定義します。 次に、 WebBrowser1_NewWindow2 の新規ウインドウが開かれた時に発生するイベント内で、 Set objNEW_IE = CreateObject("InternetExplorer.Application") と、 新しいIEを自分で作成し(Createして)、Dim WithEventsで定義した変数に代入します。 次に、その変数を Set ppDisp = objNEW_IE '作ったオブジェクトを代入 に代入します。 この代入で、新しいウインドウ=作られたウインドウになります。 あとは、 objNEW_IE.Visible = True で見えるようにしました。 テストで、 新しく開かれたウインドウの読み込み終了のイベント_DocumentCompleteで、 URLを表示させてみました。
Private Sub objNEW_IE_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    MsgBox "あたらしく開かれたURLは" & URL
End Sub

/* * 4.応用して、新規ウインドウのソースを表示してみた */

開かれたウインドウ(新規IE)のオブジェクトの取得ができました。 取得と言うよりも、自分で作成したオブジェクトを使った、そんな感じです。 ここから、 データ入力後に、新規のウインドウが開く、Webシステムに対応したい ので、とっかかりとして、新しく開いたIEのソースを表示してみます。 前回の広告コード作成と合わせて、本の紹介コードを作ってみます。 起動のソースは、前回のままです。 ここでは、フォームに設置したWebのコントロールに対して、 .Navigate2でページ移動、 .Documentに対してデータをセットして、 .Navigate2 "JavaScript:parts('B')"でJavaScriptを起動してます。
Private Sub btnRUN_Click()

    Dim time10  As Date

    '広告作成ページに飛ぶ
    Me.WebBrowser1.Navigate2 "http://books.rakuten.co.jp/afvc/afinfo/page03.html"

    '2秒表示を強制的に待つ
    time10 = DateAdd("s", 2, Now())
    Do While True
        DoEvents
        If time10 < Now() Then Exit Do
    Loop

    '表示完了を待つ
    While Me.WebBrowser1.Busy = True _
           And Me.WebBrowser1.ReadyState <> READYSTATE_COMPLETE
        DoEvents
    Wend

    'データをセットする
    Me.WebBrowser1.Document.parts.isbn.Value = Me.txtISBN.Text
    Me.WebBrowser1.Document.parts.sid.Value = Me.txtSID
    Me.WebBrowser1.Document.parts.pid.Value = Me.txtPID

    'JavaScriptを起動する(リンクで飛ぶように見せかけるの?)
    Me.WebBrowser1.Navigate2 "JavaScript:parts('B')"

End Sub
こんな感じで、IE新規ウインドウが開き、ソースの表示までいきました。 さてと、開いたウインドウから、テキストデータをGetしないとね。 新しく開いたウインドウを管理化に置きたいので、 '自分で新規のウインドウをコントロールしたいので、 Dim WithEvents objNEW_IE As InternetExplorer とイベントを取れるオブジェクト型のグローバル変数を1つ作成します。 次に、フォームに貼った、 webのコントロールで、新しいウインドウが開かれた時に、 開くウインドウに勝手に自分で作成したオブジェクトをセットします。 '新しいウインドウを開くイベントをチェックする
Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)

    '新しいウインドウを自分の管理下に置きたいので、オブジェクトを代入してあげる
    Set objNEW_IE = CreateObject("InternetExplorer.Application")
    Set ppDisp = objNEW_IE   '作ったオブジェクトを代入

    objNEW_IE.Visible = True '念のため見えるようにする

End Sub
こんな感じで、WebBrowser1コントロールの_NewWindow2のイベントで、 自分で新たに作成したIEオブジェクトをグローバルに代入、 さらに、 Set ppDisp = objNEW_IE と 新しく開くウインドウにも指定します。 すると、新しく開かれたIE=自分の管理化のobjNEW_IE変数となります。 あとは、 Dim WithEvents objNEW_IE As InternetExplorer とイベントを取れる宣言しているので、 テストで、URLとソースを表示してみました。 '新しく作成したウインドウが読み込まれたら、処理したいので、
Private Sub objNEW_IE_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    MsgBox "あたらしく開かれたURLは" & URL
    MsgBox "HTMLソースは" & objNEW_IE.Document.all(0).innerhtml
End Sub
こんな感じで、JavaScriptで新しく開かれたIEのソースを取得できそうです。 なんて書いてますが、 実行してみるとわかりますが、 objNEW_IE_DocumentComplete のイベントが2回走ってます。 ここも細工して、広告コードを取得したら、 自動的にウインドウをクローズまで持っていきたいです。 ※進みオセェ、、、ハヤク作れよな。

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

ポイントは、 ^^^^^^^^^^^^ 新規のウインドウが開かれる時発生するイベントで、 自分が生成したオブジェクトを代入することです。 http://www.ken3.org/p/2/o20040522.lzh に webdataset2.xlsが圧縮されてます。 処理が中途半端ですが、テストしてみてください。 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 三流プログラマー Ken3でした。

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

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

[三流君 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へ]