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

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

発行内容

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系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.163を読んだ満足度(評価)は?
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
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列

書籍の購入

Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??

コンピュータ書籍の発送がハヤイ専門店

コンピュータの本・専門店
種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり

amazon.co.jpでキーワード別チェック

下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・